Fehlercodierungsargument (Remix)

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 newObjectremix 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.

Antworten (2)

Ich sehe vier mögliche Probleme mit Ihrem Funktionsaufruf:

  1. Sie sollten eckige Klammern []für Array-Literale anstelle von geschweiften Klammern verwenden {}:

    newObject(100, 3, ["location","price","sold"], ["Paris","50","yes"], '0xE07b6e5a2026CC916A4E2Beb03767ae0ED6af773');
    
  2. Die newObjectFunktion 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, newObjectdass nur Arrays der Größe 3 akzeptiert werden:

    ..., uint256 number_of_sub_states, bytes32[3] sub_states_types, bytes32[3] sub_states_values, ...
    
  3. 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');
    
  4. Adressen in Solidity werden als hexadezimale Konstanten geschrieben, die in umgewandelt werden address. Sie sollten also Folgendes schreiben:address(0xE07b6e5a2026CC916A4E2Beb03767ae0ED6af773)

    an Stelle von:'0xE07b6e5a2026CC916A4E2Beb03767ae0ED6af773'

Vielen Dank für Ihre Antwort. In Bezug auf Nummer 2, dh "Array mit dynamischer Größe", habe ich diese Antwort verwendet ethereum.stackexchange.com/questions/47529/… Gibt es also ein Problem in seiner Antwort?
Ich habe hier eine Lösung für Nummer 2 vorgeschlagen: ethereum.stackexchange.com/questions/47542/… Stimmen Sie dieser Lösung zu?
Ich habe meine Frage in Bezug auf Ihre Antwort geändert. Jetzt haben wir ein weiteres Problem beim Aufrufen der newObject-Funktion. Danke

Ich muss die newObject-Funktion im Remix im folgenden Format aufrufen:

40,3,["location","price","sold","","","","","","",""],["Paris","50","No","","","","","","",""], 0xE07b6e5a2026CC916A4E2Beb03767ae0ED6af773

Nun stimmt das Ergebnis.