すべての Sequence ウォレットには、しきい値と署名者ごとの重みで定義された設定があります。

設定レイアウト

名前範囲説明
しきい値uint161 - 65535署名が有効とみなされるために必要な署名者の合計「重み」です。
署名者signer[]無制限(ガスによる制約あり)署名者とその「重み」のリストです。

署名者レイアウト

名前範囲説明
「重み」uint80 - 255各署名者の署名ごとの「重み」です。
「アドレス」"address"署名者の「アドレス」。EOA または EIP-1271 対応の他のスマートコントラクトウォレットである場合があります。

{

  "threshold": 5,

  "signers": [

    {

      "address": "0x4fbf69aa2a75f9942a768dc8da7804ec965f7bea",

      "weight": 2

    },

    {

      "address": "0x596af90cecdbf9a768886e771178fd5561dd27ab",

      "weight": 3

    },

    {

      "address": "0x6192e0fdcd868b3de01c7fbc0ad98baebd7330c1",

      "weight": 2

    },

    {

      "address": "0xec9a7204a43d3f4a82c84fde92d25bfc9110981e",

      "weight": 1

    }

  ]

}

この例では、しきい値が5、署名者が4人です。

有効な署名者の組み合わせは以下の通りです:

- 0x4fbf69aa2a75f9942a768dc8da7804ec965f7bea & 0x596af90cecdbf9a768886e771178fd5561dd27ab - combined weight of 2 + 3 = 5

- 0x6192e0fdcd868b3de01c7fbc0ad98baebd7330c1 & 0x596af90cecdbf9a768886e771178fd5561dd27ab - combined weight of 2 + 3 = 5

- 0x4fbf69aa2a75f9942a768dc8da7804ec965f7bea, 0x6192e0fdcd868b3de01c7fbc0ad98baebd7330c1 & 0xec9a7204a43d3f4a82c84fde92d25bfc9110981e - combined weight of 2 + 2 + 1 = 5

しきい値未満の合計重みの署名者の組み合わせは無効とみなされ、しきい値を超える追加署名者は無視されます。

設定ハッシュ - ImageHash

設定はコントラクト上に直接保存されることはなく、ハッシュ化されて署名検証時に毎回チェックされます。これにより、ウォレットコントラクトはストレージの使用とガスコストを削減できます。

一度も更新されていないウォレットは imageHash を直接保存せず、imageHash がコントラクト作成時の salt として使われ、署名はウォレットアドレスに対して検証されます。

image hash の計算

  keccak256(abi.encode( uint8 weight_1, address signer_1,

  keccak256(abi.encode( uint8 weight_2, address signer_2,

  keccak256(abi.encode( uint8 weight_3, address signer_3,

  keccak256(abi.encode( uint256 threshold )) )) )) )) 

初期ウォレット設定

初期のウォレット設定がウォレットのアドレスを決定し、その後の更新ではアドレスは変わりません。

ウォレットアドレスは、imageHashfactorymainModule を使って計算できます。

ウォレットアドレスの計算方法

// The code of the wallet proxy contract

const WalletProxyBytecode =

"0x603a600e3d39601a805130553df3363d3d373d3d3d363d30545af43d82803e903d91601857fd5bf3";



// These values are defined by the wallet context

// they must be known in order to validate the counter-factual wallet imageHash

const factory = "0xf9D09D634Fb818b05149329C1dcCFAeA53639d96";

const mainModule = "0xd01F11855bCcb95f88D7A48492F66410d4637313";



// Append the `mainModule` to the `WalletProxyBytecode`

// this completed the creation code of the proxy contract

// used for computing the wallet address as defined by the CREATE2 opcode

const codeHash = ethers.solidityPackedKeccak256(

ethers.solidityPackedKeccak256(

["bytes", "bytes32"],

[WalletContractBytecode, ethers.hexZeroPad(mainModule, 32)]

)

);



// Compute the wallet address

const hash = ethers.solidityPackedKeccak256(

ethers.solidityPackedKeccak256(

["bytes1", "address", "bytes32", "bytes32"],

["0xff", factory, salt, codeHash]

)

);



const address = ethers.getAddress(ethers.dataSlice(hash, 12));