以太坊系列-Multisig Wallet

multisig wallet是一种需要多个私钥签名才能进行Trancaction的token wallet。这种wallet通常用于提高安全性和共管资金。以下是实现multisig wallet的基本步骤和关键概念:

在 Bitcoin 上实现multisig wallet

步骤 1:安装依赖

你需要一个Bitcoin节点和Bitcoin开发工具包(例如 bitcoin-cli)。此外,你可以使用Bitcoin库(如 bitcoinlib)来简化开发工作。

pip install bitcoinlib
步骤 2:生成多签地址

使用 bitcoinlib 生成一个多签地址。

from bitcoinlib.wallets import Wallet

# 创建一个新的wallet
wallet = Wallet.create('MultisigWallet')

# 添加 3 个密钥
key1 = wallet.new_key()
key2 = wallet.new_key()
key3 = wallet.new_key()

# 创建一个 2-of-3 的多签地址
multisig_address = wallet.get_multisig_address([key1.public_hex, key2.public_hex, key3.public_hex], 2)
print(f'Multisig Address: {multisig_address}')
步骤 3:发送和签署事务

发送Bitcoin到多签地址,然后创建和签署事务。

from bitcoinlib.transactions import Transaction

# 创建一个未签名事务
tx = Transaction.create([('address_from', 0.01)], [multisig_address], network='testnet')

# 签署事务(需要 2 个密钥签名)
tx.sign([key1.private_hex, key2.private_hex])
print(tx.as_hex())
步骤 4:广播事务

将签署的事务广播到Bitcoin网络。

tx.broadcast()

在 Ethereum 上实现multisig wallet

步骤 1:安装依赖

你需要一个ETH节点(例如 Geth)和 Web3.py 库。

pip install web3
步骤 2:部署多签合约

使用 Solidity 编写多签合约,并使用 Web3.py 部署到ETH网络。以下是一个简单的多签合约示例:

pragma solidity ^0.8.0;

contract MultisigWallet {
    address[] public owners;
    uint256 public required;
    mapping(address => bool) public isOwner;
    struct Transaction {
        address destination;
        uint256 value;
        bytes data;
        bool executed;
    }
    Transaction[] public transactions;
    mapping(uint256 => mapping(address => bool)) public confirmations;

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

        for (uint256 i = 0; i < _owners.length; i++) {
            isOwner[_owners[i]] = true;
        }
        owners = _owners;
        required = _required;
    }

    function submitTransaction(address destination, uint256 value, bytes memory data) public returns (uint256) {
        uint256 transactionId = transactions.length;
        transactions.push(Transaction({
            destination: destination,
            value: value,
            data: data,
            executed: false
        }));
        confirmTransaction(transactionId);
        return transactionId;
    }

    function confirmTransaction(uint256 transactionId) public {
        require(isOwner[msg.sender], "only owners can confirm transactions");
        require(transactions[transactionId].destination != address(0), "transaction does not exist");
        confirmations[transactionId][msg.sender] = true;
        executeTransaction(transactionId);
    }

    function executeTransaction(uint256 transactionId) public {
        require(transactions[transactionId].destination != address(0), "transaction does not exist");
        require(isConfirmed(transactionId), "cannot execute transaction, not enough confirmations");
        Transaction storage txn = transactions[transactionId];
        require(!txn.executed, "transaction already executed");

        (bool success, ) = txn.destination.call{value: txn.value}(txn.data);
        require(success, "transaction failed");
        txn.executed = true;
    }

    function isConfirmed(uint256 transactionId) public view returns (bool) {
        uint256 count = 0;
        for (uint256 i = 0; i < owners.length; i++) {
            if (confirmations[transactionId][owners[i]]) {
                count += 1;
            }
            if (count == required) {
                return true;
            }
        }
        return false;
    }
}
步骤 3:部署合约

使用 Web3.py 部署合约:

from web3 import Web3

w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:8545'))

# Account和私钥
account = w3.eth.account.privateKeyToAccount('YOUR_PRIVATE_KEY')

# 合约编译和部署
compiled_contract = compile_source('''
pragma solidity ^0.8.0;

contract MultisigWallet {
    ...
}
''')

contract_interface = compiled_contract['<stdin>:MultisigWallet']
MultisigWallet = w3.eth.contract(abi=contract_interface['abi'], bytecode=contract_interface['bin'])

# 部署合约
tx_hash = MultisigWallet.constructor(['0x...', '0x...', '0x...'], 2).transact({'from': account.address})
tx_receipt = w3.eth.waitForTransactionReceipt(tx_hash)

# 合约地址
contract_address = tx_receipt.contractAddress
print(f'Contract deployed at address: {contract_address}')
步骤 4:与合约交互

使用 Web3.py 与合约交互,例如提交和确认事务。

multisig = w3.eth.contract(address=contract_address, abi=contract_interface['abi'])

# 提交事务
tx_hash = multisig.functions.submitTransaction('0xRecipientAddress', 1, b'').transact({'from': account.address})
w3.eth.waitForTransactionReceipt(tx_hash)

# 确认事务
tx_hash = multisig.functions.confirmTransaction(0).transact({'from': account.address})
w3.eth.waitForTransactionReceipt(tx_hash)

总结

通过以上步骤,可以在Bitcoin和ETH上实现multisig wallet。


往期精彩回顾:
区块链知识系列
密码学系列
零知识证明系列
共识系列
公链调研系列
BTC系列
以太坊系列
EOS系列
Filecoin系列
联盟链系列
Fabric系列
智能合约系列
Token系列
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搬砖魁首

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值