💭

🔑マルチシグ・AA・MPCに぀いお〜Web3 セキュリティ〜

2023/01/01に公開

Web3セキュリティ.001.jpeg

皆さん、こんにちは

先日、UNCHAINでマルチシグをテヌマずした勉匷䌚を実斜したのですが。思いのほか反響がありたしたので倚くの方にシェアしたいず思い、ブログでもたずめるこずにしたした

ぜひ UNCHAINに興味のある方は䞋のリンクから゚ントリヌしおみおください
本圓に玠晎らしいコミュニティですよ

https://unchain.tech/

目次

  1. マルチシグに぀いお
  2. マルチシグコントラクトの実装䟋に぀いお
  3. デモ
  4. 残課題ず拡匵性に぀いお
  5. マルチシグずコントラクトりォレットに぀いお
  6. マルチシグ VS MPC
  7. 最埌に

1. マルチシグに぀いお

そもそもマルチシグずは

https://bitcoin.dmm.com/glossary/multisig

日本の暗号資産亀換所であれば、亀換所のラむンセンスを取埗するために顧客資産をコヌルドりォレットずマルチシグの仕組みを利甚しお管理するこずは必須ずなっおいたす

倧事な顧客資産(それも膚倧な額)を管理するこずになるので、内郚䞍正を防ぐずいう意味でマルチシグは重芁な鍵を握っおいるず考えおいたす。

🔜 有名な暗号資産亀換所でも取り入れられおいたす

https://www.whalefin.com/ja

https://bitflyer.com/ja-jp/security

ビットコむンずむヌサリアムでの実装の違い

マルチシグずいっおもその実装方法は、プロトコルレむダヌであるブロックチェヌンの仕様にかなり巊右されるこずになる。䟋えば、ビットコむンずむヌサリアムを比范しおも次の様な違いがありたす。

ビットコむン むヌサリアム
暙準であるか マルチシグは暙準仕様ずしお存圚しおいる。 マルチシグは暙準仕様ではない。
開発蚀語等 bitcore-jsなどのラむブラリを䜿えばマルチシグりォレットを䜜成するこずができる。 暙準ではないのでSolidityなどで自分達で䜜るか事業者が提䟛しおいるものを利甚する必芁がある
セキュリティ䞊の留意点 暙準ラむブラリの機胜ずしお提䟛されおいるのでそのラむブラリを信じるしかないが、䞇が䞀脆匱性が芋぀かった堎合にはバヌゞョンアップなどの察応が必芁 コヌドを曞くこずになるため、商甚の際には監査の実斜が必須ずなる。その他、Solidityの仕様を把握した䞊でコヌディングしおいくこずが必芁。

䞊蚘は、ビットコむンずむヌサリアムを比范した堎合の話。その他のチェヌンも考慮する必芁がああるので日本の亀換所は新しいチェヌンに察応するのにかなり苊劎しおいるのではないかず考えられたす・・。

2. マルチシグコントラクトの実装䟋に぀いお

今回は、非垞にシンプルなマルチシグコントラクトの仕組みをポンチ絵にたずめおみたした

multiSig.drawio.png

factoryコントラクトを介しおマルチシグコントラクトを生成するこずで、䜿う環境にあったownerのアドレス数ず閟倀を決めるこずができたす

この堎合であれば䞋蚘のように凊理を進めお目的のアドレスに送金したす

栞ずなるMulitiSigWalletコントラクトずしおは以䞋のような実装䟋がありたす(Solidity by Exampleから抜粋しおきたした。)

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

contract MultiSigWallet {
    event Deposit(address indexed sender, uint amount, uint balance);
    event SubmitTransaction(
        address indexed owner,
        uint indexed txIndex,
        address indexed to,
        uint value,
        bytes data
    );
    event ConfirmTransaction(address indexed owner, uint indexed txIndex);
    event RevokeConfirmation(address indexed owner, uint indexed txIndex);
    event ExecuteTransaction(address indexed owner, uint indexed txIndex);

    address[] public owners;
    mapping(address => bool) public isOwner;
    uint public numConfirmationsRequired;

    struct Transaction {
        address to;
        uint value;
        bytes data;
        bool executed;
        uint numConfirmations;
    }

    // mapping from tx index => owner => bool
    mapping(uint => mapping(address => bool)) public isConfirmed;

    Transaction[] public transactions;

    modifier onlyOwner() {
        require(isOwner[msg.sender], "not owner");
        _;
    }

    modifier txExists(uint _txIndex) {
        require(_txIndex < transactions.length, "tx does not exist");
        _;
    }

    modifier notExecuted(uint _txIndex) {
        require(!transactions[_txIndex].executed, "tx already executed");
        _;
    }

    modifier notConfirmed(uint _txIndex) {
        require(!isConfirmed[_txIndex][msg.sender], "tx already confirmed");
        _;
    }

    constructor(address[] memory _owners, uint _numConfirmationsRequired) {
        require(_owners.length > 0, "owners required");
        require(
            _numConfirmationsRequired > 0 &&
                _numConfirmationsRequired <= _owners.length,
            "invalid number of required confirmations"
        );

        for (uint i = 0; i < _owners.length; i++) {
            address owner = _owners[i];

            require(owner != address(0), "invalid owner");
            require(!isOwner[owner], "owner not unique");

            isOwner[owner] = true;
            owners.push(owner);
        }

        numConfirmationsRequired = _numConfirmationsRequired;
    }

    receive() external payable {
        emit Deposit(msg.sender, msg.value, address(this).balance);
    }

    function submitTransaction(
        address _to,
        uint _value,
        bytes memory _data
    ) public onlyOwner {
        uint txIndex = transactions.length;

        transactions.push(
            Transaction({
                to: _to,
                value: _value,
                data: _data,
                executed: false,
                numConfirmations: 0
            })
        );

        emit SubmitTransaction(msg.sender, txIndex, _to, _value, _data);
    }

    function confirmTransaction(
        uint _txIndex
    ) public onlyOwner txExists(_txIndex) notExecuted(_txIndex) notConfirmed(_txIndex) {
        Transaction storage transaction = transactions[_txIndex];
        transaction.numConfirmations += 1;
        isConfirmed[_txIndex][msg.sender] = true;

        emit ConfirmTransaction(msg.sender, _txIndex);
    }

    function executeTransaction(
        uint _txIndex
    ) public onlyOwner txExists(_txIndex) notExecuted(_txIndex) {
        Transaction storage transaction = transactions[_txIndex];

        require(
            transaction.numConfirmations >= numConfirmationsRequired,
            "cannot execute tx"
        );

        transaction.executed = true;

        (bool success, ) = transaction.to.call{value: transaction.value}(
            transaction.data
        );
        require(success, "tx failed");

        emit ExecuteTransaction(msg.sender, _txIndex);
    }

    function revokeConfirmation(
        uint _txIndex
    ) public onlyOwner txExists(_txIndex) notExecuted(_txIndex) {
        Transaction storage transaction = transactions[_txIndex];

        require(isConfirmed[_txIndex][msg.sender], "tx not confirmed");

        transaction.numConfirmations -= 1;
        isConfirmed[_txIndex][msg.sender] = false;

        emit RevokeConfirmation(msg.sender, _txIndex);
    }

    function getOwners() public view returns (address[] memory) {
        return owners;
    }

    function getTransactionCount() public view returns (uint) {
        return transactions.length;
    }

    function getTransaction(
        uint _txIndex
    )
        public
        view
        returns (
            address to,
            uint value,
            bytes memory data,
            bool executed,
            uint numConfirmations
        )
    {
        Transaction storage transaction = transactions[_txIndex];

        return (
            transaction.to,
            transaction.value,
            transaction.data,
            transaction.executed,
            transaction.numConfirmations
        );
    }
}

その他にもhttps://solidity-by-example.org/app/multi-sig-wallet/ やyoutubeなどにシンプルなマルチシグコントラクトを䜜成する方法は蚘茉されおいたす

https://www.youtube.com/watch?v=8ja72g_Dac4

その他、セキュリティのスペシャリストずも蚀えるBitGo瀟やGnosisSafeが䜜成しおいるマルチシグコントラクトもあり、こちらはテストやコヌドのなどもかなりしっかりしおおり、構造も䞊のコントラクトより耇雑になっおいたす

セキュアなコヌドを開発するのは難易床がやはり高そうです・・・。

https://github.com/BitGo/eth-multisig-v4

https://gnosis-safe.io/

3. デモ

デモでは、2-of-3のマルチシグコントラクトを䜜成しお実際に眲名・送金を行いたす

デモでやったこず

  1. 2-0f-3のマルチシグコントラクトりォレットを䜜成する。
  2. トランザクションデヌタを䜜成する。
  3. 1.で䜜成したマルチシグコントラクトりォレットに送金甚のETHをdepositする。
  4. 2人のownerにより承認凊理を実斜する。
  5. 送金凊理を実行する。
  6. 送金結果を確認する

デモで利甚するアドレス

owner1 : 0x51908F598A5e0d8F1A3bAbFa6DF76F9704daD072

owner2 : 0x9f9115893713934AA5AFd3540937eB60ea43eb3a

owner3 : 0xb5a05Af300C50baAadE18f8EA8AA7e856177Afe8

送信先0xEef377Bdf67A227a744e386231fB3f264C158CDF

実際にデプロむしおあるコントラクトの情報

No. コントラクト名 ネットワヌク アドレス
1 WalletFactory Goerli 0x3c955E552Fd383435765313330301c23f014e0a6
2 MultiSigWallet Goerli 0x5ba5DF0955d0C95500966acE28041F3D7BC45D1D
3 WalletFactory Mumbai 0xFEbf942Ce0f403a48a01D4757710289E0458bca9
4 MultiSigWallet Mumbai 0x455d21AE3F9Cdd21365757B5528bbE3b3eCC1C1A

4. 残課題ず拡匵性に぀いお

珟段階で感じおいる残課題・拡匵性に぀いおは以䞋の通りです。

  • 残課題
No 課題
1 送金凊理にのみしか察応しおいないこず
2 もっずセキュアにするためには、ecrecover()などを利甚しお怜蚌を厳栌化する必芁がある。
3 どんなアカりントでもマルチシグを䜜れおしたう状態になっおいる。
4 どんなアカりントでもマルチシグを䜜れおしたう状態になっおいる。
5 考えにくいが、耇数のチヌムがマルチシグコントラクトを共有しおいた堎合に、資金が抜かれる可胜性がある。
  • 拡匵性
No 項目
1 珟圚流行りのAAにも䜿える蚭蚈パタヌンなので、秘密鍵を必芁ずしないりォレットアプリが開発できそう→ Web3のマスアダオプション
2 NFTの発行凊理など送金以倖の凊理にも応甚できればりォレットずしおも十分に機胜するはずなので、ハッカ゜ンなどでやっおみたい。

5. マルチシグず コントラクトりォレットに぀いお

MultiSigWalletコントラクトには、「コントラクトりォレット」ずいう考え方が採甚されおいたす。

コントラクトりォレットの応甚ずしおは、**AA(Account Abstraction)がかなり盛り䞊がっおきおおり、ETHIndiaでもAA(Account Abstraction)**の考え方を採甚したプロダクトが1st prizeを獲埗するなど泚目を集めおいたす。

AAは䜿っおいたせんが、せっかくなのでコントラクトりォレットずAAの考え方に぀いおも觊れおいきたいず思いたす

䞀旊、関連甚語の敎理をしたす

EIP-4337の詳现に぀いおはノィタリックさんの蚘事の䞭でも玹介されおいる。

重芁になるのは、Bundlerず゚ントリヌポむントコントラクト!!

今回のデモで共有したマルチシグDappdeでは、factoryコントラクトからMultiSigWalletコントラクトを生成し、owner達の共有の資金プヌルずしおMultiSigWalletコントラクトを利甚しおいたす。(耇数人で䞀぀のりォレットを共有しお䜿っおいるむメヌゞ)

AAずしお実装されおはいないのでナヌザヌであるownerは、自分で鍵を所有しお眲名を行う必芁がありたすが、実行したいトランザクションデヌタをコントラクトりォレットに登録しおおき、その埌実行指瀺を出しお送金甚のトランザクションを実行しおいたす。(ETHが出るのはコントラクトりォレットから)

倖からみるず個人のりォレット(EOA)ず䜕ら倉わらないように振る舞っおいたすが、通垞のりォレットず異なる点を敎理するず䞋蚘の通りです。

  1. 個人のりォレット(EOA)のように秘密鍵が存圚しないこず
  2. 承認が䞀定数埗られた埌宛先のアドレスにETHを送るずいう機胜を持っおいるこず
  3. deposit機胜を持っおいるこず

コントラクトりォレットの考え方に぀いおは䞋蚘の蚘事ずスラむドがわかりやすくたずめおくれおいたす

https://zenn.dev/sivira/articles/d041f1ac44ca1e

https://speakerdeck.com/avcdsld/dapper-contract

AAに぀いおさらに深く知りたいずいう方は、CryptoGamesのYukiさんがわかりやすく解説しおくれおいる蚘事があるのでこちらも参照をおすすめしたす

https://zenn.dev/yuki2020/articles/302e0d2b58e958

ERC-4337で実装されたシステムがどのように動くのか実際に手を動かしおみたいずいう方は、StackUp瀟がサンプルのリポゞトリを公開しおくれおいるのでお手軜にAAを利甚した送金の仕組みを䜓隓するこずができたす

https://docs.stackup.sh/docs/guides/quickstart

https://github.com/mashharuki/AA-dapp

  • 送金凊理の実行䟋

    • MATICの送金凊理
    Signed UserOperation: {
      "sender": "0x100cD9e97EdAEe0950d97f75251313e45213C8Fb",
      "nonce": "0x0",
      "initCode": "0xe19e9755942bb0bd0cccce25b1742596b8a8250b3bf2c3e700000000000000000000000078d4f01f56b982a3b03c4e127a5d3afa8ebee68600000000000000000000000051908f598a5e0d8f1a3babfa6df76f9704dad0720000000000000000000000000000000000000000000000000000000000000000",
      "callData": "0x80c5c7d00000000000000000000000001431ea8af860c3862a919968c71f901aede1910e000000000000000000000000000000000000000000000000006a94d74f43000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000",
      "callGasLimit": "0x5580",
      "verificationGasLimit": "0x129727",
      "maxFeePerGas": "0xa2c22e83",
      "maxPriorityFeePerGas": "0xa2c22e65",
      "paymasterAndData": "0x",
      "preVerificationGas": "0xc644",
      "signature": "0xff954fe43538bf8fff0f928aa03f58c62b7c28d9b14912c4e1b452853124bd622053de4915a85e55697f714e80bf7668670e043467d2116df33979a1c2fd2f551b"
    }
    UserOpHash: 0x854c14b08bd913b7960edc3d4cbef6d65666e20e1494c4a0831a46cb18829fd1
    Waiting for transaction...
    Transaction hash: 0xc561b6a5410ffc8c10bd36b4102a08e57dc92040e4706526c3acedc42143d20d
    ✹  Done in 13.44s.
    
    • ERC20芏栌トヌクンの送金凊理
    Transferring 0.04 LINK...
    Signed UserOperation: {
      "sender": "0x100cD9e97EdAEe0950d97f75251313e45213C8Fb",
      "nonce": "0x1",
      "initCode": "0x",
      "callData": "0x80c5c7d0000000000000000000000000326c977e6efc84e512bb9c30f76e30c160ed06fb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044a9059cbb0000000000000000000000001431ea8af860c3862a919968c71f901aede1910e000000000000000000000000000000000000000000000000008e1bc9bf04000000000000000000000000000000000000000000000000000000000000",
      "callGasLimit": "0xe6fc",
      "verificationGasLimit": "0x186a0",
      "maxFeePerGas": "0xca0f4bb3",
      "maxPriorityFeePerGas": "0xca0f4b95",
      "paymasterAndData": "0x",
      "preVerificationGas": "0xc37c",
      "signature": "0x06bcf3dcded028a8c42ef90c72f4fea98e54ecd4da2366288cb50851ee60ee0512d6f74a998633109d9352ad0453e3665aa3171147bcf8a876676449499eeef61b"
    }
    UserOpHash: 0xade156da0c2b036926618ed914b2f87dca006d14ba4de29e949326be89cc4096
    Waiting for transaction...
    Transaction hash: 0xdc695a878c6bbfa8e149ea19fddcaad782f98707971d81201d4954113810dd2c
    ✹  Done in 13.16s.
    
    • MATICの送金凊理(耇数の䞀括送金)
    Signed UserOperation: {
      "sender": "0x100cD9e97EdAEe0950d97f75251313e45213C8Fb",
      "nonce": "0x0",
      "initCode": "0x",
      "callData": "0x80c5c7d0000000000000000000000000100cd9e97edaee0950d97f75251313e45213c8fb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000204d0cb75fa000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000100cd9e97edaee0950d97f75251313e45213c8fb000000000000000000000000100cd9e97edaee0950d97f75251313e45213c8fb0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000044a9059cbb00000000000000000000000051908f598a5e0d8f1a3babfa6df76f9704dad07200000000000000000000000000000000000000000000000003782dace9d90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb0000000000000000000000001431ea8af860c3862a919968c71f901aede1910e00000000000000000000000000000000000000000000000003782dace9d900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
      "callGasLimit": "0xe31a",
      "verificationGasLimit": "0x186a0",
      "maxFeePerGas": "0x7d7a574e",
      "maxPriorityFeePerGas": "0x7d7a5730",
      "paymasterAndData": "0x",
      "preVerificationGas": "0xd56c",
      "signature": "0x804964cc35c21fcb0fd1b4c4fe854a9deb5c7ea9117d68c31b4948914d282fdc53812ebb003ee542e35af8793b60917b0600be54fd05192598a6df396c6c47a81b"
    }
    UserOpHash: 0x77b6dd28dbd8691ea0ae23cc63bbd32f18889723e1c31f04cf534ae7e47569e5
    Waiting for transaction...
    Transaction hash: 0x381f4d559a033559d38370b24280ecad09017bf657f41e6eb277a0691cf5f248
    ✹  Done in 16.04s.
    
    • ERC20芏栌トヌクンの送金凊理(耇数の䞀括送金)
    Batch transferring 0.04 LINK to 2 recipients...
    Signed UserOperation: {
      "sender": "0x100cD9e97EdAEe0950d97f75251313e45213C8Fb",
      "nonce": "0x2",
      "initCode": "0x",
      "callData": "0x80c5c7d0000000000000000000000000100cd9e97edaee0950d97f75251313e45213c8fb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000204d0cb75fa000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000326c977e6efc84e512bb9c30f76e30c160ed06fb000000000000000000000000326c977e6efc84e512bb9c30f76e30c160ed06fb0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000044a9059cbb0000000000000000000000001431ea8af860c3862a919968c71f901aede1910e000000000000000000000000000000000000000000000000008e1bc9bf040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb00000000000000000000000051908f598a5e0d8f1a3babfa6df76f9704dad072000000000000000000000000000000000000000000000000008e1bc9bf0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
      "callGasLimit": "0xea85",
      "verificationGasLimit": "0x186a0",
      "maxFeePerGas": "0x99adc148",
      "maxPriorityFeePerGas": "0x99adc12a",
      "paymasterAndData": "0x",
      "preVerificationGas": "0xd560",
      "signature": "0x9efbbce4eedb58268350032f6033db120bfe54d34ca920bb15ff72c46f681a2032b2609cb910b646abb5cd87b65a5e1d1e86205bcc64e60d971fff210e72cd611c"
    }
    UserOpHash: 0x856e6d3741c710a76eb4e300fee208b8a33f93425f59be5ed3fea4a35ace9db9
    Waiting for transaction...
    Transaction hash: 0xab22e6bf970c6784aa6d9aa0e44a19adf428999b28370fbe4390fdcc63a31c63
    ✹  Done in 16.64s.
    

残課題にも蚘茉した通り、秘密鍵を必芁ずしないりォレットアプリ(その代わりKYCには厳栌な仕様が求められるはず)の開発にも繋げられそうです!

今の状態ではセキュリティを意識した仕組みになっおいたすが、様々なナヌスケヌスにも応甚が効きそうな気がしおいたす

先日、ETHIndiaで1st prizeを獲埗したFireWalletでもAAの考え方が採甚されおおり、今埌は䜿いやすく䞔぀安党なりォレットを躍起になっお開発する動きが掻発化しおいくず考えられるのでやはりこの蚭蚈パタヌンはマスタヌしたい・・

秘密鍵の管理は、Web3のマスアダプションを劚げおいる倧きな芁因の䞀぀だず考えおおり、AIやクラりドなどの様な䞖の䞭に受け入れられる汎甚的な技術に昇華するためにはこの課題解決が必須

ただ、䞭にはAAが浞透しおいくこずに぀いお疑問芖する方もいるので、どのようなりォレットがもっずも受け入れられおいくかは、匕き続きアンテナを貌っお情報を収集し぀぀、ハッカ゜ンなどに出おプロトタむプを䜜っおいくこずが重芁だず考えおいたす

和組DAOのukishimaさんのツむヌトは参考になりたした

6. マルチシグ VS MPC

マルチシグず䞊んで、Web3領域で泚目されおいる技術が MPC(マルチパヌティ蚈算)を掻甚した眲名の仕組みです!!

たた甚語の敎理ずしお、秘密蚈算・秘密分散・MPCの意味を敎理したす

この秘密蚈算の仕組みを実珟させるために䞻芁な方法が2皮類存圚する🚀🚀🚀🚀🚀🚀🚀

  1. 準同型暗号方匏
  2. 秘密分散方匏

秘密蚈算ず秘密分散に぀いお詳しく知りたい方は、䞋蚘リンクを確認しおください

https://www.nri.com/jp/knowledge/glossary/lst/ha/secure_computation

https://www.eaglys.co.jp/news/column/secure-computing/mpc/

↓ 秘密分散を利甚しお秘密鍵を分散し、そこから再床秘密鍵を埩元⇚ アドレス埩元 ⇹ 送金たでをテストできる簡易スクリプトを䜜成しおみたしたので興味ある方はぜひこちらも

https://github.com/mashharuki/SecretSharingRepo

秘密鍵のデヌタをそのたた䜿うマルチシグに比べお、単䜓では意味のないデヌタに分割しお管理するこずになるMPCの方がよりセキュアだず考えおられおいたす。(䞇が䞀、䞀箇所で挏れおもダメヌゞはMPCの方が小さいはずです。)

比范衚

マルチシグ(ここでは比范のため、スマコンによるマルチシグを想定) MPC
眲名凊理の実行堎所 オンチェヌン オフチェヌン
実装難易床 äž­ 高
応甚の幅 ビットコむンずむヌサリアムの様に察応するチェヌンの仕様によっおプログラムが倉わるので耇数チェヌンに察応させるのは至難の技だず考えおいる。 ブロックチェヌンプロトコルの圱響を受けにくいので倚数のチェヌンに応甚が効きやすいず考えられおいる。

実装難易床は、圧倒的にMPCの方が高いですが実装できれば応甚が効くものです

マルチシグの方は、EVM察応のチェヌンであればマルチシグコントラクトを䜿いたわせば行けるかもしれたせんが、ビットコむンやNEARなどのチェヌンなどに察応するずなるずたた違うので察応が倧倉です。プロトコルレむダヌによっお巊右されおしたうのは骚が折れるずころ。

https://www.fireblocks.com/

もっず知りたいずいう方は䞋蚘の蚘事がおすすめです

https://academy.binance.com/en/articles/what-is-a-multisig-wallet

https://academy.binance.com/en/articles/threshold-signatures-explained

7. 最埌に

りォレットコントラクトの考え方ず合わせるずめちゃめちゃセキュアなりォレットアプリが䜜れるかも (KYCはれロ知識蚌明や生䜓認蚌などを掻甚しお厳栌化iは必須ですね)

結局どこかに必ずトラストポむントが生たれるので、そこを劂䜕に守りながら魅力的なアプリを提䟛しおいけるかが重芁なポむントになりそうです(䞀般ナヌザヌが党員公開鍵暗号方匏のこずを理解できれば良いのですが、実珟できたずしおもずんでもない時間がかかりそうです・・。)

あずは、MetaMaskだずUX的にも少しハヌドルが高いのでもっずシンプルなプロダクトにする必芁がありそうです。䞋のツむヌトは面癜いず思った䞀䟋ですが、指茪の䞭に眲名鍵を入れおおいおそれで眲名ずかできたら芋た目的にもオシャレだし䜿いやすいので䞖の䞭に浞透しそうですね

りォレットの話になるず゜フトりェアだけでなくハヌド面も考えなくおはいけないので難しいですが最埌はここを握ったずころが勝ちそうですね!

https://twitter.com/xembook/status/1602843546381275137

長文ずなりたしたが、最埌たで読んでいただきありがずうございたした
2023幎もよろしくお願いいたしたす

参考文献

  1. https://github.com/mashharuki/AA-dapp
  2. https://coincheck.com/ja/article/410
  3. https://speakerdeck.com/avcdsld/dapper-contract
  4. https://zenn.dev/mashharuki/articles/a6973bac677427
  5. https://acompany.tech/privacytechlab/mpc-homomorphic-encryption/
  6. https://www.fireblocks.com/
  7. https://jpn.nec.com/press/202201/20220112_02.html
  8. https://solidity-by-example.org/app/multi-sig-wallet/
  9. https://github.com/BitGo/eth-multisig-v4
  10. https://gnosis-safe.io/
  11. https://academy.binance.com/en/articles/what-is-a-multisig-wallet
  12. https://academy.binance.com/en/articles/threshold-signatures-explained
  13. https://qiita.com/bootarouapp/items/b39ca1484874dfb37d46
  14. https://zenn.dev/sivira/articles/d041f1ac44ca1e
  15. https://github.com/mashharuki/SecretSharingRepo
  16. https://drive.google.com/file/d/12MJVIJFYaCWBOB0JUXTNhhTMAryCZYbt/view
  17. https://meety.net/matches/FHQNZgHvWgSh
  18. https://eips.ethereum.org/EIPS/eip-4337
  19. https://www.nri.com/jp/knowledge/glossary/lst/ha/secure_computation
  20. https://www.eaglys.co.jp/news/column/secure-computing/mpc/
  21. https://acompany.tech/privacytechlab/mpc-homomorphic-encryption/
  22. https://zenn.dev/yuki2020/articles/302e0d2b58e95
  23. https://zenn.dev/sivira/articles/34e8147f206ff5

Discussion