如何为当前未知的合约编写合约调用?

How can I code a contract call for a contract that is currently unknown?

有一个叫做投票的合约。 sol 并且它可以接受提案并对这些提案进行投票。

我希望能够在人们创建提案时能够指定在投票完成后将发生的调用。

调用应包含要调用的合约地址、要调用的函数以及要传递给函数的参数。

但是,我们在创建投票时并不知道这些(也不知道称为 ABI 的合约)。 sol 仅在我们稍后创建提案时使用。

有什么办法吗?

您可以预先创建一个代理合约,将其地址固定在Vol.sol,然后通过这个代理合约将您需要的智能合约地址转入。 除了通过代理传递地址外,还可以传递ABI规范。如果使用bytes32的数组向vol-contract方法传递参数,那么可以传递任意数量的不同类型的参数。

  1. 您部署合约Proxy并保存地址
  2. 使用代理地址进行初始化public合约VolUser中的ProxyAddr
  3. 后期,在部署合约 Vol 后,您使用值 (Vol-address, "AnyFunction(bytes32[])"
  4. 调用 Proxy 方法 SetVol
  5. 调用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
       {
    //     ...
       }
    
    }