Wir haben folgenden Vertrag:
pragma solidity 0.4.23;
contract RFID {
struct StateStruct {
bytes32 description;
mapping(bytes32 => bytes32) sub_state;
}
struct ObjectStruct {
StateStruct state;
address owner;
bool isObject;
}
mapping(bytes32 => ObjectStruct) objectStructs;
bytes32[] public objectList;
//uint256 public number_of_sub_states = 3;
event LogNewObject(address sender, bytes32 id, bytes32 sub_states_types, bytes32 sub_states_values, address owner);
event LogChangeObjectState(address sender, bytes32 uid, bytes32 newState);
event LogChangeObjectOwner(address sender, bytes32 uid, address newOwner);
function isObject(bytes32 _id) public view returns(bool isIndeed) {
return objectStructs[_id].isObject;
}
function getObjectCount() public view returns(uint count) {
return objectList.length;
}
/*function setArraySize(uint256 _number_of_sub_states) public {
number_of_sub_states = _number_of_sub_states;
}
function getArraySize() view public returns (uint256) {
return number_of_sub_states;
}*/
function newObject(bytes32 _id, uint256 number_of_sub_states, bytes32[10] sub_states_types, bytes32[10] sub_states_values, address _owner) public returns(bool success) {
require(!isObject(_id));
uint256 counter=0;
for(counter; counter < number_of_sub_states; counter++) {
objectStructs[_id].state.sub_state[sub_states_types[counter]] = sub_states_values[counter];
emit LogNewObject(msg.sender, _id, sub_states_types[counter], bytes32(sub_states_values[counter]), _owner);
}
objectStructs[_id].owner = _owner;
objectStructs[_id].isObject = true;
objectList.push(_id);
return true;
}
function changeObjectState(bytes32 _id, bytes32 _newState) public returns(bool success) {
require(isObject(_id));
//objectStructs[_id].location = _newState;
objectStructs[_id].state = StateStruct(_newState);
emit LogChangeObjectState(msg.sender, _id, _newState);
return true;
}
function changeObjectOwner(bytes32 _uid, address _newOwner) public returns(bool success) {
require(isObject(_uid));
objectStructs[_uid].owner = _newOwner;
emit LogChangeObjectOwner(msg.sender, _uid, _newOwner);
return true;
}
}
Wenn ich function newObject
remix aufrufe, erhalte ich die folgende Fehlermeldung:
Rufen Sie newObject im Remix mit dem zugehörigen Textfeld auf:100, 3, [bytes32("location"),bytes32("price"),bytes32("sold")], [bytes32("Paris"),bytes32("50"),bytes32("yes")], address(0xE07b6e5a2026CC916A4E2Beb03767ae0ED6af773)
FEHLER :error encoding arguments syntax error unexpected token b in JSON at position 12.
Was ist der Grund für diesen Fehler?
WICHTIGER HINWEIS : Ich habe meine Frage bezüglich der Antwort von Benutzer Jesse Busman bearbeitet.
Ich sehe vier mögliche Probleme mit Ihrem Funktionsaufruf:
Sie sollten eckige Klammern []
für Array-Literale anstelle von geschweiften Klammern verwenden {}
:
newObject(100, 3, ["location","price","sold"], ["Paris","50","yes"], '0xE07b6e5a2026CC916A4E2Beb03767ae0ED6af773');
Die newObject
Funktion akzeptiert Arrays mit dynamischer Größe als Argumente. Aus der Solidity-Dokumentation:
Beachten Sie, dass Speicherarrays mit fester Größe derzeit keinen Speicherarrays mit dynamischer Größe zugewiesen werden können, dh Folgendes ist nicht möglich:
// This will not compile. pragma solidity ^0.4.0; contract C { function f() public { // The next line creates a type error because uint[3] memory // cannot be converted to uint[] memory. uint[] x = [uint(1), 3, 4]; } }
Eine Lösung besteht darin, die Funktionssignatur von so zu ändern, newObject
dass nur Arrays der Größe 3 akzeptiert werden:
..., uint256 number_of_sub_states, bytes32[3] sub_states_types, bytes32[3] sub_states_values, ...
Ein Array-Literal von Zeichenfolgen kann nicht implizit in ein Array von konvertiert werden bytes32
. Sie können die Werte im Funktionsaufruf manuell umwandeln:
newObject(100, 3, [bytes32("location"),bytes32("price"),bytes32("sold")], [bytes32("Paris"),bytes32("50"),bytes32("yes")], '0xE07b6e5a2026CC916A4E2Beb03767ae0ED6af773');
Adressen in Solidity werden als hexadezimale Konstanten geschrieben, die in umgewandelt werden address
. Sie sollten also Folgendes schreiben:address(0xE07b6e5a2026CC916A4E2Beb03767ae0ED6af773)
an Stelle von:'0xE07b6e5a2026CC916A4E2Beb03767ae0ED6af773'
Ich muss die newObject-Funktion im Remix im folgenden Format aufrufen:
40,3,["location","price","sold","","","","","","",""],["Paris","50","No","","","","","","",""], 0xE07b6e5a2026CC916A4E2Beb03767ae0ED6af773
Nun stimmt das Ergebnis.
Fragesteller
Fragesteller
Fragesteller