我很难将bytes32从javascript传递到solidity函数。它正在转换为一个不正确的bytes32在坚实。javascript是一个测试,在testRPC v3.0.5上运行的是松露v3.3.1。
MyContract {
event myEvent(bytes32 id);
function myTran(bytes32 arg) {
myEvent(arg);
}
}当我传递一个字符串时,它可以工作( myEvent发出一个正确的十六进制):
myContract.myTran( "0x2a1acd26847576a128e3dba3aa984feafffdf81f7c7b23bdf51e7bec1c15944c");这也适用于:
var x = "0x2a1acd26847576a128e3dba3aa984feafffdf81f7c7b23bdf51e7bec1c15944c";
return myContract.myTran(x);这是可行的,但我从myEvent接收到的十六进制值与传递的十六进制不同:
... tx executed before ...
var x = new String( tx.logs[0].args.id );
console.log(typeof x, x); // output: string 0x2a1acd26847576a128e3dba3aa984feafffdf81f7c7b23bdf51e7bec1c15944c
return myContract.myTran(x); // executes but the bytes32 in the event is different发布于 2017-07-06 11:35:25
我创建了一个独立的测试用例,结果发现无效的操作码是由其他原因造成的。
无论如何,我测试的结果是,只有当我作为字符串对象传递(它接受它,但转换0x0)时,它才会失败。字符串到其ascii值中)。
作为字符串对象.valueOf()传递:
var testFoo = "0x341f85f5eca6304166fcfb6f591d49f6019f23fa39be0615e6417da06bf747ce";
var testFooObj = new String(testFoo);
return instance.sendFoo(testFooObj.valueOf());
// returns correct:
// "0x341f85f5eca6304166fcfb6f591d49f6019f23fa39be0615e6417da06bf747ce"作为对象传递:
var testFooObj = new String(testFoo);
return instance.sendFoo(testFooObj);
// returns incorrectly converted:
// "0x2230783334316638356635656361363330343136366663666236663539316434"合同:
pragma solidity ^0.4.11;
contract Bytes32Test {
bytes32[] public fooStore;
function getFooStoreLength() constant returns (uint len) {
return fooStore.length;
}
event logFoo(bytes32 foo);
function sendFoo(bytes32 foo) {
fooStore.push(foo);
logFoo(foo);
}
}发布于 2017-07-05 19:04:05
你试过传递字符串原语吗?
var x = new String(tx.logs[0].args.id);
return myContract.myTran(x.valueOf()); https://ethereum.stackexchange.com/questions/19502
复制相似问题