Blockchain 块菌稠度-从不同合同调用函数

Blockchain 块菌稠度-从不同合同调用函数,blockchain,ethereum,solidity,smartcontracts,truffle,Blockchain,Ethereum,Solidity,Smartcontracts,Truffle,我试图实现一个函数,它在另一个契约上调用不同的函数并返回该值。我怀疑这可能是一个问题,在收到之前的承诺和函数的值之前调用它们。然而,我不知道你如何在合同中实际实施这一点,如果可能的话。我使用Truffle、TestRPC和Solidity编写合同,并从Truffle终端调用函数。合同如下所示(仅显示最基本的函数): 主合同: // One (main) contract to control them all import 'Company.sol'; contract Creator {

我试图实现一个函数,它在另一个契约上调用不同的函数并返回该值。我怀疑这可能是一个问题,在收到之前的承诺和函数的值之前调用它们。然而,我不知道你如何在合同中实际实施这一点,如果可能的话。我使用Truffle、TestRPC和Solidity编写合同,并从Truffle终端调用函数。合同如下所示(仅显示最基本的函数):

主合同:

// 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];
    }

}
contract Shareholder {

   uint public shareBalance; 

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

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];
    }

}
股东合同:

// 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];
    }

}
contract Shareholder {

   uint public shareBalance; 

    // Function to return the share balance
    function getShareBalance() constant returns (uint balance){
      return shareBalance;
    }
}
编辑:
在Rob的回答和更多的测试之后,我意识到这与承诺无关,而是与Creator合同对公司合同的实例化有关。直接从truffle部署时,Company.sol的功能可以工作,但从Creator部署时,只有某些功能可以工作,我提到的功能除外。我在构造函数createCompany()函数中看不到任何错误,请告诉我是否有错误。

可能您只发布了部分代码

没有要设置股东[user]的内容,因此映射无法返回除0x0之外的任何内容,0x0是映射地址的默认值

作为一个伪解决方案,您需要在公司中遵循这些思路。在这个版本中,股东不存在,所以它可以由公司创建和跟踪

function newShareholder() returns (address shareholderContract) {
    Shareholder shareholder  new Shareholder(); // new contract
    shareholder[msg.sender] = shareholder; // store addr with user
    return shareholder;
}
我怀疑为每个用户创建一个契约会使事情过于复杂,但这是您考虑的整个用例的问题

智能合约之间不存在承诺和回调。契约间消息(大致)是即时的


希望能有帮助

经过多次尝试和错误,我终于解决了这个问题,这与块菌的愚蠢工作方式有关(如果我是正确的话)

基本上,每次我更新合同文件并重新编译时,其他合同(如主合同)都不会使用新信息进行更新,因此在实例化合同时,这些函数在每次调用时都会失败。如果我在未触及的文件中添加了一个新的空行或其他内容并重新保存,那么编译时一切都正常


块菌开发者,一定要修复这些漏洞,我花了两周的时间才弄明白。

你好,罗布,谢谢你的回答。事实上,我只发布了我在帖子中提到的部分代码。我已经有了一个与您发布的函数类似的函数,但是在调用getShareNo()函数时,我假设用户已经是股东,并且我使用的地址测试它是真的。我相信,为每个用户创建合同与我需要的用例相关。谢谢你的承诺和回电提示!啊。。。testRPC可能还有另一个“问题”,因为Truffle维护已部署合约的地址,例如myContract.deployed()。Truffle不知道的是:testRPC使用空BC重新启动。每当重新启动testRPC时,$truffle迁移——重置是一个真正的习惯。忘了提了。是的,当事情不同步时会发生奇怪的事情。