2017-03-30 4 views
4

私は、契約を他の契約の機能を呼び出すことができる機能にしようとしています。私の目標の重要な部分は、契約書は輸入声明なしでは展開できず、デフォルトで契約名を知らないということです。換言すると、この契約のユーザは、呼び出された契約データ(すなわち、住所、名前)をパラメータとして入力する。これを達成する最良の方法は何ですか?外部契約を強固に呼び出す

答えて

5

なぜこれがダウンリストされたのか分かりません。

質問が正しくとわかっている場合は、通信する必要がある契約の具体的な詳細を知らなくても契約を展開したいと考えています。

インターフェイスの知識があると仮定することで、これを大幅に簡略化できます。

契約コードをインポートせずにインタフェースを定義することができます。関数インタフェースを定義し、空の関数定義を残す:

contract WidgetInterface { 

    function doSomething() returns(uint) {} 
    function somethingElse() returns(bool isTrue) {} 

} 

使用できるインターフェイスの契約は、実際の契約に話をすること:

WidgetInterface w = WidgetInterface(actualContractAddress); 

私の意見では、通常、認可登録することが可能と賢明だろう/あなたが行くように有効な契約。これらの線に沿って、それが安全に話すことができる契約のリストを維持:

if(!isAuthorized(actualContractAddress)) throw; 
actualContractAddressが送信者によって供給され

isAuthorized()は、あなたが内部のレジストリを照会するために働いている機能です。

希望します。

0

Rob Hitchensの示唆したように、インターフェイスを使用してこれを行うこともできます。また、インターフェイスを動的に定義し、.call、.callcode、.delegatecallを使用してメソッドを実行することもできます。ここ

は、例えば次のとおり

contract ContractsCaller { 

    function execute(address contractAt, uint _i, bytes32 _b) returns (bool) { 
     return contractAt.call(bytes4(sha3("testMethod(uint256,bytes32)")), _i, _b); 
    } 
} 

contract Test { 

    uint256 public i; 
    bytes32 public b; 

    function testMethod(uint256 _i, bytes32 _b) { 
     i = _i; 
     b = _b; 
    } 
} 

テストは別のファイルに定義することができます。 ContractsCallerは、そのアドレスと呼び出しているメソッドのシグネチャ以外に、Testについて何も知る必要はありません。

メソッドのシグネチャはメソッド名の最初の4バイトとそのパラメータのタイプである:

bytes4(sha3("testMethod(uint256,bytes32)")) 

関連する問題