【问题标题】:Truffle Solidity - Calling function from different contractTruffle Solidity - 从不同的合约调用函数
【发布时间】:2017-03-22 12:25:55
【问题描述】:

我正在尝试实现一个函数,该函数在另一个合约上调用不同的函数并返回该值。我怀疑这可能是在接收到先前的值之前调用承诺和函数的问题。但是,我不知道您如何在合同中实际实施这一点以及是否可能。我正在使用 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];
    }

}

公司合同

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 的回复和更多测试之后,我意识到这与 Promise 无关,而是与 Creator 合约对 Company 合约的实例化有关。当直接从 truffle 部署时,Company.sol 的功能可以工作,但是当从 Creator 部署时,只有某些功能可以工作,不包括我提到的那些。我在构造函数 createCompany() 函数中看不到任何错误,如果有请告诉我。

【问题讨论】:

    标签: blockchain ethereum solidity smartcontracts truffle


    【解决方案1】:

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

    没有任何东西可以设置股东[用户],所以映射不能返回任何东西,除了 0x0 是映射地址的默认值。

    作为一种伪解决方案,您需要在 Company 中提供类似的东西。在此版本中,股东不存在,因此可以在公司中/由公司创建和跟踪。

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

    我怀疑为每个用户创建合同过于复杂,但这是您所考虑的整个用例的问题。

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

    希望对您有所帮助。

    【讨论】:

    • 您好 Rob,感谢您的回答。事实上,我只发布了我在帖子中提到的部分代码。我已经有一个与您发布的类似的函数,但是在调用 getShareNo() 函数时,我假设用户已经是股东,并且使用我测试它的地址是正确的。我相信为每个用户创建合同与我需要的用例有关。感谢您的承诺和回调提示!
    【解决方案2】:

    经过大量的反复试验,我终于解决了这个问题,这与松露的工作方式荒谬可笑(如果我是对的)有关。

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

    Truffle 开发人员,请务必修复这些错误,我花了两周时间才弄明白。

    【讨论】:

    • 啊! ... testRPC 可能还有另一个“陷阱”,因为 Truffle 维护已部署合约的地址,例如myContract.deployed()。 Truffle 不知道的是:testRPC 以空的 BC 重新启动。每当重新启动 testRPC 时, $ truffle migrate --reset 是一个真正的习惯。懒得提了。是的,当事情不同步时会发生奇怪的事情。
    猜你喜欢
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-04
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多