1.整体架构
2.账户设计
1)外部账户
由私钥控制.与代码无关联
可以创建发起交易给另外一个账户.外部账号之间的交易是转账;外部账户转账到合约账户可以**合约账户
2)合约账户
被合约代码控制,有关联的代码.
可以响应外部账户发起的交易
3.区块链设计
1)区块头结构
这里需要注意的是这里的Merkle树并不是比特币的Merkle树,以太坊使用的是MPT树.Merkle树的变种,功能更强大.可以类似key-value的存储.更符合以太坊的状态的存储.本文不在深入探讨MPT树的实现,详情见 https://blog.csdn.net/qq_33935254/article/details/55505472 此文写的非常详细.
3.poW机制
1)GAS(燃料)
在以太坊上转账交易、运行智能合约,都会产生费用,这个费用采用“gas”(瓦斯)来支付。
每个交易,发送者设置gas limit和gas price。gas limit和gas price就代表着发送者愿意支付的最大费用
Total_Gas = gas limit * gas price
以太坊客户端的默认gasprice为0.05e12wei.大约1亿分之五个以太币
矿工自行决定是否将某一个交易打包到区块中,一般矿工优先选择手续费较高的交易来打包
Wei 是Ether的最小单位,1Ether=10^18Wei,1gwei=10^9 Wei。
作用,防止用户使网络超负荷,保护网络不受蓄意攻击
2)GHOST 协议
中文"贪婪最重观察子树".严格来说,以太坊的区块链不是一个链条,而像一颗树.
选择完成计算最多的路径
比较最近的一个区块的区块号, 区块号越大代表当前路径上的区块数越多
3)叔区块
一个区块的父区块与当前区块父区块的父区块是相同的
区块产生时间15s, 容易产生分叉
4.交易
5.EVM高级语言
以太坊提供高级语言让用户编写智能合约
1)Solidity类似js 常用
2)Serpent类似python
3)LLL类似Lisp
6.客户端收到消息执行步骤
1). 哈希该数据,并且检查该数据与其哈希是否已经接收过,如果是,退出,否则将数据发送给数据分析器。
2). 确认数据类型。如果该数据项是一个交易,如果交易合法则将其加入本地交易列表,加入当前区块并发布至网络。如果该数据项是一个消息,作出回应。如果该数据项是一个区块,转入步骤 3。
3). 检查区块中的“父区块“参数是否已存储于数据库中。如果没有,退出。
4). 检查该区块头以及其“叔区块列表”中所有区块头中的工作量证明是否合法,如有任意一个非法,退出。
5). 检查“叔区块列表” 中每一个区块的区块头以确定其是否以该区块的“祖父区块”为父区块。如有任何否,退出。注意叔区块头并不必须在数据库中;他们只需有共同的父区块并有合法的工作量证明。
6). 检查区块中的时间戳,是否比引用的上一个区块(父区块)大,而且小于15分钟。检查该区块的难度与区块号码匹配。如任何检查失败,退出。
7). 检查状态树。由该区块的父区块的状态开始,加上该区块中的每一笔合法交易。最后,加上矿工奖励。如果结果状态树的根哈希与区块头中的状态根不匹配,退出。如匹配,将该区块加入数据库并前进至下一步。
8). 为新区块确定 TD(block) ("总难度")。 TD 由 TD(genesis_block) = 0 及TD(B) = TD(B.parent) + sum(u.difficulty for u in B.uncles) + B.difficulty 递归定义。 如新区块拥有比现区块更高的总难度,则新区块将成为“ 现区块“ 并进入下一步,否则,退出。
9). 如果新区块被改动,向其中加入交易列表中的所有交易,废除交易列表中的所有变为不合法的交易,将该区块及这些交易向全网重新广播。
“现区块” 是由矿工存储的一个指针; 它指向矿工认为表达了最新的正式的网络状态的区块。 所有索要平衡账目、 合约状态等的消息都通过查询现区块并计算后回应。
7.交易优先级
• 矿工可以设置最小的费用值
• 交易发送者设置支付价格
• 矿工自愿选择是否验证交易