Невозможно получить переменную состояния на стороне клиента из смарт-контракта - PullRequest
0 голосов
/ 03 декабря 2018

Я учусь строить ICO, используя цепочку блоков эфириума.Я написал умный контракт на продажу токена и он работает нормально.Я также написал тесты для этого, но когда я пытаюсь получить значение переменной состояния на клиентском сайте, она выдает мне ошибку

Мой код продажи токена:

pragma solidity ^0.4.24;

import './KhananiToken.sol';

contract KhananiTokenSale {
    address admin;
    KhananiToken public tokenContract;
    uint256 public tokenPrice;
    uint256 public tokensSold;

    event Sell(
        address   _buyer,
        uint256  _amount
    );

    constructor (KhananiToken _tokenContract, uint256 _tokenPrice ) public {
        //Assign an Admin
        admin = msg.sender; //address of person how deployed the contract

        tokenContract = _tokenContract;
        tokenPrice = _tokenPrice;
    }

    function multiply(uint x, uint y) internal pure returns(uint z) {
        require(y == 0 || (z = x * y) / y == x);
    }

    function buyTokens(uint256 _numberOfTokens) public payable {
        require(msg.value == multiply(_numberOfTokens , tokenPrice));

        require(tokenContract.balanceOf(this) >= _numberOfTokens);        

        require(tokenContract.transfer(msg.sender, _numberOfTokens));        

        tokensSold += _numberOfTokens;

        Sell(msg.sender, _numberOfTokens);
    }

}

Мой код миграции:

module.exports = function(deployer) {
  var tokenSupply = 1000000;
  var tokenPrice = 1000000000000000; // is 0.001 Ehter

  deployer.deploy(KhananiToken, tokenSupply).then(function(TokenAddress){
    return  deployer.deploy(KhananiTokenSale, TokenAddress.address, tokenPrice);
  }); //1000000 it the inital token supply

};

Мой код на стороне клиента:

App.contracts.KhananiTokenSale.deployed().then(function(instance){
      khananiTokenSaleInstance = instance;
      return instance.tokenPrice();
    }).then(function(tokenPrice){
      console.log('tokenPrice',tokenPrice)
      console.log('tokenPrice',App.tokenPrice)
      App.tokenPrice = tokenPrice;
      //$('.token-price').html(App.tokenPrice)
    })

После повторного запуска код instance.tokenPrice () не попадает в функцию .then, поэтому console.log ('tokenPrice', tokenPrice) не работает.В chrome я получаю эту ошибку

MetaMask - ошибка RPC: внутренняя ошибка JSON-RPC.{code: -32603, сообщение: «Внутренняя ошибка JSON-RPC.»} Uncaught (в обещании) Ошибка: Внутренняя ошибка JSON-RPC.at Object.InvalidResponse (inpage.js: 1)

В MetaMask я получаю эту ошибку

Ошибка: [ethjs-rpc] rpc error with payload {«идентификатор»: 1913523409875, «jsonrpc»: «2,0», «PARAMS»: [ «0xf8920785174876e8008307a12094ab306a5cb13cca96bb50864e34ad92b3462af4b28711c37937e08000a43610724e0000000000000000000000000000000000000000000000000000000000000005822d45a0ad3178b0e1121d7dacc39a7a90481fd87644eb07e67f0c638b2566827051a08ca03ee4cc4c432bbf02fbbdf9a0f2737c9d65d11a0e98376c86bf8621a343a3b41a»], «метод»: «eth_sendRawTransaction»} Ошибка: Попытка выполнить операцию, которая вызывает функцию контракта, но получатель адрес 0xab306a5cb13cca96bb50864e34ad92b3462af4b2 неадрес договора

1 Ответ

0 голосов
/ 03 декабря 2018

Попробуйте:

App.contracts.KhananiTokenSale.deployed().then(function(instance){
    khananiTokenSaleInstance = instance;
    return instance.tokenPrice.call();
}).then(function(tokenPrice){
    console.log("tokenPrice", tokenPrice);
})

Это простое правило:

  • Если вы хотите выполнить транзакцию, то есть изменить данные в блокчейне, используйте instance.functionName()
  • Если вы просто хотите прочитать данные из блокчейна без изменения каких-либо данных, используйте instance.getterFunctionOrVariableName.call();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...