如何为当前未知的合约编写合约调用?
How can I code a contract call for a contract that is currently unknown?
有一个叫做投票的合约。 sol 并且它可以接受提案并对这些提案进行投票。
我希望能够在人们创建提案时能够指定在投票完成后将发生的调用。
调用应包含要调用的合约地址、要调用的函数以及要传递给函数的参数。
但是,我们在创建投票时并不知道这些(也不知道称为 ABI 的合约)。 sol 仅在我们稍后创建提案时使用。
有什么办法吗?
您可以预先创建一个代理合约,将其地址固定在Vol.sol,然后通过这个代理合约将您需要的智能合约地址转入。
除了通过代理传递地址外,还可以传递ABI规范。如果使用bytes32的数组向vol-contract方法传递参数,那么可以传递任意数量的不同类型的参数。
- 您部署合约Proxy并保存地址
- 使用代理地址进行初始化public合约VolUser中的ProxyAddr
- 后期,在部署合约 Vol 后,您使用值 (Vol-address, "AnyFunction(bytes32[])"
调用 Proxy 方法 SetVol
- 调用VolUser合约的方法CallVol时,会调用Vol合约的方法AnyFunction。
pragma solidity >=0.5.8 <0.6.0;
contract Proxy
{
address Owner ;
address VolAddr ;
string VolABI ;
constructor() public
{
Owner=tx.origin ;
}
function SetVol(address VolAddr_, string memory VolABI_) public
{
if(tx.origin!=Owner) require(false) ;
VolAddr=VolAddr_ ;
VolABI =VolABI_ ;
}
function GetVol() public view returns (address, string memory retVal)
{
return(VolAddr, VolABI) ;
}
}
contract VolUser
{
Proxy ProxyAddr ;
constructor() public
{
}
function CallVol() public
{
address VolAddr ;
string memory VolABI ;
bytes32[2] memory VolPars ;
bool result ;
(VolAddr, VolABI)=ProxyAddr.GetVol() ;
VolPars[0]= "ABC" ;
VolPars[1]=bytes32(uint256(321)) ;
(result,)=address(VolAddr).call.gas(0x300000).value(0)(abi.encodeWithSignature(VolABI, VolPars)) ;
}
}
contract Vol
{
constructor() public
{
}
function AnyFunction(bytes32[] memory VolPars_) public
{
// ...
}
}
有一个叫做投票的合约。 sol 并且它可以接受提案并对这些提案进行投票。
我希望能够在人们创建提案时能够指定在投票完成后将发生的调用。
调用应包含要调用的合约地址、要调用的函数以及要传递给函数的参数。
但是,我们在创建投票时并不知道这些(也不知道称为 ABI 的合约)。 sol 仅在我们稍后创建提案时使用。
有什么办法吗?
您可以预先创建一个代理合约,将其地址固定在Vol.sol,然后通过这个代理合约将您需要的智能合约地址转入。 除了通过代理传递地址外,还可以传递ABI规范。如果使用bytes32的数组向vol-contract方法传递参数,那么可以传递任意数量的不同类型的参数。
- 您部署合约Proxy并保存地址
- 使用代理地址进行初始化public合约VolUser中的ProxyAddr
- 后期,在部署合约 Vol 后,您使用值 (Vol-address, "AnyFunction(bytes32[])" 调用 Proxy 方法 SetVol
- 调用VolUser合约的方法CallVol时,会调用Vol合约的方法AnyFunction。
pragma solidity >=0.5.8 <0.6.0;
contract Proxy
{
address Owner ;
address VolAddr ;
string VolABI ;
constructor() public
{
Owner=tx.origin ;
}
function SetVol(address VolAddr_, string memory VolABI_) public
{
if(tx.origin!=Owner) require(false) ;
VolAddr=VolAddr_ ;
VolABI =VolABI_ ;
}
function GetVol() public view returns (address, string memory retVal)
{
return(VolAddr, VolABI) ;
}
}
contract VolUser
{
Proxy ProxyAddr ;
constructor() public
{
}
function CallVol() public
{
address VolAddr ;
string memory VolABI ;
bytes32[2] memory VolPars ;
bool result ;
(VolAddr, VolABI)=ProxyAddr.GetVol() ;
VolPars[0]= "ABC" ;
VolPars[1]=bytes32(uint256(321)) ;
(result,)=address(VolAddr).call.gas(0x300000).value(0)(abi.encodeWithSignature(VolABI, VolPars)) ;
}
}
contract Vol
{
constructor() public
{
}
function AnyFunction(bytes32[] memory VolPars_) public
{
// ...
}
}