《深入理解以太坊》学习

24 9月 2021

核心交易流程

  1. 一切源于用户A在DAPP工具上生成一个随机数,反正,我们称它为私钥k。通过把它输入ECDSA运算,得出公钥的全文,一般会比私钥长。再通过hash算法(SHA-3)来得出公钥hash,它的后20位则是用户A的账户地址。
  2. 用户A要交易给用户B一个ETH时,填充一个交易结构体tx.目前还是在用户A的DAPP工具中,对tx进行RIP编码,再hash算法(SHA-3)生成摘要,最后签名,签名结果是65位字节长的值(r,s,v)前两者32字节长。签名实质上是使用私钥k对交易摘要进行加密的过程。
  3. 验证节点出场即机器。它拿到原始交易tx和签名结果。
    1. 首先恢复出用户A的公钥q(是通过交易hash和签名计算出来的)
    2. 签名验证即是用公钥q来解密交易,得出账户名(用户A)
    3. 得出的,计算的,或者说恢复的公钥得出的这个账户名,要和原始交易中from的值做为对比。一致说明内容未被篡改。
  4. 交易一旦合法,就要被矿工进行流水线加工,进入区块。这里是有区别对待的,交易中流通的价值高,蕴的鼓励值越高,矿工也不是傻子,所以,高额交易会更快进入到区块。
  5. 当一个区块生成,即要更新“世界观”。树就是以太坊这个状态机的后台世界了:默克尔树(一个全局的静态树,叶子节点是指向具体数据区块),MPT状态树,其中M是指默克尔树,显示它是个进化的树结构。

基础概念

账户分类

EOA(外部拥有账户):没有代码,自然人,被私钥控制,消息的主动触发者,

CA(合约账户):含有代码,虚拟角色(不能发起交易),被智能合约代码控制,消息的被动响应者(相对于EOA),触发代码。

EVM(智能合约虚拟机):以太坊最大特色,每个节点都拥有,在上面可以执行合约代码。

重要概念

单位换算

划重点:
1ether = 10的18次方wei
1gwei =10的9次方wei

理解GAS和矿工奖励

GAS:首先要理智的标签它,它是一个单位,最好的理解是“油桶”。那么就会有GASPrice每桶的单价(默认单位是GWei)和GASLimited的概念。其次,要抓住GAS是燃料,是EVM的燃料。矿工当然喜欢打包GASPrice高的交易,因为GAS是矿工工资的一部分。主要来源是三部分:

  1. 一部分,即以太坊协议定义的奖励。目前是挖一个块5个eth。
  2. 二部分,块中所有交易的GAS费用,所以GASPrice高的交易会让矿工不仅仅得到实质的收益外,还有“快”的利益。因为,早一点进入链,自己的奖励拿到的也快。并且能稳定,自己挖的块进入主链机率大,不至于碰到孤块。否则会被排队,等待打包入链。
  3. 三部分,打包,索引或者说引用叔块的奖励。

参考:nitrohsu.com/ethereum-m

二种GASLimited概念

会有两种场景,以免混淆。

  1. 一种是在交易业务中,无论你要普通交易或者有合约的交易,都要设置这个GASLimited,这样能保护账户的资产安全。普通交易中使用的一般是由创世块的配置文件定义的。如果是私有链一般设置GASLimited为最大21000个GAS。而最终交易使用的GASUsed可以通过eth.getTransactionReceipt()来查,传入交易的hash值。
  2. 第二种GASLimited出现的场景是在打包业务中,一个区块会有一个GAS总量限制,这是以太坊协议规定的,以防止一个块存在过多的交易。这块矿工是有取舍的,反正,只要不超过这个数字,可以自由选择打包的交易。

智能合约

在比特币中,A给B钱就只是交易,但以太坊中你可以让B做点任务,然后再得到B应该得的部分A给的钱。但是以太坊收取些计算或执行的费用就是GAS。具体就是GASUsed*GASPrice的值。这些钱是一定是被花出去的,无论,B的任务做的如何?当然,会有剩余就会流回A的钱包。

合约是通过RPC来访问以太坊节点的。会在专栏的其它文章中详细介绍。

叔块及其奖励

虽然不是主链(最长的链)的块,但是引用和挖它依然有少一些的奖励。这与比特币的完全弃用策略不同。

m.chinaz.com/mip/articl

对于叔块奖励,有人认为人性化,有利于矿工积极性,也有人认为,不利于发展,变相增加通胀率,反正,这种奖励,会让矿工的收入不再是整数而是浮点数。

网络类型

networkid为1的网络是主网络,是真正的生产环境网络。

此外应该使用测试网络,但实际开发过程中使用

  1. 私有网络和开发者模式
  2. 模拟环境网络Ganache

开发,测试和部署标准部署工作流:

Ganache=>私有网络=>测试网络=>以太坊价值主网络

以太坊客户端

源码安装以太坊

git clone http://github.com/ethereum/go-ethereum.git

之后,在本人安装地址:/lab/ytp/cli4DN/go-ethereum下执行

make geth
export PATH=$PATH:/root/go-ethereum/build/bin
sudo ./build/bin/geth --datadir /lab/ytp/privateBC/db/
注意不要使用snap install geth,要直接把./build/bin/geth来使用。sudo apt-get purge snapd

私链初始化

{ “config”: { “chainId”: 369, “homesteadBlock”: 0, “eip150Block”: 0, “eip150Hash”: “0x0000000000000000000000000000000000000000000000000000000000000000”, “eip155Block”: 0, “eip158Block”: 0 }, “nonce” : “0x0000000000000042”, “mixhash” : “0x0000000000000000000000000000000000000000000000000000000000000000”, “alloc” : {}, “coinbase” : “0x0000000000000000000000000000000000000000”, “difficulty” : “0x00000002”, “extraData” : “”, “gasLimit” : “0x2fefd8”, “parentHash” : “0x0000000000000000000000000000000000000000000000000000000000000000”, “timestamp” : “0x00” }

上面是起作用的创世块配置文件g1.json。

注意:未加init选项时的数据文件夹会很大。真正私有链的数据的路径是/lab/ytp/privateBC/insidedb

geth --datadir "./insidedb" init g1.json

后续命令

开启节点和终端服务

geth --identity "homenode" --rpc --datadir "./insidedb" --port "30303" --networkid 369 --dev.period 1 --allow-insecure-unlock --nodiscover console
注意:有两个参数是因为版本升级需要加上的,一个是--dev.period 1 ,一个是允许解锁账户的--allow-insecure-unlock,也有一种用法是--unlock '0,1'.
于是摸索出最优命令。
v1:
geth --identity "homenode" --rpc --datadir "./insidedb" --port "30303" --networkid 369 --dev.period 1 --allow-insecure-unlock --unlock '0,1,2,3,4' --password "./pwdfile" --nodiscover console

新终端通过ipc连接以attatch方式连已启动客户端

geth --datadir "./insidedb" attatch ipc:./insidedb/geth.ipc

js控制台(终端)命令集锦

  • 换算命令
balance=web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")
  • 挖矿
#设置矿工地址
miner.setEtherbase(eth.accounts[0])
#确认一下设置成功
eth.coinbase
#开始挖矿,参数为线程的数量
miner.start(1)

注意:最好要在非节点的终端中挖矿,这样有主客之分,虽然在新终端中执行完start后返回null,但节点的终端上看到日志流动,事实后台已经在挖矿了。可以用eth.blockNumber来看链上块数。

  • 交易

每挖出一个块给挖矿者5个以太币。

解锁账户后,发起个0交易后,再看是否有区块变化。无论用户发起的交易是否打包成功,都要支付 Gas 费用。

eth.sendTransaction({from:eth.accounts[1],to:eth.accounts[0],value:web3.toWei(0,"ether")})
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除。

区块志

相关文章
关注我们