本篇文章给大家谈谈以太坊geth加速,以及以太坊速度慢对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
为了防止交易重播,ETH(ETC)节点要求每笔交易必须有一个nonce数值。每一个账户从同一个节点发起交易时,这个nonce值从0开始计数,发送一笔nonce对应加1。当前面的nonce处理完成之后才会处理后面的nonce。注意这里的前提条件是相同的地址在相同的节点发送交易。
以下是nonce使用的几条规则:
● 当nonce太小(小于之前已经有交易使用的nonce值),交易会被直接拒绝。
● 当nonce太大,交易会一直处于队列之中,这也就是导致我们上面描述的问题的原因;
● 当发送一个比较大的nonce值,然后补齐开始nonce到那个值之间的nonce,那么交易依旧可以被执行。
● 当交易处于queue中时停止geth客户端,那么交易queue中的交易会被清除掉。
第一个字段 AccountNonce ,直译就是账户随机数。它是以太坊中很小但也很重要的一个细节。以太坊为每个账户和交易都创建了一个Nonce,当从账户发起交易的时候,当前账户的Nonce值就被作为交易的Nonce。这里,如果是普通账户那么Nonce就是它发出的交易数,如果是合约账户就是从它的创建合约数。
为什么要使用这个Nonce呢?其主要目的就是为了防止重复攻击(Replay Attack)。因为交易都是需要签名的,假定没有Nonce,那么只要交易数据和发起人是确定的,签名就一定是相同的,这样攻击者就能在收到一个交易数据后,重新生成一个完全相同的交易并再次提交,比如A给B发了个交易,因为交易是有签名的,B虽然不能改动这个交易数据,但只要反复提交一模一样的交易数据,就能把A账户的所有资金都转到B手里。
当使用账户Nonce之后,每次发起一个交易,A账户的Nonce值就会增加,当B重新提交时,因为Nonce对不上了,交易就会被拒绝。这样就可以防止重复攻击。当然,事情还没有完,因为还能跨链实施攻击,直到EIP-155引入了chainID,才实现了不同链之间的交易数据不兼容。事实上,Nonce并不能真正防止重复攻击,比如A向B买东西,发起交易T1给B,紧接着又提交另一个交易T2,T2的Gas价格更高、优先级更高将被优先处理,如果恰好T2处理完成后剩余资金已经不足以支付T1,那么T1就会被拒绝。这时如果B已经把东西给了A,那A也就攻击成功了。所以说,就算交易被处理了也还要再等待一定时间,确保生成足够深度的区块,才能保证交易的不可逆。
Price 指的是单位Gas的价格,所谓Gas就是交易的消耗,Price就是单位Gas要消耗多少以太币(Ether),Gas * Price就是处理交易需要消耗多少以太币,它就相当于比特币中的交易手续费。
GasLimit 限定了本次交易允许消耗资源的最高上限,换句话说,以太坊中的交易不可能无限制地消耗资源,这也是以太坊的安全策略之一,防止攻击者恶意占用资源。
Recipient 是交易接收者,它是common.Address指针类型,代表一个地址。这个值也可以是空的,这时在交易执行时,会通过智能合约创建一个地址来完成交易。
Amount 是交易额。这个简单,不用解释。
Payload 比较重要,它是一个字节数组,可以用来作为创建合约的指令数组,这时每个字节都是一个单独的指令;也可以作为数据数组,由合约指令来进行操作。合约由以太坊虚拟机(Ethereum Virtual Machine,EVM)创建并执行。
V、R、S 是交易的签名数据。以太坊当中,交易经过数字签名之后,生成的signature是一个长度65的字节数组,它被截成三段,前32字节被放进R,再32字节放进S,最后1个字节放进V。那么为什么要被截成3段呢?以太坊用的是ECDSA算法,R和S就是ECSDA签名输出,V则是Recovery ID。
R,S,V是交易签名后的值,它们可以被用来生成签名者的公钥;R,S是ECDSA椭圆加密算法的输出值,V是用于恢复结果的ID

挂着服务器同步以太坊区块,到400万block以后老是挂。我也是够虎逼的,其实第一次geth挂的时候看到了服务器打出来“Killed” ,我无视了 继续挂着搞。到后面就是几分钟挂一次,我手动重启也搞烦了,索性写了个定时任务1分钟检查一次geth进程挂了没有,挂了拉起了续命。好了,就是这个强行续命,搞得我后面几天都在错误的方向挣扎。
强行续命,还真把区块同步续到了99%(差不多), 但是到了这里,currentBlock开始不动了,knownStates每次一挂重启就变成0再看着knownStates慢慢涨到100万左右又挂,又续命重启变成0 无限循环。。。
经过上面geth一系列捣蛋的跳数字,去geth的issue里面看,发现还真不少和我一样问题的。照着里面有人的方法都失败了。
只有自己来了
从哪开始异常的? 刚开始我以为killed是geth自己输出的, 思考了一下:这好像是kill 进程的输出。。。 然后:cat /var/log/message |grep geth。
尼玛,原来真是触发OOM了。日了狗了, 我同事还给我说人在树莓派上都能装上, 我这几天都怀疑人生了。
问题找到了,内存不够,两种方案 1. 换台高配机器 2. 划分/扩充swap分区(用来放内存溢出的)
我选2:
1. 先看看已经存在的swap分区(有可能什么没有: sudo swapon --show
2. 看下哪里空间够:df -lh
3. 我选的根目录创建一个1G文件: sudo fallocate -l 1G /swapfile
4. sudo mkswap /swapfile
5.使用:sudo swapon /swapfile
6.看看生效没:sudo swapon --show 和 free -h
对了,我的geth版本是1.7.0, 因为 1.7.3/2/1我都试遍了。
没了,不提。
Ping工具通过发送ICMP报文Echo Request到目的主机进行延迟测量。 缺点 :现代网络广泛使用防火墙,导致ICMP数据包被拦截过滤,通过Ping命令无法获得延迟信息。
p.s. python库为ping3
TCPtraceroute工具使用TCP协议。许多情况下,防火墙会准许反向TCP数据包通过防火墙到达指定端口。通过发送TCP SYN数据包来代替UDP或者ICMP应答数据包,tcptraceroute可以穿透大多数防火墙。 缺点 :对于未开放端口或者开放端口号未知的IP地址,只能使用默认端口进行探测,使用最后一跳的延迟作为近似值。
p.s. python库为scapy
TCP数据包时间戳选项可以用来精确的测量RTT。RTT = 当前时间 - 数据包中Timestamp选项的回显时间。这个回显时间是该数据包发出去的时间,知道了数据包的接收时间(当前时间)和发送时间(回显时间),就可以计算RTT的一个测量值。
p.s 参考
TCP本身并不提供及时的断线检测,心跳包就是用来及时检测是否断线的一种机制,通过每间隔一定时间发送心跳数据,来检测对方是否连接,属于应用程序协议的一部分。例如,以太坊Geth客户端默认每15s通过ping-pong发送一次心跳包。通过ping的发送时间和pong的到达时间,即可估测两个主机之间的网络延迟。
p.s. 以太坊通信协议参考
1、打开控制台
F:\Gethgeth --datadir "data" console
2、查看目前所拥有的账户列表
eth.accounts
["0xf4fb90bd8713491d62778d0a46f8f6b83b98ed91"]
3、新建账户
personal.newAccount('123456')
"0x1dfa2d1d645e45f5d77025f63b73c8efed9a8240"
4、查看目前所拥有的账户列表
eth.accounts
["0xf4fb90bd8713491d62778d0a46f8f6b83b98ed91", "0x1dfa2d1d645e45f5d77025f63b73c8
efed9a8240"]
5、查看账户余额
eth.getBalance(eth.accounts[0])
665000000000000000000
eth.getBalance(eth.accounts[1])
6、定义变量
var acc1=eth.accounts[0]
undefined
acc1
"0xf4fb90bd8713491d62778d0a46f8f6b83b98ed91"
var acc2=eth.accounts[1]
undefined
acc2
"0x1dfa2d1d645e45f5d77025f63b73c8efed9a8240"
7、转账
eth.sendTransaction({from: acc1 , to: acc2, value: web3.toWei(10,"ether")})
Error: authentication needed: password or unlock
at web3.js:3143:20
at web3.js:6347:15
at web3.js:5081:36
at anonymous:1:1
(账户被锁报错)
8、解锁账户
personal.unlockAccount(acc1,"123456")
true
9、转账
eth.sendTransaction({from: acc1 , to: acc2, value: web3.toWei(10,"ether")})
INFO [11-14|14:34:24.526] Setting new local account address=0xF4f
b90bd8713491d62778D0a46f8F6B83b98Ed91
INFO [11-14|14:34:24.551] Submitted transaction fullhash=0x98
f8b9bfb5fbaf374c2d18b5c5691b2cfd1250a1cb76337a47146a2afbde8329 recipient=0x1DfA2
d1d645e45f5d77025f63b73C8eFeD9a8240
"0x98f8b9bfb5fbaf374c2d18b5c5691b2cfd1250a1cb76337a47146a2afbde8329"
10、查看账户余额
eth.getBalance(acc1)
665000000000000000000
eth.getBalance(acc2)
11、挖矿
miner.start(1);admin.sleepBlocks(20);miner.stop();
12、挖矿结束查看账户余额
eth.getBalance(acc2)
10000000000000000000
(欢迎打赏,一分也是爱)
外部账户创建流程:
当使用 geth account new 命令新建账户以太坊geth加速,最终调用 accountCreate(accountcmd.go)=keystore.StoreKey=storeNewKey(key.go)
storeNewKey完成私钥、公钥、地址以太坊geth加速的生产以太坊geth加速,最后保存成keystore文件到指定路径。
最后保存以太坊geth加速的keystore文件为json格式,如下:
以下为用密码可以推出私钥的流程
对交易发起人的地址和nonce进行RLP编码,再算出Keccak哈希值,取后20个字节作为该合约的地址,即: Keccak-256(RLP(sender, nonce))[12:]
函数位于: crypto/crypto.go
账户在区块链上的存储结构,内外账户的结构都是一样
文章github地址
假设两台电脑A和B
要求:
1、两台电脑要在一个网络中,能ping通
2、两个节点使用相同的创世区块文件
3、禁用ipc;同时使用参数--nodiscover
4、networkid要相同,端口号可以不同
1.4 搭建私有链
1.4.1 创建目录和genesis.json文件
创建私有链根目录./testnet
创建数据存储目录./testnet/data0
创建创世区块配置文件./testnet/genesis.json
1.4.2 初始化操作
cd ./eth_test
geth --datadir data0 init genesis.json
1.4.3 启动私有节点
1.4.4 创建账号
personal.newAccount()
1.4.5 查看账号
eth.accounts
1.4.6 查看账号余额
eth.getBalance(eth.accounts[0])
1.4.7 启动停止挖矿
启动挖矿:
miner.start(1)
其中 start 的参数表示挖矿使用的线程数。第一次启动挖矿会先生成挖矿所需的 DAG 文件,这个过程有点慢,等进度达到 100% 后,就会开始挖矿,此时屏幕会被挖矿信息刷屏。
停止挖矿,在 console 中输入:
miner.stop()
挖到一个区块会奖励5个以太币,挖矿所得的奖励会进入矿工的账户,这个账户叫做 coinbase,默认情况下 coinbase 是本地账户中的第一个账户,可以通过 miner.setEtherbase() 将其他账户设置成 coinbase。
1.4.8 转账
目前,账户 0 已经挖到了 3 个块的奖励,账户 1 的余额还是0:
我们要从账户 0 向账户 1 转账,所以要先解锁账户 0,才能发起交易:
发送交易,账户 0 - 账户 1:
需要输入密码 123456
此时如果没有挖矿,用 txpool.status 命令可以看到本地交易池中有一个待确认的交易,可以使用 eth.getBlock("pending", true).transactions 查看当前待确认交易。
使用 miner.start() 命令开始挖矿:
miner.start(1);admin.sleepBlocks(1);miner.stop();
新区块挖出后,挖矿结束,查看账户 1 的余额,已经收到了账户 0 的以太币:
web3.fromWei(eth.getBalance(eth.accounts[1]),'ether')
用同样的genesis.json初始化操作
cd ./eth_test
geth --datadir data1 init genesis.json
启动私有节点一,修改 rpcport 和port
可以通过 admin.addPeer() 方法连接到其他节点,两个节点要要指定相同的 chainID。
假设有两个节点:节点一和节点二,chainID 都是 1024,通过下面的步骤就可以从节点二连接到节点一。
首先要知道节点一的 enode 信息,在节点一的 JavaScript console 中执行下面的命令查看 enode 信息:
admin.nodeInfo.enode
" enode://d465bcbd5c34da7f4b8e00cbf9dd18e7e2c38fbd6642b7435f340c7d5168947ff2b822146e1dc1b07e02f7c15d5ca09249a92f1d0caa34587c9b2743172259ee@[::]:30303 "
然后在节点二的 JavaScript console 中执行 admin.addPeer(),就可以连接到节点一:
addPeer() 的参数就是节点一的 enode 信息,注意要把 enode 中的 [::] 替换成节点一的 IP 地址。连接成功后,节点一就会开始同步节点二的区块,同步完成后,任意一个节点开始挖矿,另一个节点会自动同步区块,向任意一个节点发送交易,另一个节点也会收到该笔交易。
通过 admin.peers 可以查看连接到的其他节点信息,通过 net.peerCount 可以查看已连接到的节点数量。
除了上面的方法,也可以在启动节点的时候指定 --bootnodes 选项连接到其他节点。 bootnode 是一个轻量级的引导节点,方便联盟链的搭建 下一节讲 通过 bootnode 自动找到节点
参考:
以太坊geth加速的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于以太坊速度慢、以太坊geth加速的信息别忘了在本站进行查找喔。
评论