区块链100讲:浅析以太坊网络智能合约原理

Posted by

区块链100讲:浅析以太坊网络智能合约原理

内容来源:简书

作者:老码农不上班

区块链100讲:浅析以太坊网络智能合约原理

以太坊图灵完备的智能合约丰富了区块链从比特币单一数字资产去中心化转移到去中心化的全球分布式计算机变为可能,虽然在以太坊网络运行代码成本比较高。相对于比特币的脚本,以太坊智能合约的出现是一种比较大的进步。这篇文章我们来讨论以太坊网络智能合约的工作原理。

1

区块链101

区块链简而言之就是非中心化的分布式账本,一种多方参与者共享的特定类型数据库。

账本中保存在区块链网络中发生所有的交易,每个加入网络的节点都有数据的全量拷贝。经济激励模型削弱甚至消除了独立节点之间的信任基础,在不需要信任的开放网络中转移数字资产。

区块链世界奉行 Don’t trust, verify it 原则。

2

智能合约

图灵完备的智能合约让以太坊成为继比特币之后区块链技术最大的亮点。比特币是数字资产作为价值的载体,而以太坊超越了数字资产属性,赋能去中心化应用。智能合约是能够在区块链网络运行的代码逻辑。

3

以太坊账户模型和状态模型

比特币使用 UTXO 模型,而以太坊使用账户模型。智能合约在以太坊中也属于账户。以太坊网络有且仅有一个经常被更新的 State trie 全局状态。state trie 通过健值对维护所有在以太坊网络发生过交易的账户。

key 为长度为 160 bit 的以太坊地址,value 为下面四个要素使用 RLP (Recursive-Length Prefix 编码方法) 编码而来。每个账户都是 state trie 的一个节点,所有账户的 state trie 做类默克尔树得到根节点 (State Trie — Keccak-256-bit hash of the state trie’s root node stored as the “stateRoot” value)

  • nonce

  • balance

  • storageRoot

  • codeHash

下图为 state trie 与区块的关系

区块链100讲:浅析以太坊网络智能合约原理

Relationship between the State Trie (leveldb implementation of a Merkle Patricia Trie) and an Ethereum block

两种账户 nonce (账户中成功转账次数) 和 balance (eth 余额) 字段都有数据,智能合约账户 storageRoot (保存合约的所有数据)和 codeHash (保存合约代码编译后字节码) 有数据,而普通账户这两个字段为空。

合约的数据保存在 storage trie 中,正如 state trie 一样,storage trie 同样存储格式同样为健值对 (keys are storage locations and values are storage values) 对应合约中变量名和值,这些健值对通过默克尔散列之后得到 storageRoot 存储在账户中。

下图为 storage trie 和 state trie 的关系

区块链100讲:浅析以太坊网络智能合约原理

eth_storage_tree.png

值得强调的是:区块数据只保存 transaction trie (类似比特币中的区块头中存储所有区块中的交易默克尔树根结点), state trie root 和 receipts trie root。

4

智能合约账户

contract Counter {

uint counter; function Counter(

) public {

counter = 0;

} function

count() public {

counter = counter + 1;

}

}

简单的智能合约,类型为 uint 的 counter 为合约的状态,count 函数被调用之后, counter 值加 1

区块链100讲:浅析以太坊网络智能合约原理

smart_contract_account.png

5

以太坊交易

交易信息中有个比较特殊的字段data, 这个字段值结合 to 字段可把以太坊交易分为三大类:

转账

  • TO 收款地址

  • DATA 为空或任意交易备注信息

  • AMOUNT 交易 ether 数量

新建合约

  • TO 字段为空,新建合约被触发

  • DATA 字段为智能合约字节码

  • AMOUNT 字段可为空或任意数,非负数则转账给新建的合约账户

调用合约

  • TO 字段为合约账户地址

  • DATA 字段为合约函数及其参数

  • AMOUNT 空或任意数

// Transfer of value

{

to: ‘0x687422eEA2cB73B5d3e242bA5456b782919AFc85’,

value: 0.0005

data: ‘0x’ // Could also send a message here if we want to

}

// Create smart contract

{

to: ”, value: 0.0

data: ‘0x6060604052341561000c57fe5b60405160c0806……………’}

// Call contract

{

to: ‘0x687422eEA2cB73B5d3e242bA5456b782919AFc85’,

// Contract

value: 0.0

data: ‘0x6060604052341561000c57fe5b60405160c0806……………’

}

值得强调的是,在以太坊交易中有 gas 的概念,在以太坊网络跑运用需要一定的成本,同时必须设置 gas 上限,交易执行完成之后,剩余的 gash 将会返还。

推荐阅读

  • Diving into Ethereum’s world state

  • Basic Questions About the Ethereum EVM and State Storage

  • State Tree Pruning

区块链100讲:浅析以太坊网络智能合约原理

Blockathon|48小时极客竞赛,区块链马拉松等你挑战(成都)

时间:2018年9月14-16日

地点:成都高新区天府五街200号菁蓉国际广场2号楼A座12楼中韩互联网+新技术孵化器

  • 招募50名开发者(识别下图二维码或点击“阅读原文”即可报名)

  • 报名费100元为参赛押金,参赛者个人原因不能到场参加活动概不退款;参赛者全程参与活动,待活动结束后现场退还。9月14日18:00开始第一次签到,9月15日和16日每天早上都要记得签到哦。

  • 主办方免费提供2天的食物、饮料,并为每一位参会者准备一件文化衫

区块链100讲:浅析以太坊网络智能合约原理

始发于微信公众号: 区块链社区HiBlock