Información perdida al obtener una cadena del contrato inteligente byte32 Solidiy

Tengo un número como cadena que paso a la función de contrato inteligente como parámetro. La función toma byte32 como parámetro.

Aquí está el código node.js para ejecutar la función de contrato:

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'
});

Aquí está el código de solidez:

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;
    }
}

Ahora, cuando pongo '1234' como parámetro, obtenerlo del evento de contrato da como resultado 'M'. Pero cuando pongo cualquier otra cadena que contenga alfabetos, obtengo la cadena inicial correcta

Por lo tanto, pasar cualquier número como una cadena a la función de contrato con el tipo byte32 no se puede recuperar. ¿Hay alguna manera de obtener exactamente lo que pasé?

Vea aquí una pregunta similar sobre cómo tratar bytes32en Javascript.
Gracias @goodvibration pero eso no parece funcionar en la cadena que contiene caracteres numéricos como se menciona en la pregunta
Se supone que el hecho de que los caracteres sean numéricos no tenga ningún impacto en el comportamiento. ¿Cómo está enviando exactamente parameteral contrato y cómo está analizando exactamente el evento devuelto?
Debe intentar convertir la cadena en bytes32 antes de enviarla, y puede hacerlo con las utilidades web3.
@goodvibration Todo se menciona en el código.
@KakiMasterOfTime Probé eso también usando web3.toHex() pero no obtuve el resultado esperado
Como mencioné en el primer comentario, ya hay una pregunta (y una respuesta) sobre cómo convertir stringa bytes32antes de enviarlo al contrato, y cómo convertir de bytes32a stringdespués de recibirlo del contrato.

Respuestas (1)

Para pasar byte32el parámetro correctamente, debe usar 0xun prefijo en el valor (por ejemplo, '0x1234')

o vea cómo convertir stringa bytes32 https://ethereum.stackexchange.com/a/23110/30889