Потеря информации при получении строки из смарт-контракта byte32 Solidiy

У меня есть число в виде строки, которую я передаю функции смарт-контракта в качестве параметра. Функция принимает byte32 в качестве параметра.

Вот код node.js для выполнения функции контракта:

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

Вот код солидности:

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

Теперь, когда я помещаю «1234» в качестве параметра, извлечение его из события контракта приводит к «M». Но когда я помещаю любую другую строку, содержащую алфавиты, я получаю правильную начальную строку

Таким образом, передача любого числа в виде строки функции контракта с типом byte32 не может быть получена. Есть ли способ получить именно то, что я прошел?

См. здесь аналогичный вопрос о том, как работать с bytes32Javascript.
Спасибо @goodvibration, но, похоже, это не работает со строкой, содержащей числовые символы, как указано в вопросе.
Тот факт, что символы являются числовыми, не должен иметь никакого влияния на поведение. Как именно вы отправляете parameterв контракт и как именно вы анализируете возвращаемое событие?
Вы должны попытаться преобразовать строку в bytes32 перед отправкой, и вы можете сделать это с помощью утилит web3.
@goodvibration Все это упомянуто в коде
@KakiMasterOfTime Я тоже пробовал это, используя web3.toHex(), но не получил ожидаемого результата
Как я упоминал в первом комментарии, уже есть вопрос (и ответ) о том, как конвертировать stringв bytes32перед отправкой в ​​контракт, и как конвертировать из bytes32в stringпосле получения из контракта.

Ответы (1)

Чтобы byte32правильно передать параметр, вам нужно использовать 0xпрефикс в значении (например, «0x1234»).

или посмотрите, как конвертировать stringв bytes32 https://ethereum.stackexchange.com/a/23110/30889