以太坊geth加速_以太坊速度慢

欧意官网 比特币 2023-03-31 127 0

本篇文章给大家谈谈以太坊geth加速,以及以太坊速度慢对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

以太坊区块链之Bug --2020/05/19

为了防止交易重播,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

服务器geth同步区块被killed问题解决方案

挂着服务器同步以太坊区块,到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. 以太坊通信协议参考

Geth实现以太账户之间转账

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加速的信息别忘了在本站进行查找喔。

评论