Ethereum 如何为当前未知的合同编写合同调用代码?

Ethereum 如何为当前未知的合同编写合同调用代码?,ethereum,solidity,Ethereum,Solidity,有一个合同叫做投票。sol和it可以接受提案并对这些提案进行表决 我希望当人们创建提案时,能够指定投票结束后将发生的呼叫 调用应该具有要调用的契约、要调用的函数以及要传递给函数的参数的地址 然而,我们在创建投票时不知道这些(也不知道将被称为ABI的合同)。sol仅在我们稍后创建提案时使用 有什么方法可以做到这一点吗?您可以提前创建代理合约,在Vol.sol中固定其地址,然后通过此代理合约传输您需要的智能合约的地址。 除了通过代理传输地址外,还可以传输ABI规范。如果使用字节数组32将参数传递给V

有一个合同叫做投票。sol和it可以接受提案并对这些提案进行表决

我希望当人们创建提案时,能够指定投票结束后将发生的呼叫

调用应该具有要调用的契约、要调用的函数以及要传递给函数的参数的地址

然而,我们在创建投票时不知道这些(也不知道将被称为ABI的合同)。sol仅在我们稍后创建提案时使用


有什么方法可以做到这一点吗?

您可以提前创建代理合约,在Vol.sol中固定其地址,然后通过此代理合约传输您需要的智能合约的地址。 除了通过代理传输地址外,还可以传输ABI规范。如果使用字节数组32将参数传递给Vol contract方法,则可以传递任意数量的不同类型的参数

  • 部署合约代理并将其保存到
  • 在合同VolUser中使用代理地址初始化公共ProxyAddr
  • 最近,在开发完contract Vol之后,使用值(Vol地址,“AnyFunction(bytes32[])调用代理方法SetVol
  • 调用VolUser合约的CallVol方法时,将调用Vol合约的AnyFunction方法

  • 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
           {
        //     ...
           }
        
        }