文章插图
现在试想一下,爱丽丝和鲍勃想玩一场井字游戏,赢家可以获得一个以太币 。实现这一目的的最简单方法就是在以太坊上创建一个智能合约,实现井字游戏规则并跟踪每个玩家的动作 。每次玩家想要移动时,他们都会向合约发送一个交易 。当一名玩家获胜时,根据规则,合约会付给赢家一个以太币 。
这样是可行的,但是效率低下且速度慢 。爱丽丝和鲍勃正在使用整个以太网络处理他们的游戏过程,这对于他们的需求来说有点不合时宜 。他们每一步都需要支付挖矿费用(gas),并且还要在进行游戏的下一步之前都要等待挖矿完成 。
不过,我们可以设计一个新的系统,它能使爱丽丝和鲍勃在井字游戏的过程中产生尽可能少的链上操作 。爱丽丝和鲍勃能够以链下的方式更新游戏状态,同时在需要时仍能将其重归到以太坊主链上 。我们将这样一个系统称之为“状态通道” 。
首先,我们在以太坊主链上创建一个能够理解井字游戏规则的智能合约 “Judge”,同时它也能够认定爱丽丝和鲍勃是我们游戏中的两位玩家 。该合约持有一个以太的奖励 。
然后,爱丽丝和鲍勃开始玩游戏 。爱丽丝创建并签署一个交易,它描述了她游戏的第一步,然后将其发送给鲍勃,鲍勃也签署了它,再将签名后的版本发回并保留一份副本 。然后鲍勃也创建并签署一个描述他游戏中第一步的交易,并发送给爱丽丝,她也会签署它,再将其返回,并保留一份副本,他们每一次都会这样互相更新游戏的当前状态 。每一笔交易都包含一个“随机数”,这样我们就可以直接知道游戏中走棋的顺序 。
到目前为止,还没有发生任何链上的操作 。爱丽丝和鲍勃只是通过互联网向彼此发送交易,但没有任何事情涉及到区块链 。但是,所有交易都可以发送给 Judge 合约,也就是说,它们是有效的以太坊交易 。你可以把这看做两人在彼此来回填写了一系列经过区块链认证的支票 。实际上,并没有钱从银行中存入或取出,但是他俩都有一堆可以随时存入的支票 。
当爱丽丝和鲍勃结束游戏时(可能是因为爱丽丝赢了),他们可以通过向 Judge 合约提交最终状态(比如,交易列表)来关闭该通道,这样就只用付一次交易费用 。Judge 会确定双方都签署了这个“最终状态”,并等待一段时间来确保没人会对结果提出合理质疑,然后向爱丽丝支付一个以太币的奖励 。
为什么我们需要设置一个让 Judge 合约等待一下的"质疑时间"
假设,鲍勃并没有给 Judge 发送一份真实的最终状态,而是发送一份之前他赢了爱丽丝的状态 。这时如果 Judge 是一个非智能合约,它自己根本无法得知这个状态是否是最近的状态 。
而质疑时间给了爱丽丝一个机会能够证明鲍勃提交了虚假的游戏最终状态 。如果有更近期的状态,她就会有一份已签名交易的副本,并可以将其提供给 Judge 。Judge 可以通过检查随机数来判断爱丽丝的版本是否更新,然后鲍勃盗取胜利的企图就能被驳回了 。
特性和限制
状态通道在许多应用中都很有用,它们对于在链上执行操作是一种严密的改进 。但在决定应用程序是否适合被通道化时,请特别注意需要做出的一些特定折中:
状态通道依赖于可靠性 。如果爱丽丝在质疑时间内掉线了(也许是鲍勃不顾一切地想要赢下奖品,而破坏了她家的互联网连接),她可能无法在质疑时间内做出回应 。但是,爱丽丝可以付款给其他人,让其保存一份她的状态副本,并作为她的权益代表,以保持系统的可靠性 。
- 摩根大通:以太坊将引领400亿美元的Staking行业!
- cpu c states开不开
- 以太网链路聚合
- 如何保护1000M千兆以太网口免受雷击浪涌静电放电威胁?
- Django利用Channels+websocket开发聊天室
- 史坦顿岛
- 以太坊区块交易信息
- 德州仪器TM4C1294KCPDT微控制器以太网LwIP使用教程
- 305、46张图带你了解线缆、WIFI、以太网协议和网络寻址
- 45张图了解网络传输、WIFI、以太网协议和网络寻址