Ich versuche, eine Funktion eines Vertrags aufzurufen, der für Ganache bereitgestellt wurde. Ich versuche, eine Funktion aufzurufen, die Auszahlungen an einige Adressen vornimmt und nur vom Eigentümer aufgerufen werden kann. Wenn ich die Funktion aufrufe, bekomme ich diesen Fehler:
The send transactions "from" field must be defined!
Ich verstehe das Problem nicht. Alles, was dieser Vertrag tut, ist, dass er das Vertragsguthaben an einige wenige Adressen überträgt. Es ist nicht zahlbar. Also, wie behebe ich diesen Fehler?
Vertragsfunktion:
function distributePrizes() public _ownerOnly{
uint numberWinner = generateNumber();
address[100] memory winners; // We have to create a temporary in memory array with fixed size
uint256 count = 0; // This is the count for the array of winners
for(uint256 i = 0; i < players.length; i++){
address playerAddress = players[i];
if(playerInfo[playerAddress].numberSelected == numberWinner){
winners[count] = playerAddress;
count++;
}
delete playerInfo[playerAddress]; // Delete all the players
}
winnerArray = winners;
players.length = 0; // Delete all the players array
uint256 winnerEtherAmount = totalBet / winners.length; // How much each winner gets
for(uint256 j = 0; j < count; j++){
if(winners[j] != address(0)) // Check that the address in this fixed array is not empty
winners[j].transfer(winnerEtherAmount);
}
}
Reaktionsfunktion, bei der die Vertragsfunktion aufgerufen wird:
selectWinner = async (e) =>{
const { accounts, contract, web3 } = this.state;
const balance = await web3.eth.getBalance(contract.address);
//console.log('Winners selected')
await contract.distributePrizes();
const newBalance = await web3.eth.getBalance(contract.address);
const winners = await contract.winnerArray;
this.setState({winnerAddress: winners, totalBet: newBalance})
}
accounts[0]
Wenn Sie Ihr Standardkonto verwenden , ändern Sie diese Zeile:
await contract.distributePrizes();
Zu:
await contract.distributePrizes({from: accounts[0]});
web3
Oder wenn Sie Ihr Objekt erstellen :
let accounts = await web3.eth.getAccounts();
web3.eth.defaultAccount = accounts[0]
Eine weitere Option: Wenn Sie geth
oder truffle
installiert haben, öffnen Sie eine Konsole, indem Sie beispielsweise Folgendes tun:
geth attach http://127.0.0.1:8545
odertruffle console
und dann:
eth.defaultAccount = eth.accounts[0]
(für geth
) bzw
let accounts = await web3.eth.getAccounts();
web3.eth.defaultAccount = accounts[0]
fürtruffle
Wenn Sie accounts[0]
natürlich Ihr Standardkonto sein möchten.
Hinweis: web3.eth.accounts
ist veraltet. Verwenden Sie web3.eth.getAccounts()
stattdessen
gute Stimmung
Rohan Dhar