如何解决无法通过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 举报,一经查实,本站将立刻删除。