2017-03-30 10 views
4

계약서에 다른 계약의 기능을 호출 할 수있는 기능이 있어야합니다. 필자의 목표 중 핵심 부분은 계약서를 가져 오지 않고 배포 할 수 없으며 기본적으로 계약 이름을 알지 못한다는 것입니다. 즉,이 계약의 사용자는 호출 된 계약 데이터 (즉, 주소, 이름)를 파라미터로서 입력 할 것이다. 가장 좋은 방법은 무엇입니까?외부 계약을 견고하게 호출하기

답변

5

왜 이것이 다운 voted인지 확실하지 않습니다.

내가 정확히 질문을 이해한다면, 의사 소통해야 할 계약서의 구체적인 내용을 알지 못하면 계약서를 배포하려고합니다.

인터페이스에 대한 지식이 있다고 가정하면이 작업을 크게 단순화 할 수 있습니다.

계약 코드를 가져 오지 않고 인터페이스를 정의 할 수 있습니다. 기능 인터페이스를 정의하고 빈 함수 정의를 떠나 : 인터페이스 계약이 실제 계약에 이야기

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)")) 

More information about .call, .callcode, .delegatecall.