Постоянная функция возвращает пустой массив + web3js

У меня есть простой сценарий Solidity, который я тестировал в ремиксе (внедрил Web3 с использованием локальной среды geth) и отлично работал, возвращая массив данных из постоянного метода.

pragma solidity ^0.4.11;

contract TestBetting {

  struct BettingInfo {    
      uint256 matchId;
      uint homeTeamScore;
      uint awayTeamScore;     
      uint bettingPrice;  
  }

  address public owner;
  mapping(address => BettingInfo[]) public bettingInfo;

 // constructor
  function MyBetting() {
    owner = msg.sender;
  }

  // Fall back 
  function () payable {}

  event LogDeposit(address sender, uint amount);

  // Place a bet  
  function placeBet(uint256 _matchId, 
                    uint _homeTeamScore, 
                    uint _awayTeamScore, 
                    uint _bettingPrice) payable returns (bool) {

    bettingInfo[msg.sender].push(
      BettingInfo(_matchId, _homeTeamScore, _awayTeamScore, _bettingPrice)); 

    require(_bettingPrice == msg.value); 
    this.transfer(msg.value); 

    LogDeposit(msg.sender, msg.value);

    return true;
  }

  function getBettingInfo(address _better) public constant returns (uint256[], uint[], uint[], uint[]) {
    uint length = bettingInfo[_better].length;
    uint256[] memory matchId = new uint256[](length);
    uint[] memory homeTeamScore = new uint[](length);
    uint[] memory awayTeamScore = new uint[](length);
    uint[] memory bettingPrice = new uint[](length);   

    for (uint i = 0; i < length; i++) {
      matchId[i] = bettingInfo[_better][i].matchId;
      homeTeamScore[i] = bettingInfo[_better][i].homeTeamScore;
      awayTeamScore[i] = bettingInfo[_better][i].awayTeamScore;
      bettingPrice[i] = bettingInfo[_better][i].bettingPrice;   
    }

    return (matchId, homeTeamScore, awayTeamScore, bettingPrice);
  }
}

введите описание изображения здесь

Когда я делаю это в angular 5 с локальной средой Geth, сначала мне нужно отправить транзакцию через метод placeBet.

submit(form: NgForm): void {  
    this.bettingPrice = 20;
    this.bettingPrice = this.web3.toWei(this.bettingPrice, "ether");

    this.TestBetting.deployed().then((instance) => {
        return instance.placeBet(this.matchId, 
                                 this.homeTeamScore, 
                                 this.awayTeamScore, 
                                 this.bettingPrice, {
            from: this.account,
            value: this.bettingPrice,
            gas: 50000
        });
      })
      .then((value) => {
        console.log(value);
      })
      .catch((e) => {
        console.log(e);
      }); 
  }

Это откроет метамаску, и похоже, что она прошла.введите описание изображения здесь

Теперь я хочу вызвать getBettingInfo, чтобы увидеть данные, которые я отправил в сеть.

  loadGetBettingInfo() {   
    this.TestBetting.deployed().then((instance) => {
        return instance.getBettingInfo.call(this.betterAddress, {
            from: this.betterAddress,
            gas: 50000
        });
      })
      .then((value) => {
        console.log(value);
      })
      .catch((e) => {
        console.log(e);
      }); 
    }

Но это возвращает пустой массив в консоли.введите описание изображения здесь

Может ли кто-нибудь увидеть, что я делаю неправильно здесь?

Вы уверены, что транзакция была заминирована правильно? Возможно, вы вызываете getBettingInfo до того, как транзакция будет добыта. Является ли betterAddress тем же адресом, по которому была сделана ставка?
Да, я занимался майнингом с помощью geth и перешел на Ganache, и теперь он работает. geth --networkid 4224 --mine --datadir "..path" --nodiscover --rpc --rpcport "8545" --port "...port #" --rpccorsdomain "*" --nat "any" --rpcapi eth,web3,personal,miner,net --unlock 0 --password password.sec Это была моя команда geth, в которой моя была включена. До сих пор не знаю, почему это не сработало с этим

Ответы (1)

Это связано с тем, что this.TestBetting.deployed().then((instance)каждый раз создается новый экземпляр, который не имеет предыдущих изменений состояния. Поэтому вам нужно создать один экземпляр и использовать его для доступа ко всем функциям.

Contract.deployed()не создает новый экземпляр, он только возвращает ссылку на экземпляр, созданный с помощью сценариев миграции.