北京大学肖臻老师《区块链技术与应用》ETH笔记 - 10.0 智能合约

10.0 智能合约

10.1 简介

智能合约:运行在区块链系统上的一段代码,代码逻辑定义了合约内容。

智能合约的账户保存了合约当前的运行状态:

balance:当前余额
nonce:交易次数
code:合约代码
storage:存储,数据结构为一棵MPT

智能合约编写代码为Solidity,其语法与JavaScript很接近。下图是拍卖合约的代码例子,Solidity是面向对象的语言,这里的contract相当于C++的class类。Solidity是强类型语言,这里的类型和普通的编程语言像C++是比较接近的,比如uint是无符号整数。address是Solidity所特有的,后面会讲地址类型的成员变量和成员函数。

接下来是两个事件event,事件的作用是记录日志的,HighestBidIncreased是拍卖的最高出价,如果有人出了新的最高价,我们记录一下参数是address bidder出价人,金额是amount。Pay2Beneficiary 它的参数是winner最终拍下的人,amount金额。

event上面两行的mapping是一个哈希表,保存了一个地址address到uint的映射,Solidity语言中的它不支持遍历,如果你想遍历哈希表中所有的元素,你就需要自己想个办法来记录哈希表中有哪些元素,我们这里是用bidders这个数组来建立的。Solidity里面的数组是可以固定长度的也可以动态改变长度。这里是一个动态改变长度的数组。比如你想往数组里面增加一个元素,用push操作,bidders.push(bidder),在数组的末尾新增加一个出价人。你想要知道这个数组有多少个元素,用它的length域,bidders.length。如果需要固定长度,就例如address[1024] bidders。

再往下是它的构造函数,solidity语言定义构造函数有两种方法,一种是像C++一样定义一个contrast同名的函数,这个函数可以有参数但不可以有返回值。新版本(在这里是0.4.21)版本推荐的是图中的定义方式,用constructor定义,构造函数只有在合约创建的时候调用一次,构造函数只能有一个。

接下来是三个成员函数,这三个函数都是public,说明其他账户可以调用这些函数,示例中的函数都没有参数,注意bid()这个函数,它有一个标志叫payable,后面会解释什么意思。

10.2 账户调用

调用智能合约其实和转账是类似的,比如A发起一个交易转账给B,如果B是一个普通的账户,那么这就是一个普通的转账交易,如果B是一个合约账户的话,那相当于发起一次合约账户的调用。

10.2.1 外部账户调用合约账户

图例中sender address是发起调用的地址,to contract address 是被调用的合约的地址,调用的函数看(Tx DATA)这个地方给出了要调用的函数,如果这个函数有参数的话,参数的取值也是在这个DATA域中说明的。

中间这一行是调用的参数,VALUE是发起调用的时候转过去多少钱,GAS USED是我这个转账花了多少的汽油费,GAS PRICE是单位汽油的价格,GAS LIMIT是我这笔交易我最多愿意支付多少汽油,后面会详细讲汽油费的事情。

10.2.2 合约账户调用合约账户

合约账户之间也可以进行调用。其调用方式如下:

1、直接调用

A这个合约的foo函数的作用只是写条Log,LogCallFoo是一个事件,emit的作用是调用这个事件写一个Log,对于程序的运行逻辑是没有影响的。

B这个合约的函数是把A转化成一个实例,再去调用其中的foo这个函数。

错误处理:直接调用的方式,一方产生异常会导致另一方也进行回滚操作。

img

2、address类型的call()函数调用

addr.call(),图例中addr.call(funcsig,"call foo by func call")这个函数的第一个的参数funcsig是要调用的那个函数foo(string)的签名,第二个是要调用的参数"call foo by func call"。

错误处理:address.call()的方法,如果调用过程中被调用合约产生异常,会导致call()返回false,但发起调用的函数不会抛出异常,而是继续执行。

3、代理调用delegatecall()

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值