Das Feld „Transaktionen senden von“ muss definiert sein!

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})
  }
Wie wäre es, hier etwas Code zu teilen?
Ich habe einen Code geteilt

Antworten (1)

accounts[0]Wenn Sie Ihr Standardkonto verwenden , ändern Sie diese Zeile:

await contract.distributePrizes();

Zu:

await contract.distributePrizes({from: accounts[0]});

web3Oder wenn Sie Ihr Objekt erstellen :

let accounts = await web3.eth.getAccounts();
web3.eth.defaultAccount = accounts[0]

Eine weitere Option: Wenn Sie gethoder truffleinstalliert haben, öffnen Sie eine Konsole, indem Sie beispielsweise Folgendes tun:

geth attach http://127.0.0.1:8545odertruffle 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.accountsist veraltet. Verwenden Sie web3.eth.getAccounts()stattdessen