Solidity
將具有“0x ..”值的字元串對像作為 bytes32 傳遞給solidity函式
我無法從 javascript 將 bytes32 傳遞給solidity 函式。它在solidity中轉換為不正確的bytes32。javascript 是一個測試,在 testRPC v3.0.5 上使用 truffle 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
我創建了一個獨立的測試案例,結果發現無效的操作碼是由其他原因引起的。
無論如何,我的測試結果是,只有當我作為 String 對像傳遞時它才會失敗(它接受它但將 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); } }
您是否嘗試過傳入字元串原語?
var x = new String(tx.logs[0].args.id); return myContract.myTran(x.valueOf());