具有未签名交易对象的 Solidity 交易
Solidity transaction with an unsigned transaction object
我需要与我的智能合约中的另一个智能合约进行交互(多次),
我有一个可以与 web3js 或 web3py 一起使用的事务对象,如下所示:
{
from: '0x00000000',
to: '0x0000000000',
value: '1000000000000',
data: '0x000000000000000000000000',
gasPrice: '245000000000',
gas: '163502',
chainId: 3
}
我怎样才能可靠地执行这个交易?
您可以使用类型 address
的 low-level .call()
成员。更准确地说是它的扩展名 address payable
,因为您设置的是 value
.
pragma solidity ^0.8;
contract MyContract {
function foo() external {
address to = payable(address(0x0));
bytes memory sendData = new bytes(12); // empty 12 byte array
to.call{value: 1000000000000, gas: 163502}(sendData);
}
}
请注意,您不能影响 gasPrice
,因为它已经在主事务中设置(执行 foo()
函数)。
from
始终是调用方合约(在本例中为 MyContract
)地址。
此外,EVM-compatible 合同无法执行 cross-chain 请求 - 这就是为什么您也不能指定 chainId
。
如果您需要能够影响这 3 个属性中的任何一个,则需要从 off-chain 应用程序而不是合同发送交易。
我需要与我的智能合约中的另一个智能合约进行交互(多次), 我有一个可以与 web3js 或 web3py 一起使用的事务对象,如下所示:
{
from: '0x00000000',
to: '0x0000000000',
value: '1000000000000',
data: '0x000000000000000000000000',
gasPrice: '245000000000',
gas: '163502',
chainId: 3
}
我怎样才能可靠地执行这个交易?
您可以使用类型 address
的 low-level .call()
成员。更准确地说是它的扩展名 address payable
,因为您设置的是 value
.
pragma solidity ^0.8;
contract MyContract {
function foo() external {
address to = payable(address(0x0));
bytes memory sendData = new bytes(12); // empty 12 byte array
to.call{value: 1000000000000, gas: 163502}(sendData);
}
}
请注意,您不能影响 gasPrice
,因为它已经在主事务中设置(执行 foo()
函数)。
from
始终是调用方合约(在本例中为 MyContract
)地址。
此外,EVM-compatible 合同无法执行 cross-chain 请求 - 这就是为什么您也不能指定 chainId
。
如果您需要能够影响这 3 个属性中的任何一个,则需要从 off-chain 应用程序而不是合同发送交易。