前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >区块链技术与应用06 北大肖臻

区块链技术与应用06 北大肖臻

原创
作者头像
Daffy
修改2020-11-13 18:20:32
7710
修改2020-11-13 18:20:32
举报
文章被收录于专栏:密码学和区块链

接下来这节课好长好长啊,静怡,要坚持!!!!!!争取下午看完!!!加油!!!fighting!!!

ETH-智能合约

智能合约的代码结构。

contract 类似于 c++ 中的类 class,定义了很多状态变量。

uint 就是 unsigned int,无符号整数。

address 是 solidity 语言中特有的,后面会讲。

mapping 是一个哈希表,是一个从地址到 unsigned int 的映射。solidity 语言中哈希表不支持遍历,如果想遍历哈希表中的元素,那么得自己想办法记录一下哈希表中的元素。用 bidders 数组记录。

bidders 是一个动态改变长度是数组。添加一个出价人,bidders.push(bidder)。想知道数组的长度,bidders.length。声明一个固定长度的数组,address[1024] bidders。

constructor定义一个构造函数,只能有一个。

这里的三个成员函数都没有参数,但是有的成员函数是可以有参数的。

外部账户如何调用智能合约?

Sender address 发起调用的账户的地址 To contract address 被调用的合约的地址

左下角TX DATA 给出调用的函数,如果函数有参数的话,参数的取值也要在DATA域中说明。

value是发起调用的时候转过去多少钱。这里是0,这个调用的目的仅仅是为了调用函数不是为了转账。

Gas used 这个交易花了多少汽油费。

Gas price 单位汽油的价格。

Gas limit 是这个交易我最多愿意支付多少汽油。

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

1.直接调用。

用emit这个操作调用这个事件。

以太坊规定一个交易只有外部账户才能发起,合约账户不能自己主动发起一个交易。

所以实际上有一个外部账户调用了B的 callAFooDirectly 函数,然后这个函数再调用A的 foo 函数。

2.使用address.call()。

调用失败返回false,发起调用的函数可以继续执行。

3.代理调用delegatecall()。

payable 以太坊中规定,如果你的合约账户要能接受外部转账,必须标注成payable。

网上拍卖的合约,bid 函数用来进行竞拍出价的。参与竞拍,说要出100个比特币,那么调用 bid 函数,要把拍卖的出价发送到智能合约中,锁定起来。bid 函数要有能够支持外部转账的能力。

withdraw 函数,拍卖结束了,出价最高的赢得了拍卖。可以把原来在 bid 函数里锁定到智能合约中的以太币取出来。

fallback()函数,匿名函数,没参数没返回值。

A调用B这个合约,要在转账交易中的 data 域中说明调用了B合约的哪个函数?如果A转给B一笔钱,没说明哪个函数,data域为空,缺省调用 fallback函数。如果被调用的函数不存在,也调用fallback函数。

注意:转账金额是给收款人的,汽油费是给挖矿的矿工的。

智能合约的创建和运行。

EVM 256位寻址空间。类似JVM。为了平台可移植性。

汽油费。

以太坊要提供图灵完备的可编程模型。

出现死循环,没办法。停机问题(Halting problem)是根本不可解的。这个问题不是NPC问题,NPC是可解的,只是没有多项式时间内的解法,不考虑复杂度的话是可解的。

发起一个智能合约的调用,要花费汽油费。

Account nonce 交易序号,前面所说的防止replay attack。

Price 单位汽油的价格。

GasLimit 是这个交易我最多愿意支付价格。

Recipient 转账地址。

Amount 转账金额。

Payload 之前说的 data 域,用于存放调用的是合约中的哪一个函数,函数的参数取值是什么。

当一个全节点收到一个智能合约的调用的时候,先按照合约中给出的 GasLimit 算出可能花掉的最大汽油费。然后一次性把先把最大汽油费从发起调用的账户中扣掉,然后根据实际执行的情况将多余的 gas fee 退回去。

以太坊中的错误处理。错误处理,要不全执行,要不全不执行,原子性。汽油费不够,回滚。发生错误,已经花掉的汽油费是不退的。

嵌套调用。连锁式回滚?不一定,取决于调用智能合约的方式。直接调用,会连锁式回滚。如果call ,则不会。

Block header的数据结构。

GasUsed 这个区块里面所有消耗的汽油费加在一起。

GasLimit 这个区块里所有交易能够消耗的汽油的上限。对区块大小的限制。以太坊中智能合约字节上看起来很小,但是很耗费资源。不能以字节大小来判定。比特币规定每个交易大小不能超过1MB,是写死在协议里面的。防止发布太大的区块,消耗资源。

以太坊,矿工发布区块可以上调或者下调上个区块的 GasLimit 的1/1024,最后趋向于所有矿工的意见的平均值。

注意,发布一个交易,所有的全节点都要执行,状态才能一致,才能更新UTXO。

全节点是应该先把这些智能合约都执行完之后再去挖矿呢,还是先挖矿获得记账权然后再执行智能合约?

先执行智能合约再挖矿!只有执行完才可以获得三个树的根哈希值,才可以尝试nonce,才可以进行挖矿啊。

消耗了资源执行了交易,最后没挖到,没有记账权,怎么办?没有汽油费。以太坊中没有任何补偿。不仅如此,它还要把别人发布的区块的交易在本地执行一遍并验证一遍,更新三棵树的内容,算出根哈希值,比较和发布的是否一样。挖矿慢的矿工非常吃亏。验证步骤没办法跳过。

会不会有的矿工不验证区块的正确性呢?危害区块链的安全。如果跳过验证过程,没有办法更新本地的三棵树,那么就没法继续挖矿了。

矿池中,全节点负责统一验证,矿工不验证。

发布到区块链中的交易是不是都是成功执行的,如果智能合约执行出现错误,要不要也发布到区块链上去?也要发布上去,否则汽油费扣不掉。发布到区块线上的交易不一定都是成功执行的。

怎么知道一个交易是不是执行成功了呢?每个交易执行完后形成收据,Status,交易执行的情况。

智能合约是不是支持多线程的?多核并行处理?solidity不支持多线程,以太坊是交易驱动的状态机,状态的转移必须是确定性的,状态不确定的话,三棵树的根哈希可能对不上。多线程可能造成执行结果不确定。以太坊中不能用真正的随机数,只能用伪随机数。

智能合约能够得到的区块信息。

智能合约能够得到的调用信息。

f_2 函数,msg.sender是C1,但是tx.origin是A。

智能合约中的地址类型。

第一个是成员变量,剩下的是成员函数。(unit256)不是参数类型,是这个变量的类型。

<address>.balance当前这个合约往这个地址里面转入多少钱。address是转入地址。

C合约这个账户往addr上转入12345Wei的钱。

三种转账的方法。

transfer会导致连锁性回滚。send返回false不会导致连锁性回滚。

call把剩下的所有的汽油都发过去,不会导致连锁式回滚。

一个例子,简单拍卖。

拍卖规则:在拍卖结束之前,每一个人都可以去出价,去竞拍,竞拍时为了保证诚信,要把竞拍时用的比特币发到智能合约里,锁起来。拍卖结束时,出价最高的人的钱会给拍卖受益人,其它没有成功的人可以把钱取回来。竞拍可以多次出价,只需要补差价。出价有效指出的价要比当前最高的价高。

假设有一个黑客这样竞拍,没写fallback函数。可能是故意捣乱,也可能是忘了写fallback。

拍卖结束退款存在问题,退在合约账户的钱。转账的时候没有调用任何函数,应该调用fallback函数,而这个合约没有定义fallback函数,会出现异常,引起连锁性回滚,导致操作失败,大家都收不到钱。不管排在黑客前排在黑客后,都只是在本地数据结构上处理,只有全部执行成功,发布,验证成功才可以达到共识。大家的钱锁死在智能交易里的,等死。。。。。。

Codeis law,类似于不可撤销的信托(irrevocable trust)。

智能合约锁仓操作。pre mining 锁仓三年。

在发布智能合约之前,一定要测试测试再测试,确认完全没问题再去发布。

智能合约留后门,用来修复bug?给合约创建者一个超级管理员权限。和去中心化理念背道而驰,用户不接受,不承认。

第二版。

问题。Hack_bid和上一个一样,拍卖结束调用withdraw。问题在fallback函数,又把钱取了一遍。转账完才进行黑客账户清零。而上面已经陷入递归,根本执行不到清零。还是有问题,重入攻击。递归,黑客不断从这个账户中取钱,第一次取的是自己的钱,然后取得都是别人的钱了。

停止条件:这个拍卖合约上的余额不够了或者汽油费不够了或者调用栈溢出了。

第三版。

先清零再转账。

先清零再转账。用sender和transfer共同点,转账时候发送过去的汽油费只有2300个单位,这个不足以让接受的合约再发起一个新的调用。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ETH-智能合约
相关产品与服务
区块链
云链聚未来,协同无边界。腾讯云区块链作为中国领先的区块链服务平台和技术提供商,致力于构建技术、数据、价值、产业互联互通的区块链基础设施,引领区块链底层技术及行业应用创新,助力传统产业转型升级,推动实体经济与数字经济深度融合。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档