如何签署通过合约发送的交易

How to sign a transaction send by contract

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

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

其中,修饰符 onlyWallet 要求交易必须从合约本身发送,但交易由合约所有者之一签署:

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

对于像这样的函数:

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

我已经在我的测试网上成功部署了合约,并使用他们的 dapp 尝试了它的功能 https://wallet.gnosis.pm/#/transactions

但是,我无法理解如何签署和发送交易以满足 onlyWallet 要求,因为例如使用 metamask 签署交易将导致 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);
    }
);

非常感谢

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

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