《区块链技术与应用》14 ETH以太坊 智能合约

这个系列的内容是根据肖臻老师《区块链技术与应用》公开课的内容进行的内容整理,以及部分延伸的思考。文末附有公开课链接。

课程发布18年中,基于18年5月份以太坊的版本进行分享,本篇主要回答以7个问题:

1、智能合约的含义是什么?

2、以太坊的智能合约内保存了哪些信息?

3、智能合约的运行方式,如何创建,外部账户如何调用?

4、Gas fee的含义和目的是什么?

5、以太坊的数据包含哪三颗树?分别的数据结构是怎么样的?

6、以太坊的智能合约执行过程是在本地还是链上?

7、Code is law的好处和坏处分别是什么?

智能合约的含义

智能合约是运行在区块链上的一段代码,代码的逻辑定义了合约的内容 智能合约的账户保存了合约当前的运行状态,包括

  • balance,当前余额

  • nonce,交易次数

  • code,合约代码

  • storage,存储,数据结构是一颗MPT

外部账户如何调用智能合约? 创建一个交易,接收地址为要调用的那个智能合约的地址,data域填写要调用的函数及其他参数的编码值

一个合约如何调用另外一个合约中的函数?

特殊的fallback函数,实际上没有可以调用的函数,就用fallback,不是必须定义的

post image

智能合约的创建和运行 发起一个转账交易,到0x0的地址,转账的金额是0,但是需要支付gas fee 合约的代码放在data域里面 智能合约运行在EVM(Ethereum Virtual Machine)上,也叫worldwide computer,EVM是256位。目前通常服务器是32位和64位的。通过一层虚拟机,通过一个一致性的平台。

用的是solidity语句,执行的时候修改的都是本地状态。

Gas fee汽油费

post image

比特币设计语言是简单的,以太坊的设计理念是图灵完备的turing-complete programming model 以太坊的弊端,可能会出现死循环,Halting problem停机问题,这个是不可解的。 以太坊的解决方案是,收取汽油费,由发起交易的人来支付。金额不一样,简答的指令比较便宜,复杂的或者需要存储的指令贵。

智能合约的执行有原子性,要么执行,要么完全不执行,不存在执行一部分的情况。如果汽油费不够,就回滚,并且汽油费不会退回。

receipt收据数的数据结构

三颗树,状态树,交易树,收据树,都是全节点在本地维护的数据结构。

状态的修改,都是在本地进行修改,智能合约的执行都是对本地的数据结构进行修改,执行完了发布到区块链,才会变成外部可见,变成区块链的共识。如果是收到了新的区块信息,那么本地的三棵树更新一下。

先执行智能合约,才能更新三棵树,才能挖矿,不先执行没有三棵树的哈希值,没法挖矿。

  • 那么如果有人先执行了合约,但是挖矿失败,就没有收益。比较难过。 并且每个全节点,需要本地独立验证一遍,算一遍根哈希值,进行对比。

  • 如果矿工不验证,会怎么样? 不验证,三颗树的状态没有更新,无法进行后续的挖矿。

发布到区块链上的交易,是不是都成功执行的?

  • 不是。因为需要发布到区块链上,才能扣汽油费,成为自己账户的资金。 如何知道是不是执行成功?有个status域,告诉是否执行成功。

  • 智能合约是不是支持多线程? 状态机,必须完全确定。三棵树的根哈希值才能对上。

    多线程最核心的问题是多核对内存访问不同,结果可能不一致。 智能合约的执行,不会有真正的随机数,不然节点执行结果会不一致。

Code is law.

没有人能篡改规则,坏处是规则设计不好,会有永久的损失。发布之前测试好了,没问题再发布。 类似于irrevocable trust,不可撤销的信托。

Q:是否可以设置一个超级管理员?

A:前提是所有人得信任超级管理员,和去中心化的理念也是相违背的。

视频课程地址:

https://www.bilibili.com/video/BV1Vt411X7JF?p=22&vd_source=6807dc8dcddb18fe6db9d949c12b670c