首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >传递带有“0x.”的字符串对象值作为bytes32值设置为solidity函数

传递带有“0x.”的字符串对象值作为bytes32值设置为solidity函数
EN

Ethereum用户
提问于 2017-07-05 18:44:30
回答 2查看 8.2K关注 0票数 5

我很难将bytes32从javascript传递到solidity函数。它正在转换为一个不正确的bytes32在坚实。javascript是一个测试,在testRPC v3.0.5上运行的是松露v3.3.1。

代码语言:javascript
复制
MyContract {


  event myEvent(bytes32 id);
  function myTran(bytes32 arg) {
     myEvent(arg);
  }
}

当我传递一个字符串时,它可以工作( myEvent发出一个正确的十六进制):

代码语言:javascript
复制
myContract.myTran( "0x2a1acd26847576a128e3dba3aa984feafffdf81f7c7b23bdf51e7bec1c15944c");

这也适用于:

代码语言:javascript
复制
var x = "0x2a1acd26847576a128e3dba3aa984feafffdf81f7c7b23bdf51e7bec1c15944c";
return myContract.myTran(x);

这是可行的,但我从myEvent接收到的十六进制值与传递的十六进制不同:

代码语言:javascript
复制
 ... 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
EN

回答 2

Ethereum用户

回答已采纳

发布于 2017-07-06 11:35:25

我创建了一个独立的测试用例,结果发现无效的操作码是由其他原因造成的。

无论如何,我测试的结果是,只有当我作为字符串对象传递(它接受它,但转换0x0)时,它才会失败。字符串到其ascii值中)。

作为字符串对象.valueOf()传递:

代码语言:javascript
复制
var testFoo = "0x341f85f5eca6304166fcfb6f591d49f6019f23fa39be0615e6417da06bf747ce";
var testFooObj = new String(testFoo);
return instance.sendFoo(testFooObj.valueOf());
// returns correct:
// "0x341f85f5eca6304166fcfb6f591d49f6019f23fa39be0615e6417da06bf747ce"

作为对象传递:

代码语言:javascript
复制
var testFooObj = new String(testFoo);
return instance.sendFoo(testFooObj);
// returns incorrectly converted:
// "0x2230783334316638356635656361363330343136366663666236663539316434"

合同:

代码语言:javascript
复制
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);
    }

}
票数 4
EN

Ethereum用户

发布于 2017-07-05 19:04:05

你试过传递字符串原语吗?

代码语言:javascript
复制
var x = new String(tx.logs[0].args.id);
return myContract.myTran(x.valueOf()); 
票数 3
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/19502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档