我正在努力了解签署以太坊交易背后的基础知识。 我遇到了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);
}
);
非常感谢
答案 0 :(得分:0)
添加和删除所有者遵循与确认MultiSigWallet
中的任何交易相同的规则。假设钱包部署了3个EOA地址作为所有者,需要2个确认才能执行。对于任何常规交易,比如将钱包中的资金捐赠给FundRaisingContract
,其中一位所有者需要首先拨打submitTransaction()
FundRaisingContract
的地址,以及以太网的数量,以及捐赠功能的哈希值。提交后,您仍需要confirmTransaction
的其他所有者中的一个(提交者自动确认)。完成后,现在可以成功运行executeTransaction
,这将从donate()
地址执行对MultiSigWallet
的调用。
最后一部分是您正在寻找的回答您问题的部分。要添加所有者,请重复示例,但使用MultiSigWallet
地址和addOwner
方法的哈希值。当其他所有者确认交易时,将调用addOwner
并且它将通过onlyWallet
修饰符检查。