У меня есть простой сценарий 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);
});
}
Но это возвращает пустой массив в консоли.
Может ли кто-нибудь увидеть, что я делаю неправильно здесь?
Это связано с тем, что this.TestBetting.deployed().then((instance)
каждый раз создается новый экземпляр, который не имеет предыдущих изменений состояния. Поэтому вам нужно создать один экземпляр и использовать его для доступа ко всем функциям.
Contract.deployed()
не создает новый экземпляр, он только возвращает ссылку на экземпляр, созданный с помощью сценариев миграции.
Исмаэль
bbusdriver
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, в которой моя была включена. До сих пор не знаю, почему это не сработало с этим