繁体   English   中英

松露固体-从不同合约调用功能

[英]Truffle Solidity - Calling function from different contract

我正在尝试实现一个函数,该函数在另一个合约上调用另一个函数并返回该值。 我怀疑这可能是一个问题,在收到前一个的值之前调用了promise和函数。 但是我不知道您如何在合同中实际执行此操作以及是否可行。 我正在使用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合同有关。 直接从松露部署时,Company.sol的功能起作用,但是从Creator部署时,只有某些功能起作用,但我提到的功能除外。 我在构造函数createCompany()函数中看不到任何错误,如果您这样做,请告诉我。

可能您只发布了部分代码?

没有要设置owner [user]的内容,因此映射无法返回除0x0(映射地址的默认值)以外的任何内容。

作为伪解决方案,您需要在Company中遵循这些方针。 在此版本中,股东不存在,因此可以在公司中创建和跟踪。

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

我怀疑为每个用户创建合同会使事情复杂化,但这是您要考虑的整个用例的问题。

智能合约之间没有约定和回调。 合同间消息是(大致)即时的。

希望能帮助到你。

经过大量的试验和错误,我终于解决了这个问题,这与松露的愚蠢方式(如果我是对的)有关。

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

松露开发人员,确保修复这些错误,我花了两周的时间才弄清楚。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM