2017-03-22 18 views
0

다른 계약에서 다른 함수를 호출하고 그 값을 반환하는 함수를 구현하려고합니다. 나는 이것이 이전 약속의 가치를 받기 전에 약속과 기능이 불려질 때 문제가 될 수 있다는 의혹을 가지고있다. 그러나 나는 당신이 계약서에 이것을 어떻게 구현할 수 있는지 그리고 그것이 가능한지에 대해서는 잘 모른다. 나는 Truffle, TestRPC 및 Solidity를 사용하여 계약서를 작성하고 트러플 단말기에서 함수를 호출합니다. 계약은 (보여주는 단지 최소한의 기능) 다음과 같이 :트러플 솔리드 - 다른 계약의 함수 호출

홈페이지 계약 :

// One (main) contract to control them all 
import 'Company.sol'; 

contract Creator { 

    string[] public names; 
    address[] public companies; 

    // Creates a company 
    function createCompany(string _companyName, uint _noOfShares, uint _pricePerShare, address _creator) returns(address) { 
     address newCompany = new Company(_companyName, _noOfShares, _pricePerShare, _creator); 
     names.push(_companyName); 
     companies.push(newCompany); 
     return newCompany; 
    } 

    // Returns the name of a company given an index 
    function getName(uint i) constant returns(string companyName) { 
     return names[i]; 
    } 
    // Returns the address of a company given an index 
    function getAddress(uint i) constant returns(address companyAddress) { 
     return companies[i]; 
    } 

    // Returns the address of the last company created 
    function getLastAddress() constant returns(address companyAddress) { 
     return companies[companies.length - 1]; 
    } 

} 

회사 계약

import 'Shareholder.sol'; 

contract Company { 

    mapping(address => address) public shareholders; //Mapping from user 
    account address to shareholder contract address 

    function getShareNo(address _user) constant returns (uint _amount){ 
    // Get the shareholder contract address for the user 
    address sellerContractAddr = getShareholder(_user); 
    Shareholder sellerContract = Shareholder(sellerContractAddr); 

    uint shares = sellerContract.getShareBalance(); 

    return shares; 
    } 

    function getShareholder(address _user) constant returns (address shareholder){ 
     return shareholders[_user]; 
    } 

} 

주주 계약 :

contract Shareholder { 

    uint public shareBalance; 

    // Function to return the share balance 
    function getShareBalance() constant returns (uint balance){ 
     return shareBalance; 
    } 
} 

편집 : 롭의 반응과 더 많은 테스트 후에, 나는 이것이 ha가 아니라는 것을 깨닫는다. 약속과 관련이 있지만 창조주 계약에 의한 회사 계약의 인스턴스화가 있습니다. 트러 플에서 직접 배포 한 경우 Company.sol의 기능이 작동하지만 Creator에서 배포 한 경우에는 내가 언급 한 기능을 제외한 특정 기능 만 사용할 수 있습니다. 내 생성자 createCompany() 함수에서 아무 것도 잘못 볼 수 없다면 알려주십시오.

답변

0

아마도 코드의 일부만 게시 했습니까?

shareholder [user]를 설정하는 것이 없으므로 매핑 된 주소의 기본값 인 0x0을 제외한 모든 것을 매핑이 반환 할 수 없습니다.

의사 솔루션으로 회사에서이 줄을 따라야합니다. 이 버전에서는 주주가 존재하지 않으므로 회사에서 작성 및 추적 할 수 있습니다.

function newShareholder() returns (address shareholderContract) { 
    Shareholder shareholder new Shareholder(); // new contract 
    shareholder[msg.sender] = shareholder; // store addr with user 
    return shareholder; 
} 

나는 복잡한 문제를 통해-각 사용자에 대한 계약의 생성이 의심하지만, 이것은 당신이 생각하고있는 전체 사용 사례의 문제이다.

스마트 계약간에 약속 및 콜백을 사용할 수 없습니다. 계약 간 메시지는 (대략적으로) 즉각적입니다.

희망이 있습니다.

+0

안녕하세요 롭, 답변 해 주셔서 감사합니다. 실제로 나는 게시물에서 언급 한 코드의 일부만 게시했습니다. 난 이미 당신이 게시 한 것과 비슷한 기능을 가지고 있지만 getShareNo() 함수를 호출 할 때 나는 사용자가 이미 주주라고 가정하고 그 주소로 테스트를한다. 각 사용자에 대한 계약 생성은 내가 믿어야하는 유스 케이스와 관련이 있습니다. 약속 및 콜백 팁에 감사드립니다! –

0

많은 시행 착오 끝에 마침내 문제가 해결되었으며 엄청나게 바보 같은 방식으로 트뤼플 작품과 관련이 있습니다 (정확하다면).

기본적으로 계약 파일을 업데이트하고 다시 컴파일 할 때마다 다른 계약 (예 : 주 계약)이 새 정보로 업데이트되지 않으므로 계약을 인스턴스화 할 때 모든 호출에서 해당 기능이 실패합니다. 변경된 내용에 새로운 빈 줄이나 새로운 내용을 추가하고 다시 저장하면 컴파일 할 때 모든 것이 작동합니다.

트러플 개발자는이 버그를 수정해야합니다. 내 인생에서 2 주일이 걸렸습니다.

+0

아! ...Truffle은 배치 된 계약의 주소를 유지하기 때문에 testRPC와 연동 할 수있는 또 다른 "잡았다"가 있습니다. myContract.deployed(). Truffle이 알지 못하는 것은 이것입니다 : testRPC가 빈 BC로 다시 시작됩니다. 트루 플레 마이 그 레이션에 대한 습관은 testRPC가 다시 시작될 때마다 재설정됩니다. 언급하지 않았다. 예, 이상한 일이 동기화되지 않을 때 일어납니다. –