Nicht genügend Guthaben für ein Transaktionsbeispiel in testrpc

Ich versuche, einen meiner ersten Smart Contracts in Solidity zu testen, ein einfaches Unterwährungsbeispiel, wie Sie unten sehen können:

pragma solidity ^0.4.0;

contract Coin {

  address public owner;
  mapping (address => uint) balances;



  function Coin() {
    owner = msg.sender;
    balances[tx.origin] = 1000;
  }


  function send(address receiver, uint amount) returns (bool success) {
    if (balances[msg.sender] < amount) {
      return  false;
    }
    balances[msg.sender] -= amount;
    balances[receiver] += amount;
    return true;

  }


  function getBalance (address user) constant returns (uint balance) {
    return balances[user];
  }
}

Nach der Migration und Kompilierung schauen Sie sich bitte meinen Truffle-Befehl in der Konsole an

> var a = web3.eth.accounts[0]
> var b = web3.eth.accounts[1]
> var coin = Coin.deployed()
> coin.then(function(instance) {return instance.getBalance.call(a);})
{ [String: '1000'] s: 1, e: 3, c: [ 1000 ] }
> coin.then(function(instance) {return instance.getBalance.call(b);})
> { [String: '0'] s: 1, e: 0, c: [ 0 ] }

An diesem Punkt bin ich mit dieser Ausgabe einverstanden, aber als ich die Transaktion durchführen wollte, sagten sie, ich habe nicht genug Geld ...:

> coin.then(function(instance) {return instance.send(b,500);})
Error: Error: sender doesn't have enough funds to send tx. The upfront cost is: 724579920256558730963659928732440307373701337785 and the senders account only has: 99835768400000000000
    at runCall (/usr/local/lib/node_modules/ethereumjs-testrpc/node_modules/ethereumjs-vm/lib/runTx.js:97:10)
    at /usr/local/lib/node_modules/ethereumjs-testrpc/node_modules/ethereumjs-vm/node_modules/async/dist/async.js:3686:9
    at replenish (/usr/local/lib/node_modules/ethereumjs-testrpc/node_modules/ethereumjs-vm/node_modules/async/dist/async.js:882:17)
    at iterateeCallback (/usr/local/lib/node_modules/ethereumjs-testrpc/node_modules/ethereumjs-vm/node_modules/async/dist/async.js:867:17)
    at /usr/local/lib/node_modules/ethereumjs-testrpc/node_modules/ethereumjs-vm/node_modules/async/dist/async.js:840:16
    at /usr/local/lib/node_modules/ethereumjs-testrpc/node_modules/ethereumjs-vm/node_modules/async/dist/async.js:3691:13
    at apply (/usr/local/lib/node_modules/ethereumjs-testrpc/node_modules/ethereumjs-vm/node_modules/async/dist/async.js:21:25)
    at /usr/local/lib/node_modules/ethereumjs-testrpc/node_modules/ethereumjs-vm/node_modules/async/dist/async.js:56:12
    at Object.async.eachSeries (/usr/local/lib/node_modules/ethereumjs-testrpc/node_modules/async-eventemitter/node_modules/async/lib/async.js:130:20)
    at VM.AsyncEventEmitter.emit (/usr/local/lib/node_modules/ethereumjs-testrpc/node_modules/async-eventemitter/lib/AsyncEventEmitter.js:42:9)
    at Object.InvalidResponse (/usr/local/lib/node_modules/truffle/node_modules/truffle-contract/node_modules/web3/lib/web3/errors.js:35:16)
    at /usr/local/lib/node_modules/truffle/node_modules/truffle-contract/node_modules/web3/lib/web3/requestmanager.js:86:36
    at XMLHttpRequest.request.onreadystatechange (/usr/local/lib/node_modules/truffle/node_modules/web3/lib/web3/httpprovider.js:119:13)
    at XMLHttpRequestEventTarget.dispatchEvent (/usr/local/lib/node_modules/truffle/node_modules/xhr2/lib/xhr2.js:64:18)
    at XMLHttpRequest._setReadyState (/usr/local/lib/node_modules/truffle/node_modules/xhr2/lib/xhr2.js:354:12)
    at XMLHttpRequest._onHttpResponseEnd (/usr/local/lib/node_modules/truffle/node_modules/xhr2/lib/xhr2.js:509:12)
    at IncomingMessage.<anonymous> (/usr/local/lib/node_modules/truffle/node_modules/xhr2/lib/xhr2.js:469:24)
    at emitNone (events.js:91:20)
    at IncomingMessage.emit (events.js:185:7)
    at endReadableNT (_stream_readable.js:974:12)
    at _combinedTickCallback (internal/process/next_tick.js:74:11)
    at process._tickDomainCallback (internal/process/next_tick.js:122:9)

Ich habe es mit anderen in Testrpc verfügbaren Konten versucht, ich habe die gleichen Ergebnisse ... Vielleicht habe ich etwas in meinem Befehl oder meiner Einrichtung übersehen, ich weiß es nicht. Aber diese Kosten scheinen zu wichtig zu sein, oder?

Danke für Ihre Hilfe !

In Ihrem Vertragscode sollte balances[owner]getBalance für jede Adresse immer den gleichen Wert zurückgeben. Ist dies derselbe Vertrag, den Sie bei Ihren Trüffeltests verwendet haben?
Danke für diesen guten Hinweis! Falsches Kopieren/Einfügen der Version meines Codes ... es ist balances[user]und nicht balances[owner]!

Antworten (5)

In Ihrem Projektordner sollten Sie eine genesis.json-Datei haben (in einem der Verzeichnisse).

Laut dieser Seite können Sie anscheinend den Saldobetrag für die Konten definieren:

 "accounts": {
    "0000000000000000000000000000000000000001": { "balance": "1", "nonce": "1048576", "builtin": { "name": "ecrecover", "pricing": { "linear": { "base": 3000, "word": 0 } } } },
    "0000000000000000000000000000000000000002": { "balance": "1", "nonce": "1048576", "builtin": { "name": "sha256", "pricing": { "linear": { "base": 60, "word": 12 } } } },
    "0000000000000000000000000000000000000003": { "balance": "1", "nonce": "1048576", "builtin": { "name": "ripemd160", "pricing": { "linear": { "base": 600, "word": 120 } } } },
    "0000000000000000000000000000000000000004": { "balance": "1", "nonce": "1048576", "builtin": { "name": "identity", "pricing": { "linear": { "base": 15, "word": 3 } } } },
    "102e61f5d8f9bc71d0ad4a084df4e65e05ce0e1c": { "balance": "1606938044258990275541962092341162602522202993782792835301376", "nonce": "1048576" }

Dieser einfache Test funktioniert für Ihren Vertrag, wenn Sie ihn mit ausführen truffle test:

contract('Coin', function(accounts) {
  it("works", function() {
    var coin = Coin.deployed();

    var a = accounts[0];
    var b = accounts[1];

    getBalances(coin, a, b, function() {
       coin.send(b,500).then(function() {
        getBalances(coin, a, b);
       });
    })
  });
});

function getBalances(coin, a, b, cb) {
  coin.getBalance.call(a).then(function(balanceA) {
    console.log("balanceA: " + balanceA);

    coin.getBalance.call(b).then(function(balanceB) {
      console.log("balanceB: " + balanceB);
      if (cb)
        cb();
    });
  });
}

Die Ausgabe:

balanceA: 1000
balanceB: 0
balanceA: 500
balanceB: 500
Dies sollte nicht als richtige Antwort markiert werden, da es die Frage überhaupt nicht beantwortet.

Ich hatte dieses Problem und ich denke, dass „send“ bereits als Funktionsname / Schlüsselwort verwendet wird und nicht als Funktionsname im Vertrag verwendet werden kann (zumindest wenn wir über die Truffle-Konsole damit interagieren möchten). Wenn ich den Namen der Sendefunktion in 'sendCoin' oder etwas, das nicht 'send' ist, ändere und erneut bereitstelle, verschwindet der obige Fehler.

Wenn Sie dies tun: Coin.deployed().then(function(contractDesc) {console.log(contractDesc)})Die verfügbaren Funktionen dieses Vertrags werden aufgelistet und unten ist bereits eine Sendefunktion definiert send: [Function],. Ich bin mir nicht sicher, wie ich diese Definition richtig interpretieren soll, aber ich denke, wir können nicht zwei gleiche haben.

Starten Sie testrpcneu und das Problem wird gelöst.

sendmethod ist eine reservierte Methode für jeden Vertrag, ändern Sie einfach die sendMethode im CoinVertrag in sendAmountoder einen anderen Namen, es wird funktionieren.

Siehe: https://github.com/sgyyz/solidity-learning/issues/1