首页 > 品牌导购 > 查看内容
  • 分享到

探讨更简单的以太坊多重签名合约

2018-06-22 18:37

来源:零识区块链

作者:Christian Lundkvist



完整的代码为:

pragma solidity 0.4.14;

contract SimpleMultiSig {

  uint publicnonce;                // (only) mutablestate

  uint publicthreshold;            // immutable state

  mapping(address => bool) isOwner; // immutable state

  address[]public ownersArr;        // immutablestate

  function SimpleMultiSig(uint threshold_,address[] owners_) {

    if(owners_.length > 10 || threshold_ > owners_.length || threshold_ == 0){throw;}

    for (uinti=0; i

     isOwner[owners_[i]] = true;

    }

    ownersArr= owners_;

    threshold= threshold_;

  }

  // Notethat address recovered from signatures must be strictly increasing

  functionexecute(uint8[] sigV, bytes32[] sigR, bytes32[] sigS, address destination, uintvalue, bytes data) {

    if(sigR.length != threshold) {throw;}

    if(sigR.length != sigS.length || sigR.length != sigV.length) {throw;}

    //Follows ERC191 signature scheme: https://github.com/ethereum/EIPs/issues/191

    bytes32txHash = sha3(byte(0x19), byte(0), this, destination, value, data, nonce);

    addresslastAdd = address(0); // cannot have address(0) as an owner

    for (uinti = 0; i < threshold; i++) {

       address recovered = ecrecover(txHash, sigV[i], sigR[i], sigS[i]);

        if(recovered <= lastAdd || !isOwner[recovered]) throw;

       lastAdd = recovered;

    }

    // If wemake it here all signatures are accounted for

    nonce =nonce + 1;

    if(!destination.call.value(value)(data)) {throw;}

  }

  function ()payable {}

}

此代码也可以在github中找到。

效益

此合约的有益属性包括:

l  最小代码库:只有40行代码

l  最少可变状态:唯一可变的数据是,每一次执行都会增加一个单元(unit)。

l  最小界面:由单一功能构成的界面.

l  能够发送任意交易,故而支持代币(token)

由于缺乏复杂的状态转换,在没有资金的情况下,该合约便无法转入“冻结”状态。而因为唯一可能的状态转换是简单的增量计数器,所以该合约永远处于正确状态。且由于使用了32字节的整数,计数器便不可能溢出。同时,测试也变得更简单了,因为事实上(除构造函数外)只有一个函数需要测试。

但由于我们尽可能地简化了链上逻辑,因而增加了链下工作流程的复杂性,这便导致了一些缺陷与不足,比如:

l   需要用户给非交易签名,而这可能妨碍某些硬件钱包的使用

l  为了发送交易,需要终端用户进行链下协调。


发表评论
回顶部