Ethereum 如何为当前未知的合同编写合同调用代码?
有一个合同叫做投票。sol和it可以接受提案并对这些提案进行表决 我希望当人们创建提案时,能够指定投票结束后将发生的呼叫 调用应该具有要调用的契约、要调用的函数以及要传递给函数的参数的地址 然而,我们在创建投票时不知道这些(也不知道将被称为ABI的合同)。sol仅在我们稍后创建提案时使用Ethereum 如何为当前未知的合同编写合同调用代码?,ethereum,solidity,Ethereum,Solidity,有一个合同叫做投票。sol和it可以接受提案并对这些提案进行表决 我希望当人们创建提案时,能够指定投票结束后将发生的呼叫 调用应该具有要调用的契约、要调用的函数以及要传递给函数的参数的地址 然而,我们在创建投票时不知道这些(也不知道将被称为ABI的合同)。sol仅在我们稍后创建提案时使用 有什么方法可以做到这一点吗?您可以提前创建代理合约,在Vol.sol中固定其地址,然后通过此代理合约传输您需要的智能合约的地址。 除了通过代理传输地址外,还可以传输ABI规范。如果使用字节数组32将参数传递给V
有什么方法可以做到这一点吗?您可以提前创建代理合约,在Vol.sol中固定其地址,然后通过此代理合约传输您需要的智能合约的地址。 除了通过代理传输地址外,还可以传输ABI规范。如果使用字节数组32将参数传递给Vol contract方法,则可以传递任意数量的不同类型的参数
pragma solidity>=0.5.8但您需要知道ABI和合同在部署时具有的功能,对吗?我需要在将来提供它们。就像一个executeAnything(地址、函数(参数1,2,3))函数见答案中的示例
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
{
// ...
}
}