首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用sendRawTransaction调用我的合同函数?

如何使用sendRawTransaction调用我的合同函数?
EN

Ethereum用户
提问于 2018-02-12 11:23:04
回答 2查看 1.5K关注 0票数 1

我正在尝试使用sendRawTransaction调用我的合同的方法。我的合同里有我的职责

代码语言:javascript
复制
updateReading(address consumerAddress,
            uint32 consumerMeterId,
            uint64 consumedReadingValue,
            address producerAddress,
            uint32 producerMeterId,
            uint64 producedReadingValue)

我想用sendRawTransaction来称呼它。updateReading函数更新合同的合同状态。如何使用sendRawTransaction调用此函数?

我使用块菌框架进行开发,我在js中编写了以下代码来使用sendRawTransaction调用函数。

代码语言:javascript
复制
        var privateKey = new Buffer(password,'hex')
        var setData;
        var contractAddress;
        EnergyTrade.deployed().then(function (instance) {
              contractAddress=instance.address;
              setData=instance.updateReading(consumerAddress,consumerMeterId,consumedReadingValue,producerAddress,producerMeterId,producedReadingValue);

              var rawTx = {
                    to:contractAddress, 
                    from:consumerAddress,
                    data: setData
                  }


              var tx = new Tx(rawTx);
              tx.sign(privateKey);

              var serializedTx = tx.serialize();
              web3.eth.sendRawTransaction(serializedTx.toString('hex'), function(err, hash) {
                    if (!err)
                      console.log(hash); 
              });

        })

它在我的控制台中返回以下错误。

代码语言:javascript
复制
    (node:23336) UnhandledPromiseRejectionWarning: Error: invalid type
at Object.exports.toBuffer (/home/maria/Desktop/12-Energy/node_modules/ethereumjs-util/dist/index.js:177:13)
at Transaction.setter [as data] (/home/maria/Desktop/12-Energy/node_modules/ethereumjs-util/dist/index.js:625:19)
at /home/maria/Desktop/12-Energy/node_modules/ethereumjs-util/dist/index.js:685:63
at Array.forEach (<anonymous>)

另一个问题是

代码语言:javascript
复制
   (node:23336) UnhandledPromiseRejectionWarning: Error: invalid address
at inputAddressFormatter (/home/maria/Desktop/12-Energy/node_modules/truffle-contract/node_modules/web3/lib/web3/formatters.js:271:11)
at inputTransactionFormatter (/home/maria/Desktop/12-Energy/node_modules/truffle-contract/node_modules/web3/lib/web3/formatters.js:97:20)
at /home/maria/Desktop/12-Energy/node_modules/truffle-contract/node_modules/web3/lib/web3/method.js:89:28
at Array.map (<anonymous>)

如何使用松露框架使js中的sendRawTransaction成为可能?

EN

回答 2

Ethereum用户

回答已采纳

发布于 2018-02-12 12:20:26

正如错误消息所述,Tru显没有getData方法,但是从我对代码的阅读中,我相信您可以通过contract成员访问底层的web3.js契约对象。试一试:

代码语言:javascript
复制
setData=instance.contract.updateReading.getData (consumerAddress,consumerMeterId,consumedReadingValue,producerAddress,producerMeterId,producedReadingValue);
票数 4
EN

Ethereum用户

发布于 2018-02-12 12:48:10

代码中的问题是这行中的instance.updateReading()。Web3js将作为基于原始abi的直接函数调用(sendTransation或call())来处理。也就是说,它不会创建bin或十六进制字符串。

对于getData()方法,我不太确定。根据web3js,您可以使用encodeABI(),此方法将返回字节码。

简单地说你可以附加你的

代码语言:javascript
复制
setData = instance.updateReading(consumerAddress,consumerMeterId,consumedReadingValue,producerAddress,producerMeterId,producedReadingValue).encodeABI();

欲知更多详情,请参阅以下连结

https://web3js.readthedocs.io/en/1.0/web3-eth-contract.html#methods-mymethod-encodeabi

https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethsendrawtransaction

票数 2
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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