2017-03-22 52 views
0

我想實現一個函數,它調用另一個合同上的不同函數並返回該值。我懷疑這可能是一個承諾和函數在收到前一個值之前被調用的問題。不過,我不知道如何在合同中實際執行此操作,以及是否有可能。我使用Truffle,TestRPC和Solidity編寫合同,並從松露終端調用功能。該合約看起來像這些(只顯示了最低限度功能):松露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; 
    } 
} 

編輯: 在Rob的迴應和更多測試之後,我意識到這並不是哈哈與承諾有任何關係,但與創作者合同中公司合同的實例化有關。當直接從松露部署時,Company.sol的功能起作用,但是當從Creator部署時,只有某些功能可以工作,不包括我提到的功能。我在構造函數createCompany()函數中看不到任何錯誤,請讓我知道如果你這樣做。

回答

0

可能你只發布部分代碼?

沒有什麼設置股東[用戶]是,所以沒辦法,除了爲0x0這是一個映射地址的缺省值映射可以返回任何東西。

作爲一種僞解決方案,您需要沿着公司的這些方面。在這個版本中,股東不存在,所以它可以由公司創建和跟蹤。

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

我懷疑爲每個用戶創建合同都是過度複雜的事情,但這是您考慮的整個用例的問題。

智能合同之間不存在承諾和回調。契約間消息是(大致)即時的。

希望它有幫助。

+0

Hello Rob,謝謝你的回答。事實上,我只是貼出了部分代碼,正如我在帖子中提到的那樣。我已經有了一個類似於你發佈的函數,但是當調用getShareNo()函數時,我假設用戶已經是股東了,並且用我測試的地址是真實的。爲每個用戶創建合同與我所需要的用例有關。感謝您的承諾和回撥提示! –

0

大量的試驗和錯誤,我終於解決了該問題,並且它與可笑愚蠢的做法黑松露的作品做(如果我是正確的)。

基本上,每次我對合同文件進行更新並重新編譯時,其他合同(例如主要合同)都不會使用新信息進行更新,因此在實例化合同時,這些功能在每次調用時都會失敗。如果我向未觸摸的文件添加了一個新的空行或者其他東西並重新保存,那麼編譯時一切正常。

松露開發商,一定要修復這些錯誤,我花了兩天周以後我的生活弄明白。

+0

啊! ...由於Truffle保留部署合同的地址,例如,可能會在testRPC中使用另一個「疑難雜症」。 myContract.deployed()。 Truffle沒有意識到的是:testRPC以空BC重新啓動。松露遷移是一種真正的習慣 - 無論何時重新啓動testRPC。忽略提及它。是的,奇怪的事情發生在事物不同步的時候。 –