Solidity

將具有“0x ..”值的字元串對像作為 bytes32 傳遞給solidity函式

  • July 6, 2017

我無法從 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()); 

引用自:https://ethereum.stackexchange.com/questions/19502