Ich versuche, die Speicherung in einen Smart Contract zu integrieren, in dem die Adresse der Vertragsteilnehmer in einer address[]
Nachschlagetabelle gespeichert wird participationAddressLUT
.
Der Vertrag wird mit 2 Adressen in der Nachschlagetabelle über die Funktion initialisiert bootstrapParticipation()
. Der participationSize()
Getter gibt uns die Größe der Nachschlagetabelle.
Wenn Sie jedoch versuchen, die Größe der Nachschlagetabelle mit web3 abzurufenv0.20.2
TokenSale.at(this.state.contractAddress).then((instance) => {
instance.participationSize.call().then((r) => {
console.log('participationSize: ', r)
})
})
wir erhalten den kryptischen Fehler
Nicht erfasster (versprochener) Fehler: Fehler: VM-Ausnahme beim Ausführen von eth_call: ungültiger Opcode
Was ist falsch am aktuellen Vertragscode, der dies verhindert hat?
Vertragscode:
pragma solidity ^0.4.15;
import "./libs/zeppelin/crowdsale/CappedCrowdsale.sol";
import "./libs/zeppelin/crowdsale/FinalizableCrowdsale.sol";
contract TokenSale is CappedCrowdsale, FinalizableCrowdsale {
mapping (address => uint256) public participationWeis;
address[] public participationAddressLUT;
function TokenSale(uint256 _startTime, uint256 _endTime, uint256 _rate, uint256 _goal, uint256 _cap, address _wallet, address _tokenContractAddress)
CappedCrowdsale(_cap)
FinalizableCrowdsale()
Crowdsale(_startTime, _endTime, _rate, _wallet)
{
bootstrapParticipation();
}
function bootstrapParticipation() internal {
address participant = 0xcede48d8ac162d1b08ed9419010de3c99f2cfdd6;
uint256 weiAmount = 1000000;
participationWeis[participant] = participationWeis[participant].add(weiAmount);
participationAddressLUT.push(participant);
participant = 0x854bd635fd4e8684a326664e0698c8fefae6dd97;
weiAmount = 5000000;
participationWeis[participant] = participationWeis[participant].add(weiAmount);
participationAddressLUT.push(participant);
}
function participationSize() public returns (uint256) {
return participationAddressLUT.length;
}
}
Vollständige Rückverfolgung
errors.js:35 Uncaught (in promise) Error: Error: VM Exception while executing eth_call: invalid opcode
at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:48863:17
at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:60103:5
at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:12319:9
at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:8879:16
at replenish (C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:9399:25)
at iterateeCallback (C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:9389:17)
at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:9364:16
at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:12316:13
at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:60099:9
at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:54779:7
at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:48863:17
at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:60103:5
at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:12319:9
at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:8879:16
at replenish (C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:9399:25)
at iterateeCallback (C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:9389:17)
at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:9364:16
at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:12316:13
at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:60099:9
at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:54779:7
at Object.InvalidResponse (http://localhost:3000/static/js/bundle.js:94294:17)
at http://localhost:3000/static/js/bundle.js:90537:37
at XMLHttpRequest.request.onreadystatechange (http://localhost:3000/static/js/bundle.js:59860:8)
Die Solidity-Funktion sieht gut aus. Das Erhalten der Vertragsinstanz ist kein Versprechen.
Versuchen Sie, die Funktion wie folgt von der Instanz aus aufzurufen:
var instance = TokenSale.at(this.state.contractAddress);
instance.participationSize.call().then((r) => {
console.log('participationSize: ', r);
});