最近有一个以太坊项目,需要紧急充电。我个人一贯认为直接从上层入手开发反而会一脸懵逼,从底层原理入手可能枯燥,但是对于学习和理解来说却至关重要,底层基础不牢靠,永远走不远。
因此本篇我们就以开发者的角度入手,快速解读以太坊的白皮书,以快速get到技术关键点为目的,提炼技术要点,这样实际开发中就会少走很多弯路,完整的以太坊白皮书见官方wiki: https://github.com/ethereum/wiki/wiki/White-Paper。本篇文章不以普及区块链概念为目的,所以需要读者有一定的区块链基础概念。
以太坊的账户
以太坊通过账户
转移价值,完成状态转换的。以太币(Ether)是以太坊内部的主要加密燃料,用于支付交易费用(后续会描述交易费的计算方法)。以太坊的账户包含四
个部分:
- 随机数,用于确定每笔交易只能被处理一次的计数器
- 账户目前的以太币余额
- 账户的合约代码,如果有的话
- 账户的存储(默认为空)
以太坊有两种账户类型:外部所有账户
(由私钥控制的)和合约账户
(由合约代码控制)。交易是通过发送消息
触发的,当发送到合约账户
时,内部的合约代码被执行。合约可以对内部存储进行读写,可以发送消息或创建其他合约。
TIPS: 关于以太坊钱包的备份: https://ethfans.org/topics/595
以太坊的消息与交易
以太坊的交易是通过外部储户发送带有签名的消息触发的。交易包含消息的接收者、用于确认发送者的签名、以太币账户余额、要发送的数据和两个被称为STARTGAS
和 GASPRICE
的数值。STARTGAS为最大消耗的GAS限制,GASPRICE为每一步需要支付旷工的费用。当STARTGAS消耗光后,所有状态改变恢复初始,但是不退手续费(GAS)。如果GAS还有剩余,则返还剩余GAS到发送方账户。
以太坊的交易将账户价值从发送方转移到接收方,如果接收方账户不存在,则创建目标账户,如果接收账户是合约账户,则执行合约代码,直到执行完毕或消耗光GAS停止执行。
交易手续费的计算
首先GAS的价格不是一成不变的,他的价格和交易过程中类似于股票交易的过程。当前行情在很多地方可以查看,比如这里: https://ethgasstation.info/
交易的时候可以自行设置GASPRICE,和股票交易一样,如果你的手续费太低,是会迟迟得不到交易确认的,叫价太高自己会亏。因此需要合理评估交易手续费。
要估算消耗的GAS,可以调用web3
提供的估算方法estimateGas
。
目前供参考的一个GAS消耗简表,鼓励设计更高效的智能合约以减少GAS浪费:
step 1 Default amount of gas to pay for an execution cycle.
stop 0 Nothing paid for the SUICIDE operation.
sha3 20 Paid for a SHA3 operation.
sload 20 Paid for a SLOAD operation.
sstore 100 Paid for a normal SSTORE operation (doubled or waived sometimes).
balance 20 Paid for a BALANCE operation
create 100 Paid for a CREATE operation
call 20 Paid for a CALL operation.
memory 1 Paid for every additional word when expanding memory
txdata 5 Paid for every byte of data or code for a transaction
transaction 500 Paid for every transaction
关于智能合约
目前以太坊的只能合约使用Solidity
语言编写,编译为字节码部署在以太坊,通过EVM
执行。部署合约的过程基本类似于创建账户的过程,成功部署之后会返回合约的地址,需要记录这个地址以便于未来的调用。
合约也是有生命周期的,可以调用kill
方法销毁合约。注意这里的销毁只是将合约地址标记为僵尸地址,访问僵尸地址将抛出错误。合约本身还是存储在区块链上的,因此痕迹不会被抹除。
关于发币
以太坊允许发行自己的代币(token),它们也是内置在以太坊上的数字资产,通过智能合约发行和控制。符合ERC20
标准的代币将直接兼容以太坊,因此鼓励代币系统尽可能兼容ERC20标准: https://theethereum.wiki/w/index.php/ERC20_Token_Standard
发行代币的过程本质上还是执行智能合约的过程,因此同样需要按照智能合约的执行过程,消耗GAS让矿工确认。
小结
本篇文章通过快速阅读以太坊的白皮书,摘录出部分技术要点,最近有项目开发需求,在之前疑惑的一些技术要点,通过阅读白皮书将其补上,故有此一文记录要点。