我想實現一個函數,它調用另一個合同上的不同函數並返回該值。我懷疑這可能是一個承諾和函數在收到前一個值之前被調用的問題。不過,我不知道如何在合同中實際執行此操作,以及是否有可能。我使用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()函數中看不到任何錯誤,請讓我知道如果你這樣做。
Hello Rob,謝謝你的回答。事實上,我只是貼出了部分代碼,正如我在帖子中提到的那樣。我已經有了一個類似於你發佈的函數,但是當調用getShareNo()函數時,我假設用戶已經是股東了,並且用我測試的地址是真實的。爲每個用戶創建合同與我所需要的用例有關。感謝您的承諾和回撥提示! –