首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当智能合同在同一块中得到几个类似的调用时,会发生什么情况?

当智能合同在同一块中得到几个类似的调用时,会发生什么情况?
EN

Ethereum用户
提问于 2016-04-10 21:34:27
回答 2查看 3.8K关注 0票数 20

当智能合同在同一块中得到几个类似的调用时,会发生什么情况?

例如,请考虑以下几个方面:

代码语言:javascript
复制
contract greeter {
    string name;

    function setName(string name_) {
        name = name_;
    }

    function getName() constant returns(string) {
        return name;
    }
}

如果鲍勃、艾丽斯和伊芙同时给希腊人打电话,而这三个电话都在同一个街区里怎么办?是否每个人都有自己的名字得到正确的回应?合同有三次吗?

EN

回答 2

Ethereum用户

回答已采纳

发布于 2016-04-10 22:31:27

,如果鲍勃、艾丽斯和伊芙同时给希腊人打电话,而这三个电话都在同一块里,那会怎么样?

将调用这三个事务,而不一定按顺序调用,最后一个事务的名称将持久化在挖掘的块中。

每个人都有自己的名字得到正确的回应吗?

不是的。getName()方法将返回被挖掘块中的持久化名称--这是由最后一个事务设置的。

合同运行了三次吗?

是。setName()将运行三次。

The Details

提到在单个事务中,对合同的多个调用的顺序和并发行为是什么?

  • 块的中奖者将决定将事务包含在块中的顺序。
  • 来自不同地址的事务可以以任意顺序执行。
  • 来自同一地址的事务将始终按照其事务非the的顺序执行。

所以:

  • 虚拟机将三次调用setName(...),但首先执行事务的顺序是任意的,假设事务与: addresses (不同的帐户)不同。
  • name字段将被更改三次,但最终事务中的名称将持久化在被挖掘的块中。
  • getName()的调用将在块被挖掘后返回该块中持久化的名称。
  • 从同一个块中执行的智能契约调用getName(),将从Greeter契约以前运行的任何事务获得getName()值。谢谢@Tjaden澄清这个问题。

下面是上面最后两点的例子:

  • 事务按Alice、Bob和Eve的顺序发送。
  • 获胜的矿工将交易顺序按订单夏娃Bob和Alice排序。
  • 聪明的合同在Bob和Alice的交易之间运行。
  • 聪明的合同打电话给getName()会把鲍勃还给他。
  • 在该块被挖掘后,该块中持久化的名称是Alice。对getName()的调用现在将返回Alice。
票数 18
EN

Ethereum用户

发布于 2016-05-28 15:04:45

简单回答:两个事务将在同一个块中执行。重要事项:矿工决定块内事务的顺序。

扩展:在Ethereum中,每个事务都会触发一个代码执行,以更新整个世界状态。对于块中的每个事务,n-事务的世界状态的输出成为n+1事务的输入状态。没有关于块内事务执行顺序的假设。当一个区块被开采时,由矿工来决定订单。任何契约都不应依赖于事务在其代码执行中的排序。

票数 4
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/2856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档