首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在这种情况下会发生什么?

在这种情况下会发生什么?
EN

Ethereum用户
提问于 2018-11-18 03:33:52
回答 2查看 130关注 0票数 1

根据对前面问题的回答,智能契约中的所有状态读取都是在当前块- 是否从当前或上一个块读取状态以进行外部函数调用?上完成的。

我现在的问题是:假设我有一个名为C的uint变量的智能契约C,它根据它的值(对于一个游戏或类似的东西)改变了智能契约中的许多逻辑。

Player A访问此智能契约,将其值从当前块读取为"4“,并将C增加1,然后根据C现在为"5”的值与智能契约进行大量交互,并将其广播到网络。

Player B访问同一智能契约,从当前块读取值为"4“,但将C增量为5而不是1。他们还与smart契约进行广泛的交互,假设C的值在增量后为9,并将其广播给网络。

从玩家A和玩家B的角度来看,他们都进行了法律操作,合同假定C在当前区块具有"4“的价值,但在每种情况下,合同都会以极为矛盾和潜在矛盾的方式更新其内部变量。

那么,当玩家A和B都广播他们的互动时会发生什么呢?

EN

回答 2

Ethereum用户

发布于 2018-11-18 03:45:23

Ethereum虚拟机是以这样一种方式构建的,即一旦一个块被挖掘,块链的结果和最终状态是确定的。这就是成千上万的独立节点如何就区块链的状态达成共识,尽管它们可能在世界各地,具有不同的延迟、计算速度等.

重要的是要记住,在Ethereum上的计算并不是连续的,而是一块一块地发生。块中的事务是有序的,因此对于任何给定的块,事件都会按其定义的顺序逐个发生。

因此,即使每个事务都接触到相同的全局变量,并且这可能会影响到契约或函数的发生,事情仍然会以确定性的方式发生。

因此,为了更直接地回答你的问题:

那么,当玩家A和B都广播他们的互动时会发生什么呢?

节点将根据网络变量在可能不同的时间接收两个事务。然后,他们可能会被包括在不同的优先次序,以天然气价格为基础。最后,一旦它们的事务被放置到块中,被挖掘,然后共享给其他节点,它们的事务就会按包含它们的顺序按照该块定义的顺序发生。

票数 2
EN

Ethereum用户

发布于 2018-11-18 06:02:53

在我看来,更有意义的是将区块链看作一个有序的输入序列,并有一些延迟。

假设我有一个名为C的uint变量的智能契约C

好吧

代码语言:javascript
复制
contract Concurrency {
  uint public c;
}

到现在为止还好。

Player A访问此智能契约,将其值从当前块读取为"4“,并将C增加1,然后根据C现在为"5”的值与智能契约进行大量交互,并将其广播到网络。

这在概念上是误导的。c仍然是4岁,让我们想象一下这样的函数。它将不得不接受一个输入(1)并对它做一些事情。

代码语言:javascript
复制
function addUp(uint x) public {
  c = c + x;
}

太棒了。所以玩家A派Concurrent.addUp(1)c是什么?它仍然是4,玩家2应该知道这一点。为什么?因为交易还没被开采。它是“提交”,而不是“执行”。

Player B访问同一智能契约,从当前块读取值为"4“,但将C增量为5而不是1。他们还与smart契约进行广泛的交互,假设C的值在增量后为9,并将其广播给网络。

好的,玩家B发送Concurrent.addUp(5)。同样,这只是“提交”,而不是执行。每个人都同意,最后一个已知的c4。这两个玩家知道他们自己的交易在队列中,他们也知道可能有来自其他玩家的交易也在飞行中。

一个街区到了。

一堆不相关的东西,然后从玩家B,+5,然后从玩家A,+1。我偏离了预期的顺序,说明没有玩家控制,也没有这样的保证。所以,c说:

代码语言:javascript
复制
4 + 5 = 9;
9 + 1 = 10; // this executes in the context of the previous transaction

当处理这个块时,每个人都会同意c10

为了使这更具有说明性,让我们假设游戏是21,只有在这个游戏中,玩家在9和9以上的半身像是一个完美的游戏。

代码语言:javascript
复制
function addUp(uint x) public {
  c = c + x;
  if(c > 9) playerIsBust();
  if(c == 9) playerWins();
}

现在,网络接受事务的顺序是超关键的。无论哪个玩家的动作先被处理,都会赢得比赛。

这不是一个矿工或节点计算c为其他人的利益的问题。当他们看到块中的输入时,每个人都会自己弄清楚这一点。矿工们消除了交易顺序的歧义。矿商甚至可以自由地决定哪些交易应该包括哪些交易,以及按什么顺序进行。

这个简单的例子创建了一个竞赛条件,这意味着玩家A和玩家B可能正在一场竞购战中,以诱使矿工首先包括他们的交易。这是gasPrice的角色。玩家决定他们愿意支付的优先级。

玩家可以表现得好像他们知道c是什么,但这可能是一个错误。重要的是不要继续错误的假设。他们知道c很可能是4,并且他们提交了一些等待包含在块中的内容。他们知道其他球员可能已经做了他们不知道的事情。如果接触是精心制作,它将不允许任何游戏故事,如果它是违反游戏规则。

总结的另一种方法是说,事务是在前面所有事务的上下文中执行的。块只是一批事务,它们或多或少地在一起到达。第一个完全运行。第二条在第一条留下的州运行。诸若此类。

这里还有一个类似的问题。相同的想法,不同的例子:云母智能合同执行原则

希望能帮上忙。

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

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

复制
相关文章

相似问题

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