您的位置: 唐点游戏 > 名人

以太坊智能合约与Solidity背景资料

2019-07-07来源:唐点游戏

这是一篇对以太坊智能合约与 Solidity 的一些简介,方便大家理解我们这几期对合约安全性分析的文章。部分内容翻译自参考文献[1]

本质上,以太坊是一个去中心化的虚拟机,在运行的过程中,可以按照一定顺序执行合约。合约由一组供用户调用的函数构成,比如说,一个标准的 ERC 20 合约应当实现以下六个函数。

当一个用户想将自己的 ERC 20 token 转给其他地址的时候,可以发起一笔交易来调用 transfer 函数,让以太坊执行合约中 transfer 函数对应的代码,从而完成转账。

在以太坊中,用户可以通过发起交易实现 3 个功能:

  1. 创建新的智能合约

  2. 执行合约中的函数

  3. 转账 ether

交易由矿工打包进区块,所有区块构成了一个链。这样所有的交易就有了一个执行的顺序,基于这个顺序,也可以定出每个时刻的合约状态和交易余额。

合约编写

在以太坊中,合约以字节码的形式发布到区块链上,并在 EVM (Ethereum Virutal Machine) 中执行。在用户开发的时候,不需要直接编写字节码。以太坊社区提供了一套叫做 Solidity 的语言。一个由 Solidity 开发合约的代码如下图所示。

在合约的前两行,定义了一个变量和一个字典映射。在每次合约被执行的时候,这两个变量都可能被修改。当下一次合约被执行的时候,如果读取了这两个变量,得到的将是修改后的内容。

合约的第一个函数 AWallet 与合约名相同,是这个合约的构造函数。当这个合约在区块链上被创造的时候,构造函数被执行,一般用于初始化合约中的一些变量。

在 Solidity 代码中,可以通过 msg.sendermsg.value 两个变量获取:1. 触发本次合约执行的交易是谁发的,2. 触发本次合约执行的交易向合约里转入了多少 ether。基于这两个变量,可以实现合约操作的权限管理,也可以实现将一些数字资产由用户私钥控制转为合约执行控制。

Solidity 允许异常的存在,例如函数 pay 的第一行,如果调用这个函数的地址与创建合约的地址不一致,则意味着调用合约的人没有动用合约里资产的权限,那么就通过 throw触发了一个异常。当异常被触发时,没有任何捕获(catch)的方式,直接停止合约的执行,回滚状态,并扣除全部的交易费用。

对于类型为 address 的变量 r, r.send(amount) 表示由合约向地址 v 发送数额为 amount 的 wei. (10^18 wei = 1 ether )

最后一个没有函数名的函数 function () 称为回退(fallback)函数,是智能合约中一个特殊的函数。因为 EVM 的字节码中并没有对函数的支持,所以,Solidity 在将代码编译成字节码后,字节码的第一部分便是函数匹配。用户通过指定要调用函数的函数名和参数类型的哈希值的前四个字节来告诉 EVM 执行哪个函数。例如 byte4(sha3("pay(uint,address)")),这四个字节被称为函数签名。如果用户调用时使用的函数签名匹配到了一个函数,则执行这个函数。如果没有匹配到任何函数,回退函数将作为 default 选项被执行。

燃料费

在以太坊中,每次合约函数的调用需要被所有的矿工执行。交易中的交易费可以激励矿工们做这件事情,同时保护以太坊合约执行上免受 DoS 攻击(攻击者提交大量计算机很大的合约)。

执行交易费由燃料用量(gas used)和燃料费(gas price)决定。燃料用量由合约执行过程中执行了的操作计算,EVM 虚拟机的每一个字节码指令都标注了燃料用量。燃料费是用户的出价,更高的燃料费意味着交易可以更早被加入区块。燃料用量乘燃料费就是合约执行的交易费。

同时,每笔交易要指定燃料用量上限(gas limit)。燃料用量上限乘以燃料费是预付款。交易发起时要保证账户余额中有足够的钱支付预付款。当燃料用到上限时,如果还没有执行结束,将判断为执行失败,回滚所有操作,并没收预付款。如果合约执行成功,预付款中未使用的部分会被退回。

参考文献: [1] Atzei, Nicola, Massimo Bartoletti, and Tiziana Cimoli. "A survey of attacks on ethereum smart contracts (sok)." Principles of Security and Trust. Springer, Berlin, Heidelberg, 2017. 164-186.


Conflux 是致力于打造下一代高性能的 DAPP 公链平台

欢迎关注我们的微信公众号:Conflux中文社区(Conflux-Chain)

添加微信群管理员 Confluxgroup 回复“加群”加入 Conflux官方交流群


本文由唐点游戏整理,内容仅供参考,未经书面授权禁止转载!图片来源图虫创意,版权归原作者所有。

相关阅读