收藏本页
返回顶部

币海首页> 要闻资讯 > 文章

FunFair:状态通道合约的参考实现(二)

来源:以太坊爱好者    Aries 2019-11-08 17:02 星期五 1,017
币海网微博
微信扫一扫

我们需要处理几个极端案例。

无 Action 争议

比起极端案例,这更像是一种优化。如果我已经发起了一个 action ,而你又将你对新状态的签名发送了给我,但是没有再发起一个 action ,我可以用你对该状态的签名发起一个争议,而不一定要在链上实现整个状态转换。

但是,要注意的是,如果你以这种方式发起了一个争议,然后下一个可以发起 action 的参与方只能是你的话,那么麻烦就来了,因为你不能解决自己的争议。

同意并关闭通道最后这一点是必要的。鉴于我们对可终止性(finalisability)的定义,你不能强迫参与者在一个可终止的状态下继续发起 action 。这就好比是在玩家想要停止并关闭通道之时,强迫他们重新再玩一局。

因此,我们有了另一种 resolveDisputeWithAction() ——如果该争议采取的状态具有可终止性,对手方可以直接同意该状态通道,并要求以可确定状态关闭这条通道。争议发起者已经签署了可终止状态,不需要再签署关闭通道请求。对手方要调用:

输入一个已签署过的 “End Channel” 类 action (这里用现成的 action 范例会比较清楚)和状态。这两个输入都要经受常规检查,如果状态确实具有可终止性的话,状态通道就可以在不做出惩罚的情况下正常关闭。

为状态通道提供资金

如上文所述,openChannel方法是针对内部的,并且认为资金已锁定在合约内。这可以通过很多方法来实现。由于我们的用例是通过 ERC20 代币来实现的,我们现有的实现就利用了这一点。这就意味着我们可以在代币合约中新增多签名功能——我们也已经这么做了。在 FUNTokenController.sol 中,你会看到 multiSigTokenTransferAndContractCall() 函数。这个函数可以让参与双方联合签署信息,从各自的账户中将代币转移到第三方账户中,然后对地址上的合约调用 afterMultiSigTransfer() 方法。

然后,我们从 DisputableStateChannel 中衍生出了一个新的类型,有一个很抓人眼球的名称叫作 TokenMultiSigStateChannel ,使用的是 afterMultiSigTransfer() 方法。该代码假定代币转移是都是通过该方法调用实现的,因此该代码是被严格锁定的,只有白名单内的地址才能调用它。

最后是代码中最复杂的一部分。代币合约中的多签名转移方法需要自己的一套数据,以及开启通道所需的数据包。我们需要手动验证数据的一致性——如果参与者的余额与代币合约所转移的余额不同,我们就无法开启状态通道。虽然有点丑,但是将代码拆成这样就代表只有这个合约需要了解执行多签转账所需的数据结构。

一旦经过验证之后,该函数就可以在其父类上调用 openChannel() 方法,为状态通道注入资金,令其成功开启。

为状态通道提供资金的方法有很多,这不是其中最简单或是最常用的一种。但它有一个很明显的优点,就是可以通过一个交易来开启通道。我们依旧相信,为用户节省成本和时间是一件好事。

点击关注币海启行微信公众号,了解更多。

版权信息
来源:以太坊爱好者
版权:转载
原文链接:https://www.bihai123.com.cn/news/jishuyingyong/68072.html
作者:
编译发布:Aries
声明:
此文为转载内容,不代表币海启行网的观点和立场,仅供参考。

相关文章

用户评论 (0)

0/140

关注支持

内容合作 / 友情链接

服务与应用

币海公众号
扫一扫,关注币海
币海网

区块链行业资讯链媒[币海资讯官网]

  CopCopright @币海网 · 前海宏创投资(深圳)有限公司 · 版权所有