Informationen gehen verloren, wenn eine Zeichenfolge von Byte32 Solidiy Smart Contract abgerufen wird

Ich habe eine Zahl als Zeichenfolge, die ich als Parameter an die intelligente Vertragsfunktion übergebe. Die Funktion nimmt byte32 als Parameter.

Hier ist der node.js-Code zum Ausführen der Vertragsfunktion:

const app = require("express")();
const config = require("./config");
const Web3 = require("web3");
const web3EndPoint = config.web3EndPoint;
const web3 = new Web3(new Web3.providers.HttpProvider(web3EndPoint));
const ethTx = require('./eth-transaction');
const abi = config.abi;
const MyContract = web3.eth.contract(abi);
const myContractInstance = MyContract.at(config.contractAddress);

txnCount = web3.eth.getTransactionCount(config.defaultAccount);

const parameter = '1234';
const data = myContractInstance.setID.getData(parameter);
myContractInstance.setID.estimateGas(parameter, (error , value) => {
    if (!error) {
        console.log("gasLimit" , value);
        const rawTx = {
            nonce: web3.toHex(txnCount) ,
            gasPrice: web3.toHex(100000000000) ,
            gasLimit: value ,
            to: config.contractAddress ,
            value: web3.toHex(0) ,
            data: data ,
        };

        ethTx.sendRawTransaction(config.priKey , rawTx , web3 ).then((result) => {
            console.log(result);
        }).catch(transactionFailedErr => {
            console.error(transactionFailedErr);
        });
    } else {
        console.error(error);
    }
});

myContractInstance.LogTestCase().watch((error, result) => {
    console.log(web3.toUtf8(result.args._id)); // Its logs 'M'
});

Hier ist der Soliditätscode:

pragma solidity ^0.4.21;

contract test2 {

    bytes32 public _id;

    event LogTestCase(
        bytes32 _id
    );

    function setID(bytes32 cId) returns (bool){
        _id = cId;
        emit LogTestCase(_id);
        return true;
    }
}

Wenn ich jetzt '1234' als Parameter einfüge, ergibt das Abrufen aus dem Vertragsereignis 'M'. Aber wenn ich eine andere Zeichenfolge mit Alphabeten einfüge, erhalte ich die richtige Anfangszeichenfolge

Das Übergeben einer beliebigen Zahl als Zeichenfolge an die Vertragsfunktion mit dem Typ byte32 kann also nicht abgerufen werden. Gibt es eine Möglichkeit, genau das zu bekommen, was ich bestanden habe?

Siehe hier eine ähnliche Frage zum Umgang mit bytes32Javascript.
Danke @goodvibration, aber das scheint nicht mit der Zeichenfolge zu funktionieren, die numerische Zeichen enthält, wie in der Frage erwähnt
Dass die Zeichen numerisch sind, soll keinen Einfluss auf das Verhalten haben. Wie genau senden Sie parameteran den Vertrag und wie genau analysieren Sie das zurückgegebene Ereignis?
Sie sollten versuchen, die Zeichenfolge vor dem Senden in bytes32 zu konvertieren, und Sie können dies mit web3 utils tun.
@goodvibration Es wird alles im Code erwähnt
@KakiMasterOfTime Ich habe das auch mit web3.toHex() versucht, aber nicht das erwartete Ergebnis erhalten
Wie ich im ersten Kommentar erwähnt habe, gibt es bereits eine Frage (und eine Antwort) dazu, wie man konvertiert, stringbevor bytes32man es an den Vertrag sendet, und wie man konvertiert, bytes32nachdem stringman es aus dem Vertrag erhalten hat.

Antworten (1)

Um byte32den Parameter richtig zu übergeben, müssen Sie das Präfix im Wert verwenden 0x(z. B. '0x1234').

oder schauen Sie sich an, wie Sie stringzu bytes32 https://ethereum.stackexchange.com/a/23110/30889 konvertieren