如何签订合同发送的交易

时间:2018-03-07 23:11:18

标签: ethereum smartcontracts

我正在努力了解签署以太坊交易背后的基础知识。 我遇到了Gnosis的MultiSigWallet:

https://github.com/gnosis/MultiSigWallet/blob/master/contracts/MultiSigWallet.sol

其中,一个modifier onlyWallet要求必须从合约本身发送交易,但交易是由合约的所有者签署的:

modifier onlyWallet() {
    require(msg.sender == address(this));
    _;
}

用于以下功能:

function replaceOwner(address owner, address newOwner)
    public
    onlyWallet
    ownerExists(owner)
    ownerDoesNotExist(newOwner)
{...}

我已成功在我的testnet上部署合同,并使用他们的dapp https://wallet.gnosis.pm/#/transactions

尝试了其功能

但是,我无法理解如何签署和发送事务以满足唯一的Wallet要求,因为例如使用元掩码签署事务将导致msg.sender成为我自己的钱包地址。

如果可能的话,非常感谢这个ethereumjs-tx函数的一个例子。

像:

const privateKey = Buffer.from('<private key 1>','hex');
const txParams = {
    nonce: web3.utils.toHex(11),
    gasPrice: web3.utils.toHex(1000000000),
    gasLimit: web3.utils.toHex(300000),
    to: '<contract address>',
    value: web3.utils.toHex(web3.utils.toWei("1",'ether')),
    data: '0x00',
    chainId: 1
};
let tx = new EthTx(txParams);
tx.sign(tx.serialize().toString('hex');
web3.eth.sendSignedTransaction(`0x${tx.serialize().toString('hex')}`, 
   (error, data) => {
       if(!error) {
            console.log(data);
       }else console.log(error);
    }
);

非常感谢

1 个答案:

答案 0 :(得分:0)

添加和删除所有者遵循与确认MultiSigWallet中的任何交易相同的规则。假设钱包部署了3个EOA地址作为所有者,需要2个确认才能执行。对于任何常规交易,比如将钱包中的资金捐赠给FundRaisingContract,其中一位所有者需要首先拨打submitTransaction() FundRaisingContract的地址,以及以太网的数量,以及捐赠功能的哈希值。提交后,您仍需要confirmTransaction的其他所有者中的一个(提交者自动确认)。完成后,现在可以成功运行executeTransaction,这将从donate()地址执行对MultiSigWallet 的调用。

最后一部分是您正在寻找的回答您问题的部分。要添加所有者,请重复示例,但使用MultiSigWallet地址和addOwner方法的哈希值。当其他所有者确认交易时,将调用addOwner并且它将通过onlyWallet修饰符检查。