如何签署通过合约发送的交易
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
修饰符检查。
我正在尝试了解签署以太坊交易背后的基础知识。 我遇到了 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
修饰符检查。