首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用Web3JS/ethereumjs的合同

调用Web3JS/ethereumjs的合同
EN

Ethereum用户
提问于 2017-11-28 22:46:12
回答 1查看 2.2K关注 0票数 0

我想在区块链上执行一份聪明的合同。据我所知,这个web3js提供了两个选项

  • call:在不使用gas的情况下在本地执行合同方法
  • execute:在区块链上执行合同方法,并需要气体。

我不知道如何使用特定的钱包。

代码语言:javascript
复制
const ABI = require('./contracts/abi.json');
const addressContract = "xyz";
const Web3 = require('web3');
const Tx = require('ethereumjs-tx');

const wallet = {
  public: somePublicKey,
  private: somePrivateKey
}

const web3 = new Web3(new Web3.providers.HttpProvider(config.provider));
const contract = new self.web3.eth.Contract(ABI, addressContract);
const options= {
    from: wallet.public,
    gasPrice: process.env.GAS
    gasLimit: 250000

  }
contract.methods.methodA(param1,param2,param3).send(options, (err, txHash)=> {
  console.log("err",err)
  console.log("txHash",txHash)
})

我发现,要执行合同,有一个名为以太-tx的插件,它将修改我的代码如下:

代码语言:javascript
复制
//options.data = ?
options.to = addressContract
options.nonce = someNonce
const tx = new Tx(options);
tx.sign(new Buffer(wallet.private, 'hex'));
const rawTx = `0x${tx.serialize().toString('hex')}`;
self.web3.eth.sendRawTransaction(rawTx, (err, result) => {
  console.log("err",err)
  console.log("txHash",txHash)
});

我基本上是在为data的财产而挣扎。因为contract.methods.methodA.getData不存在。

问题

1)如何将我的params添加到数据格式中?/或者我只是将它们添加到options而不是options.data中?

编辑:我想我可以把所有的参数都输入:https://github.com/ethereumjs/ethereumjs-abi

代码语言:javascript
复制
var parameterTypes = ["address", "uint256", "address", "uint256", "uint256", "uint256", "address", "uint8", "bytes32", "bytes32", "uint256"];
var parameterValues = ["0x1234567812345678", 256, "0x1234567812345678", 256, 256, 256, "0x1234567812345678", 8, 32, 32, 256];

var encoded = abi.rawEncode(parameterTypes, parameterValues);

并使用'0x'+encoded将结果附加到数据中。

有用链接

文档

EN

回答 1

Ethereum用户

回答已采纳

发布于 2017-11-29 02:50:07

当您试图使用.send()调用该函数时,您得到的错误是什么?如果你能搞清楚的话,这实际上要简单得多。要从特定的钱包/地址发送,您需要在选项中输入该地址作为from字段的值。

你得确保钱包没锁。

如果您使用这段代码来解锁帐户(即签署事务),并且您有私钥(wallet.private),那么在块链节点(web3.Personalor geth/tru显控制台:Personal.unlockAccount(地址“密码”))中直接这样做比较容易。

好吧,但回到你的问题上。

.getData()似乎已经从web3 1.0中删除,而不是.encodeABI()。因此,您可以尝试使用.encodeABI() (我还没有尝试过,但是从文档看来应该这样做),或者使用web3的早期版本(这需要您更改一些代码检查这里)和getData

在您的问题中链接到的文档是web3 0.2x.x。但是,获取契约实例的初始代码看起来类似于web3 1.0.x。有相当大的变化,以及为什么您不能罚款getData

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

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

复制
相关文章

相似问题

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