کیف پول Multi-Sig (کیف پول چند امضا) به کیف پولی اطلاق می‌شود که برای انجام یک تراکنش به امضای چندین شخص (یا کلید خصوصی) نیاز دارد. این مورد معمولاً به عنوان یک روش امنیتی برای محافظت از دارایی‌های دیجیتال استفاده می‌شود. در این مقاله، مراحل ساخت کیف پول multi sig با سالیدیتی را بررسی خواهیم کرد.

الف) راه اندازی محیط توسعه

قبل از اینکه به نوشتن قرارداد بپردازیم، باید اطمینان حاصل کنید که ابزارهای زیر را نصب کرده‌اید:

  • Node.js: برای اجرای برنامه‌ها و مدیریت بسته‌ها
  • Truffle یا Hardhat: برای توسعه و تست قراردادهای هوشمند

می‌توانید یکی از این دو ابزار را به دلخواه نصب کنید. در اینجا، از Hardhat به عنوان مثال استفاده می‌کنیم.

npm install --save-dev hardhat

ب) ساخت کیف پول multi sig با سالیدیتی

حال که محیط را راه‌اندازی کردید، می‌توانید قرارداد Multi-Sig خود را بنویسید. یک فایل جدید به نام MultiSigWallet.sol در پوشه پروژه‌ی خود ایجاد کنید. محتوای زیر را به آن اضافه کنید:

// SPDX-License-Identifier: MIT
pragma solidity ^.8.;

contract MultiSigWallet {
    address[] public owners;
    mapping(address => bool) public isOwner;
    uint public requiredSignatures;

    struct Transaction {
        address to;
        uint value;
        bool executed;
        uint confirmations;
    }

    Transaction[] public transactions;
    mapping(uint => mapping(address => bool)) public confirmations;

    event Deposit(address indexed sender, uint amount);
    event TransactionCreated(uint indexed transactionId, address indexed to, uint value);
    event TransactionConfirmed(uint indexed transactionId, address indexed owner);
    event TransactionExecuted(uint indexed transactionId);

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

    constructor(address[] memory _owners, uint _requiredSignatures) {
        require(_owners.length > , "At least one owner required");
        require(_requiredSignatures >  && _requiredSignatures <= _owners.length, "Invalid number of required signatures");

        for (uint i = ; i < _owners.length; i++) {
            require(!isOwner[_owners[i]], "Owner not unique");
            isOwner[_owners[i]] = true;
        }
        
        owners = _owners;
        requiredSignatures = _requiredSignatures;
    }

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

    function createTransaction(address _to, uint _value) public onlyOwner {
        uint transactionId = transactions.length;
        transactions.push(Transaction({
            to: _to,
            value: _value,
            executed: false,
            confirmations: 
        }));
        
        emit TransactionCreated(transactionId, _to, _value);
    }

    function confirmTransaction(uint _transactionId) public onlyOwner {
        require(_transactionId < transactions.length, "Transaction does not exist");
        require(!confirmations[_transactionId][msg.sender], "Transaction already confirmed");

        confirmations[_transactionId][msg.sender] = true;
        transactions[_transactionId].confirmations += 1;

        emit TransactionConfirmed(_transactionId, msg.sender);
    }

    function executeTransaction(uint _transactionId) public onlyOwner {
        require(_transactionId < transactions.length, "Transaction does not exist");
        require(transactions[_transactionId].confirmations >= requiredSignatures, "Not enough confirmations");
        require(!transactions[_transactionId].executed, "Transaction already executed");

        transactions[_transactionId].executed = true;
        (bool success, ) = transactions[_transactionId].to.call{value: transactions[_transactionId].value}("");
        require(success, "Transaction failed");

        emit TransactionExecuted(_transactionId);
    }
}

آموزش سالیدیتی)

ج) تست قرارداد

تست کیف پول Multi-Sig بسیار مهم است تا از صحت عملکرد آن اطمینان حاصل شود. می‌توانید از Hardhat برای نوشتن تست‌ها استفاده کنید. یک فایل جدید در پوشه test به نام MultiSigWallet.test.js ایجاد کنید و کد زیر را اضافه کنید:

const { expect } = require("chai");
const { ethers } = require("hardhat");

describe("MultiSigWallet", function () {
    let MultiSigWallet;
    let multiSigWallet;
    let owner1, owner2, owner3;

    beforeEach(async function () {
        [owner1, owner2, owner3] = await ethers.getSigners();
        const owners = [owner1.address, owner2.address, owner3.address];
        const requiredSignatures = 2;

        MultiSigWallet = await ethers.getContractFactory("MultiSigWallet");
        multiSigWallet = await MultiSigWallet.deploy(owners, requiredSignatures);
        await multiSigWallet.deployed();
    });

    it("Should create and execute a transaction", async function () {
        await multiSigWallet.createTransaction(owner1.address, ethers.utils.parseEther("1"));

        await multiSigWallet.confirmTransaction();
        await multiSigWallet.connect(owner2).confirmTransaction();

        await expect(multiSigWallet.executeTransaction()).to.emit(multiSigWallet, "TransactionExecuted");
    });
});

نتیجه‌ گیری

ساخت کیف پول multi sig به شما این امکان را می‌دهد که امنیت دارایی‌های دیجیتال خود را ارتقا دهید. با رعایت اصول صحیح در نوشتن قرارداد و تست آن، می‌توانید از امنیت و کارایی کیف پول خود اطمینان حاصل کنید.