😺

[Astar]コントラクト備忘録46(Polkadot.jsを使って、マルチシグアカウントを作成しよう!)

2023/03/14に公開

本日は、Polkadot.jsを使って、マルチシグアカウントの作成を見ていきます。

こちらを参考にしています。

https://polkadot.js.org/docs/util-crypto/examples/create-multisig

では、見てみましょう。

下のように、所有者が3、thresholdが2なので、3分の2の署名でトランザクションができるマルチシグウォレットを例にやってみましょう。


https://polkadot.js.org/docs/util-crypto/examples/create-multisig

まずは、こちらです。

const multiAddress = createKeyMulti(addresses, threshold);

createKeyMulti関数を使って、マルチシグアカウントの公開鍵を生成しています。

所有者のアドレス群とthresholdがあればできるのですね。

そして、次がこちらです。

// Convert byte array to SS58 encoding.
  const Ss58Address = encodeAddress(multiAddress, SS58Prefix);

encodeAddress関数を使って、SS58形式にエンコードしています。

ここで、SS58Prefixが必要なようです。

なお、Polkadotの場合は「0」のようです。

次はこちらです。

const otherSignatories = addresses.filter((who) => who !== addresses[index]);

ここでは、filter関数を使い、送信者以外のアカウントを取り出しています。

そのため、indexは0を使っています。

そして、最後はこちらです。

const otherSignatoriesSorted = sortAddresses(otherSignatories, SS58Prefix);

sortAddresses関数を用いて、昇順にソートしているようです。

こちら、実行すると、このようにマルチシグアカウントが作成できていることが確認できました。


import {createKeyMulti,encodeAddress,sortAddresses} from '@polkadot/util-crypto'


const inter = Inter({ subsets: ['latin'] })

const SS58Prefix = 0;

// Input the addresses that will make up the multisig account.
const addresses = [
  '1nUC7afqmo7zwRFWxDjrUQu9skk6fk99pafb4SiyGSRc8z3',
  '1ZX2XntfLEHrBPy73DpfQp9rG7pbLyvrFjEpi7mNKQgyga5',
  '14b1kB7CrqzRUeMsKc26FJ73f8FCpxAX6sNieu9gfYSfJuoL'
];

// The number of accounts that must approve. Must be greater than 0 and less than
// or equal to the total number of addresses.
const threshold = 2;

// The address (as index in `addresses`) that will submit a transaction.
const index = 0;

export default function Home() {

  async function createMultisig () {
    const multiAddress = createKeyMulti(addresses, threshold);

    console.log(`\nMultiAddress: ${multiAddress}`);
    // Convert byte array to SS58 encoding.
    const Ss58Address = encodeAddress(multiAddress, SS58Prefix);
  
    console.log(`\nMultisig Address: ${Ss58Address}`);
  
    // Take addresses and remove the sender.
    const otherSignatories = addresses.filter((who) => who !== addresses[index]);
  
    // Sort them by public key.
    const otherSignatoriesSorted = sortAddresses(otherSignatories, SS58Prefix);
  
    console.log(`\nOther Signatories: ${otherSignatoriesSorted}\n`);
  
  }
  
<button onClick={createMultisig}>create Multisig</button>

今回は以上です。

Discussion