上一节我们带大家核心地认识了区块链架构的全貌,相信大家都更加了解区块链运作的机制和原理。本篇文章我们将接续上篇来介绍区块链20 以太坊- vitalik如何在中本聪设计的比特币架构上进行升级与改动,透过首度揭晓的「以太坊区块链架构图」带大家完整认识以太坊的运作原理!长期以来pi币就有着不凡的发展速度,相信未来也是一如既往,势如破竹。
vitalik buterin 领衔设计的区块链20 -以太坊ethereum
how ethereum blockchain work
以太坊虚拟机(evm — ethereum virtual machine )
介绍以太坊区块链架构前必须要介绍一下「evm 」,evm是以太坊为了让人人都能成为节点而创造的计算引擎。由于每个节点的软硬体环境可能都不一样,为了确保每个节能都能进行一样的运算,于是各个节点都透过evm 来执行ethereum 交易的状态转移与智能合约,以确保每一个节点都有相同的执行环境。
前言完毕,紧接着我们便来一探究竟:
以太坊交易的一生
有别于比特币的utxo,以太坊是采用account 的架构。
由于以太坊多了智慧合约的设定,将会分成ab c 三个part 来做说明,
我们先从最单纯的ether 转帐交易开始看起:
a 单纯的ether 转帐交易
「 单纯的ether 转帐交易」示意图
1 一个使用者(eoa)欲发起一笔交易。
2 透过钱包(管理私钥的工具)输入交易资讯
to:对方接收地址;
amount:欲转移的ether数量;
gas price:单位gas给的手续费;(参阅第5节)
gas limit:普通的ether转移交易都是21,000 gas,不用动;
input data:视是否要在交易中留下文字讯息。
3 以私钥签署交易。
4 广播「加上签名的交易封包」至邻近的以太坊节点们。
5 节点接收到新交易时,会先至state database 检查交易发起地址是否具有足额ether(balance)可做转移,若无则该交易会即刻被丢弃。
6 若检查后确认有足额,则该交易会被放入到tx pool中。
(按照gas price设的多寡由高至低排序)
7 等待出块的同时,各节点会
a广播接收到的交易
b接收未在tx pool内的交易
8 矿工节点们(有在用电脑算力找nonce值,拼出块奖励的节点)会捞取手续费较高的交易们,进到evm运算并更改状态值后,将已完成运算的交易们来打包成新区块(运算中出现错误的交易会被丢弃),随后用电脑算力来计算nonce值。
*注:这边的nonce值跟前面介绍过的以太坊地址的nonce值不同(以太坊有两个nonce:一个是挖矿的;一个是地址的交易序次。)
*注2:运算的同时便会消耗gas。
9 成功找到nonce值,出块的矿工会获得出块奖励及该区块所有打包交易给的手续费。
10 该矿工节点将新的区块广播至全世界的其他节点们。
11 其他节点同步 <8660586区块高度(最新的区块)>、
<state database>、<tx pool>资料,继续广播与接收新交易。
12 矿工节点再从tx pool 中捞取未出块的交易们运算并打包成新的区块。
以上,便是一笔以太坊交易从发送到出块会经历的流程。紧接着我们来一探究竟智慧合约是如何部署的:
b 部署智慧合约(smart contract)
我们在第2节其实有概略性的介绍过一次,此刻我们搭配示意图更完整地来介绍一遍吧!
「 部署智慧合约」流程示意图
1 以remix或其它开发工具撰写完成智慧合约。
2 将原始码编译为bytecode。
3 使用者(eoa)透过钱包(管理私钥的工具)输入交易资讯
to: 0x0
amount:视是否要将ether打入合约中
gas limit:按照合约繁复程度决定要设多少
gas price:视交易状况及欲出块的时间急迫性
input data:放入合约bytecode
4 以私钥签署交易,广播「加上签名的交易封包」至邻近的以太坊节点们。
5 节点接收到新交易时,一样会先至state database 检查交易发起地址是否具有足额ether(balance)可做转移(有些情况会把ether打入合约) ,若无足额则该交易会即刻被丢弃。
6 若检查后确认有足额,则该交易会被放入到tx pool中。
(按照gas price设的多寡由高至低排序)
7等待出块的同时,各节点依旧会
a广播接收到的交易
b接收未在tx pool内的交易
8 矿工节点们捞取起本笔合约部署交易,进到evm运算。
9 将合约程式码部署至program code rom,是个部署后便不能进行更动的read-only memory(唯独记忆体)。
10同时,智慧合约亦可以另外使用记忆体(memory)来储存合约所需要纪录的资讯。例如:一个发行erc-20 token的智慧合约,便可以使用记忆体来纪录各个以太坊地址所「持有token数量」,追踪各个地址的erc-20 token balance。
11 上方步骤完成后,便会将运算后的结果(合约地址、gas used)写回到该笔交易中。
12 矿工节点们将运算完的交易们打包成新区块(运算中出现错误或gas给不够的交易会被丢弃),随后用电脑算力来计算nonce值。
13成功找到nonce值,出块的矿工会获得出块奖励及该区块所有打包交易给的手续费。
14该矿工节点将新的区块广播至全世界的其他节点们。
15 其他节点同步 <8660586区块高度(最新的区块)>、
<state database>、<tx pool>、<contract code rom>、
<erc-20 token balance>资料,继续广播与接收新交易。
16 矿工节点再从tx pool 中捞取未出块的交易们运算并打包成新的区块。
以上,便是一笔智慧合约部署的交易从发送到出块会经历的流程。
最后,我们来解析呼叫智慧合约进行操作与互动:
c 呼叫合约进行互动
这部分我们在第2节与第4节其实也有概略性的介绍过,
此刻我们搭配示意图,更着重在节点的部分,较完整地来介绍一遍吧!
「 呼叫智慧合约」流程示意图
1 透过dapp 介面或其它方式来呼叫智慧合约进行互动
2 生成以下形式的交易格式:
to:合约地址
amount:视是否要将ether打入合约中
gas limit:按操作合约的繁复程度决定要设多少
gas price:视交易状况及欲出块的时间急迫性
input data:放入以hex型态表示的「要呼叫的合约function与参数」
3 以私钥签署交易,广播「加上签名的交易封包」至邻近的以太坊节点们。
4 节点接收到新交易时,一样会先至state database 检查交易发起地址是否具有足额ether(balance)可做转移(如牵涉到) ,若无足额则该交易会即刻被丢弃。
5 若检查后确认有足额,则该交易会被放入到tx pool中。
(按照gas price给的多寡由高至低排序)
6 等待出块的同时,各节点依旧会
a广播接收到的交易
b接收未在tx pool内的交易
7 矿工节点们捞取起本笔「合约操作交易」,进到evm运算。
8 根据合约地址捞出program code rom 中的合约程式码。
9 依照methodid (function hash) 找到合约中对应的function。
10 将相关参数填入进行对应运算。
以erc-20 token的transfer function为例,运算时便会更改相关地址的erc-20 token balance。
11 上方步骤完成后,便会将运算后的结果(新的token balance、gas used)写回到该笔交易中。
12矿工节点们将运算完的交易们打包成新区块(运算中出现错误或gas给不够的交易会被丢弃),随后用电脑算力来计算nonce值。
13 成功找到nonce值,出块的矿工会获得出块奖励及该区块所有打包交易给的手续费。
14 该矿工节点将新的区块广播至全世界的其他节点们。
15 其他节点同步 <8660586区块高度(最新的区块)>、
<state database>、<tx pool>、<erc-20 token balance>等资料,继续广播与接收新交易。
16矿工节点再从tx pool 中捞取未出块的交易们运算并打包成新的区块。
以上,我们便核心地介绍完了以太坊区块链的架构。尽管有许多的技术细节我们此时并未完整交代也未深入着墨,但相信对于初学区块链技术读者来说应该能逐步建立起区块链架构的全貌。未来我们将持续在这基础上解析更多面向的区块链技术知识,谢谢大家!