北大肖臻老师《区块链技术与应用》系列课程学习笔记[23]以太坊-智能合约-3

这篇具有很好参考价值的文章主要介绍了北大肖臻老师《区块链技术与应用》系列课程学习笔记[23]以太坊-智能合约-3。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

智能合约-1

智能合约-2

一、思考

1.假设某个全节点要打包一些交易到一个区块里,这些交易里有一些是对智能合约的调用,那么这个全节点应该先执行完智能合约再挖矿,还是先挖矿获得记账权再执行这些智能合约?

        在区块链中,如果有一笔转账交易发布上去,需要所有的全节点都执行的,这不是一种浪费也不是出了某种问题,因为所有的全节点要同步状态,大家都要在本地执行这个转账交易,如果一个全节点不执行那就出问题了,他的状态跟别人的状态是不一样的。比特币系统也一样,比特币发布一个交易到区块链上,也需要所有全节点都得执行这个转账交易,以便更新UTXO。

        全节点收到一个对合约的调用的时候,要一次性的先把这个调用,可能花掉的最大汽油费从发起这个调用的账户上扣掉。以太坊系统中存在三棵树,即状态树、交易树和收据树,这三棵树都是全节点在本地维护的数据结构,状态树记录了每个账户的状态包括账户余额。汽油费是怎么扣的?全节点收到调用时,从本地维护的数据结构中将账户余额减掉就可以,若余额不够,则这个交易不能执行,一次性要按GasLimit把余额减掉。如果执行完之后如果有剩余,再把其余额再加回去。

        智能合约执行过程中任何对状态的修改都是在改本地的数据结构,只有在合约执行完了,而且发布到区块链上之后,本地的修改才会变成外部可见的,才会变成区块链上的共识。以太坊存在很多全节点,每个全节点都在本地做这个事情,执行的智能合约可能不完全一样(因为收到的交易可能执行不完全一样),如果某个全节点发布一个区块,收到这个区块之后,其他节点本地执行的就扔掉了,要将这个新发布区块里的交易再执行一遍,更新本地的三棵树。如果本来已经执行一遍了,但没有挖到矿,发布新区块了还得执行一遍,因为其他节点组装的在本地候选区块中包含的交易跟刚发布的那个交易中区块里包含的交易不一定完全一样,至少给出块奖励的那个地方肯定不一样,所以没有办法,都是得要重新执行一遍。    

        以太坊挖矿是尝试各种Nonce找到一个符合要求的,计算哈希的时候要用到Block Header的内容:Root,TxHash,ReceiptHash,是那三棵树的根哈希值。所以得先执行完这个区块中的所有交易包括智能合约的交易,这样才能更新这三棵树,这样才能知道这三个根哈希值,这样这个Block Header的内容才能确定然后才能尝试各个Nonce。

        假设一个矿工费了半天劲执行这些智能合约,消耗了本地的很多资源,最后我挖矿没挖到,那该矿工能得到什么补偿,能得到汽油费吗?汽油费是给那些获得记账权发布区块的那个矿工没有挖到矿,得不到汽油费也得不到任何补偿,不仅如此,还要把别人发布的区块里的交易在本地执行一遍,以太坊中规定要验证发布区块的正确性,每个全节点要独立验证。别人发布一个交易区块,把那个区块里的所有交易执行完一遍,更新三棵树的内容,算出根哈希值,再跟他发布的那个根哈希值比较一下看是否一致,所有这些都是免费的,没有人给你补偿。所以呢,这种机制下,挖矿慢的矿工就特别吃亏,设置汽油费的目的是对于矿工执行这些智能合约所消耗的这些资源的一种补偿,但是这种补偿只有挖到矿的矿工才能得到,其他的矿工相当于陪跑。

2.会不会有的矿工不给汽油费,就不验证?挖半天没有挖到矿,你发布一个区块,按照协议需要验证一下这个区块的正确性,验证又不给我汽油费,大家直接认为新区块正确,直接接着往后挖就行,会不会出现这种情况?

        如果这样做会导致的最直接的后果是危害区块链的安全,为保障区块链的安全,要求所有全节点要独立验证发布的区块的合法性,这样少数有恶意的节点没法篡改区块链上的内容。如果某个矿工想不通,不给钱我就不验证了,这样的风气蔓延开来就会危及区块链的安全,但是这样的事情会不会存在呢?跳过验证这个步骤,以后就没法再挖矿了,因为验证的时候是要把区块的交易再执行一遍,更新本地的三棵树,如果不去验证的话,本地三棵树的内容没有办法更新(本地的这些状态就不对了,算出的根哈希值发布出去之后别人认为是错的),所以根本没办法继续挖矿为什么要执行才能更新状态?因为发布的区块里没有这三棵树的内容,只是块头里有了根哈希值,这三棵树的账户状态具体是余额等的东西,发布出来是没有的,之前学习过,不能将状态树的整个状态发布到区块链上,那太多了,而且很多是重复的,状态都不改了,所以不会跳过验证这个步骤。以太坊的安全还是有保证的。

        在一个矿池中,存在验证阶段的“抄作业”情况,也就是全节点负责统一验证,其他矿工就负责相信全结点的验证情况。就是说,全节点分配给矿工的只是Pullze的内容,Pullze是根据区块链更新得到的,矿工则不需要考虑这部分内容。

3.发布到区块链上的交易是否都是成功执行的?如果智能合约执行过程中出现了错误,要不要也发布到区块链上去?

        执行发生错误的交易也要发布到区块链上去,否则汽油费扣不掉,光是在本地的数据结构上把他的账户扣了汽油费,是没用的,拿不到钱,你得把区块发不上去之后形成共识扣掉的汽油费才能成为你账户上的钱。所以发布到区块链上的交易不一定都是成功执行的,而且要告诉大家为什么扣汽油费,而且别人得验证一遍,也要把这个交易执行完一遍,看扣的是不是对的。

        前面说过那三棵树,每个交易执行完后形成一个收据,这个是这个收据的内容,Status这个域就是告诉你交易执行的情况如何,如下图1-1所示。

北大肖臻老师《区块链技术与应用》系列课程学习笔记[23]以太坊-智能合约-3
图1-1

 4.智能合约是不是支持多线程?现在多核处理器很普遍,一个计算器有十几核,几十个核,都是正常的,那么智能合约支不支持多核并行处理?

        Solidity不支持多线程,他根本没有支持多线程的语句,原因是以太坊是一个交易驱动的状态机,这个状态机必须是完全确定性的,即给定一个智能合约。面对同一组输入,产生的输出或者说转移到的下一个状态必须是完全确定的为什么要求这个?因为所有全节点都得执行同一组操作到达同一个状态,要进行验证,如果状态不确定的话,三棵树的根哈希值根本对不上,所以必须完全确定才行。

        多线程的问题是什么?多个核对内存访问顺序不同的话,执行结果有可能是不确定的,感兴趣的话,可以看看北京大学肖臻老师的论文。以前肖老师研究过的就是在多核环境下如何实现确定性重演,这是一个难度很大的课题。除了多线程之外,其他可能造成执行结果不确定的操作,智能合约也都不支持,最简单的会导致执行结果不确定的操作:产生随机数,这个操作就是不确定性的,而且这个操作必须得是不确定的,如果不同的机器产生的随机数不一样那不叫随机数了。所以以太坊的智能合约没有办法产生真正意义下的随机数,他用的是一些伪随机数,不能是真的随机数,否则的话,又会出现前面的问题,每个全节点执行完一遍得到的结果都不一样。文章来源地址https://www.toymoban.com/news/detail-422318.html

到了这里,关于北大肖臻老师《区块链技术与应用》系列课程学习笔记[23]以太坊-智能合约-3的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 北大肖臻老师《区块链技术与应用》系列课程学习笔记[25]以太坊-智能合约-5

    智能合约-1 智能合约-2 智能合约-3 智能合约-4 网上竞拍第二版:由投标者自己取回出价 (1)存在的问题         重入攻击,如果有黑客写了一个如下方程序会怎么样?         这个hack_bid跟前面的那个黑客合约hack_bid合约是一样的,通过调用拍卖bid函数参与竞拍,ha

    2024年03月11日
    浏览(50)
  • 北大肖臻老师《区块链技术与应用》系列课程学习笔记[17]以太坊-GHOST协议

    目录 一、以太坊的出块时间及可能带来的问题         1.以太坊的出块时间         2.以太坊与比特币系统的平均出块时间对比         3.带来的问题 二、GHOST协议         1.GHOST协议的核心思想         2.GHOST协议的缺陷         3.改进后的GHOST协议    

    2024年02月09日
    浏览(35)
  • 北大肖臻老师《区块链技术与应用》系列课程学习笔记[15]以太坊-交易树和收据树

     目录 一、以太坊中的三种树 二、状态树、交易树和收据树的区别 三、交易树和收据树的用途         1.交易树和收据树的用途         2.如何实现复杂的查询操作         3.以太坊中Bloom Filter的用途 四、以太坊的运行过程        在以太坊中,存在三种基于树的

    2024年02月05日
    浏览(39)
  • 《区块链技术与应用》北大肖臻老师——课程笔记【6-8】

    提示:以下内容只是个人在学习过程中记录的笔记,图片均是肖老师课程的截图,可供参考。如有错误或不足之处,请大家指正。 比特币网络传播的工作原理(the BitCoin network): 比特币工作在应用层(application layer),底层是P2P的overlay network(覆盖网络)。 比特币的 P2P网络

    2024年01月18日
    浏览(34)
  • 《区块链技术与应用》北大肖臻老师——课程笔记【19-20】

    提示:以下内容只是个人在学习过程中记录的笔记,图片均是肖老师课程的截图,可供参考。如有错误或不足之处,请大家指正。 Block chain is secured by mining. 对于基于工作量证明的系统来说,挖矿是保障区块链安全的一个重要手段。 比特币的挖矿算法总的来说比较成功,没有

    2024年02月09日
    浏览(27)
  • 《区块链技术与应用》北大肖臻老师——课程笔记【21-23】

    提示:以下内容只是个人在学习过程中记录的笔记,图片均是肖老师课程的截图,可供参考。如有错误或不足之处,请大家指正。 权益证明proof of stake 比特币和 以太坊目前都是使用基于工作量的证明,这种共识机制受到一个普遍的批评——浪费电。 Y轴是TWH=Terawatt hours 10的

    2023年04月08日
    浏览(32)
  • 《区块链技术与应用》北大肖臻老师——课程笔记【11-12】

    提示:以下内容只是个人在学习过程中记录的笔记,图片均是肖老师课程的截图,可供参考。如有错误或不足之处,请大家指正。 1. 转账交易时如果接收者不在线(没有连接到比特币网络上)怎么办? 转账交易不需要接收者在线,这个交易只是在区块链上记录一下,把发送

    2024年01月22日
    浏览(36)
  • 北大肖臻老师<<区块链技术>>笔记1

    课程的大纲 密码学基础 比特币的数据结构 共识协议和系统实现 挖矿算法和难度调整 比特币的脚本 软分叉和硬分叉 匿名和隐私保护 以太坊是后面的 首先是密码学基础的学习: crypto-currency(虚拟货币) 是不加密的,区块链上所有的教以都是公开的。其中有转账金额和地址。

    2024年02月02日
    浏览(29)
  • [北大肖臻-区块链技术与应用笔记]第八节课——BTC 脚本

    比特币系统中使用的脚本语言很简单, 唯一能访问的内存空间就是一个栈 ,这点和通用脚本语言的区别很大。 这个交易有一个输入和两个输出,其中一个输出已经被花出去了,另一个没有被花出去。 输入脚本 输入脚本包含两个操作,分别将两个很长的数压入栈中。 输出脚

    2024年01月21日
    浏览(57)
  • [北大肖臻-区块链技术与应用笔记]第八节课——BTC 分叉

    state fork 如果两个节点差不多同时挖到一个区块,这两个区块都是挂在当前的区块上的,不同节点先收到的区块不同,就会各自沿着先收到的区块往下扩展,这种时候就会出现临时性的分叉,称为 state fork ,即由于对区块链当前的状态有意见分歧而产生的分叉。 分叉攻击(

    2024年02月08日
    浏览(22)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包