Zuordnen einer Adresse zu zwei Waagen

Ich möchte eine Adresse zwei Salden zuordnen, weil wir im Vertrag zwei Arten von Token haben, nämlich Energie und Strom. Ist der folgende Code im Solidity-Programm korrekt?

mapping(address => uint256) Enbalances;
mapping(address => uint256) Pwbalances;

Hier ist die Funktion, um das Energiegleichgewicht zu erhalten:

function balanceOfEn(address _owner) constant returns (uint256 Enbalance) {
    return Enbalances[_owner];
  }

und ich rufe diese Funktion wie folgt auf:

contractInstance.methods.balanceOfEn('0x1c3bcab2050Fbe3A0c4958dd5776558EE9720460').call({ from: '0x1c3bcab2050Fbe3A0c4958dd5776558EE9720460' }, function(error, result) {
    console.log(error);
    console.log(result)
});

PS Wenn ich ein Guthaben erhalten möchte, erhalte ich die folgende Fehlermeldung:

> Error: Couldn't decode uint256 from ABI: 0x
    at SolidityTypeUInt.formatOutputUInt (/home/ubuntu/parityewf/node_modules/we                                                                                                             b3-eth-abi/src/formatters.js:174:15)
    at SolidityTypeUInt.SolidityType.decode (/home/ubuntu/parityewf/node_modules                                                                                                             /web3-eth-abi/src/type.js:252:17)
    at /home/ubuntu/parityewf/node_modules/web3-eth-abi/src/index.js:327:49
    at Array.forEach (native)
    at ABICoder.decodeParameters (/home/ubuntu/parityewf/node_modules/web3-eth-a                                                                                                             bi/src/index.js:326:13)
    at Contract._decodeMethodReturn (/home/ubuntu/parityewf/node_modules/web3-et                                                                                                             h-contract/src/index.js:459:22)
    at Method.outputFormatter (/home/ubuntu/parityewf/node_modules/web3-eth-cont                                                                                                             ract/src/index.js:812:46)
    at Method.formatOutput (/home/ubuntu/parityewf/node_modules/web3-core-method                                                                                                             /src/index.js:163:54)
    at sendTxCallback (/home/ubuntu/parityewf/node_modules/web3-core-method/src/                                                                                                             index.js:467:33)
    at /home/ubuntu/parityewf/node_modules/web3-core-requestmanager/src/index.js                                                                                                             :147:9
    at XMLHttpRequest.request.onreadystatechange (/home/ubuntu/parityewf/node_mo                                                                                                             dules/web3-providers-http/src/index.js:77:13)
    at XMLHttpRequestEventTarget.dispatchEvent (/home/ubuntu/parityewf/node_modu                                                                                                             les/xhr2/lib/xhr2.js:64:18)
    at XMLHttpRequest._setReadyState (/home/ubuntu/parityewf/node_modules/xhr2/l                                                                                                             ib/xhr2.js:354:12)
    at XMLHttpRequest._onHttpResponseEnd (/home/ubuntu/parityewf/node_modules/xh                                                                                                             r2/lib/xhr2.js:509:12)
    at IncomingMessage.<anonymous> (/home/ubuntu/parityewf/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:80:11)
    at process._tickDomainCallback (internal/process/next_tick.js:128:9)

Ist der folgende alternative Code für die Zuordnung der Adresse zu zwei Waagen korrekt?

mapping (address => uint256) Enbalances;
mapping (address => mapping (address => uint256)) Pwbalances;
Welchen Fehler erhalten Sie?
Es sieht so aus, als ob es mit Ihrem js-Code zusammenhängt und nicht mit ETH. Außerdem erstellt Solidity automatische Getter, wenn Sie Ihre beiden Mappins als öffentlich festlegen, sodass Sie dies nicht tun müssen.
Anscheinend haben Sie die falsche ABI für diesen Vertrag, vielleicht eine veraltete Version Ihres Vertrags?
@Eli Drion Was ist deine Meinung zu Mapping (Adresse => uint256) Enbalances; Mapping (Adresse => Mapping (Adresse => uint256)) Pwbalances; ? ist es nicht besser?
Ich finde das in deinem Fall unnötig.
@ Eli Drion Glaubst du, wenn ich es durch Mapping (Adresse => uint256) ersetze Enbalances; Mapping (Adresse => uint256) Pwbalances; Es klappt?
@Eli Drion Ich habe ABI aktualisiert, aber ich habe immer noch das gleiche Problem. Muss ich den Vertrag erneut bereitstellen?
Es scheint, dass Sie selbst zwischen Ihren verschiedenen Versionen verloren sind. Stellen Sie eine im Testnetz mit den "einfachen" Zuordnungen bereit, aktualisieren Sie die ABI und versuchen Sie es. Es sollte funktionieren.

Antworten (1)

  1. Bauen Sie Ihre Artefakte wieder auf ( truffle compilez. B. mit)

  2. Sie können vereinfachencontractInstance.methods.balanceOfEn('...').call({ from: '...' })

    ZucontractInstance.balanceOfEn('...', { from: '...' })

    Und tatsächlich, da Enbalancesdeklariert ist public, können Sie die Funktion in Ihrem Vertrag entfernen balanceOfEnund dann verwendencontractInstance.Enbalances('...', { from: '...' })

Was ist Ihre Meinung zu Mapping (Adresse => uint256) Enbalances; Mapping (Adresse => Mapping (Adresse => uint256)) Pwbalances; ? ist es nicht besser?
Mein ABI wird per Remix generiert und ich habe auch eine andere Funktion getestet und es funktioniert. aber im Falle von balanceOfEn habe ich dieses Problem.
@goodvibrationIch habe ABI aktualisiert, aber ich habe immer noch das gleiche Problem. Muss ich den Vertrag erneut bereitstellen?