无法通过polkadot JS API从事件数据转换回原始编号

问题描述

我在墨迹合同中将值类型设置为u128:

#[ink(storage)]
    struct SimpleContract {
      test_u128: storage::Value<u128>
    }

#[ink(event)]
    struct U128Event {
        #[ink(topic)]
        val: u128,}


#[ink(message)]
        fn set_test_u128(&mut self,val: u128) {
            self.test_u128.set(val);

            self.env()
                .emit_event(
                    U128Event {
                        val: val,}
                );
        }

并通过polkadot js api调用合同功能:

exports.call_contract = async function(api,contract_addr,caller,method_name,selectorData) {
    const callTx=api.tx.contracts.call(contract_addr,1000000000000,selectorData);

    return new Promise((resolve,reject) => {
        let returnArr = [];
        callTx.signAndSend(caller,({events=[],status}) => {
            if(status.isInBlock) {
            console.log(`callTx (${method_name}) is in block`);
            events.forEach(({event,phase}) => {
                console.log(phase.toString());
                console.log(event.meta.documentation.toString());
                console.log(event.toString());
                if(event.section=="contracts" && event.method=="ContractExecution") {
                    console.log("call from",event.data[0].toString(),"with event data",event.data[1].toString());
                    console.log("raw event data: ",event.data[1]);
                    returnArr.push(event.data[1].toString());
                }
            });
            resolve(returnArr);

            } else {
            console.log('\n',`callTx (${method_name}) waiting to be in block`);
            }
        });
    });
}

async function call_set_test_u128(i) {
    const { api,abiArr,bob } = await base.connect(abiPaths);
    const contractAddr = getContractAddr('contractAddr_simpleC');
    const selector = abiArr[0].messages.setTestU128(i);
    let results = await base.call_contract(api,contractAddr,bob,'set_test_u128()',selector);
    console.log(results);
    return results;
}

但是当我尝试将值设置为273时,我得到了“ 0x11010000000000000000000000000000000000”,结果无法转换回原始273值。正确的十六进制字符串应为“ 0x01110000000000000000000000000000000000”,不是吗?

我还检查了原始的Uint8Array。从事件数据来看,数据是'[17,17,0,0,注册表:TypeRegistry {}]',但是使用numberToU8a(273),它是'Uint8Array [1,17]'。

我缺少一些步骤吗?为什么我不能找回正确的十六进制字符串?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...