我正在尝试实现一个函数,该函数在另一个契约上调用不同的函数并返回该值。我怀疑这可能是在接收到前一个值之前调用promises和函数的问题。但是我不知道如何在合同中实现这一点,如果可能的话。我正在使用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;
}
}
编辑: 在Rob的回应和更多测试之后,我意识到这与承诺没有任何关系,而是由创建者合同实例化公司合同。当直接从松露部署时,Company.sol的功能起作用,但是当从Creator部署时,只有某些工作,不包括我提到的那些。我在构造函数createCompany()函数中看不到任何错误,如果你这样做,请告诉我。
答案 0 :(得分: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;
}
我怀疑为每个用户创建合同过于复杂,但这是您想到的整个用例的问题。
智能合约之间没有承诺和回调。合同间消息(大致)是即时的。
希望它有所帮助。
答案 1 :(得分:0)
经过大量的反复试验后,我终于解决了这个问题,这与松露工作的愚蠢方式有关(如果我是正确的话)。
基本上每次我对合同文件进行更新并重新编译时,其他合同(例如主合同)都不会使用新信息更新,因此在实例化合同时,这些功能在每次调用时都会失败。如果我在未触摸的文件中添加了一个新的空行或其他内容并重新保存,那么编译时一切都会正常工作。
松露开发人员,确保修复这些错误,我花了两周时间来解决这个问题。