How to authenticate and send contract method using web3.js 1.0

前端 未结 3 478
旧巷少年郎
旧巷少年郎 2020-12-29 15:35

I am confused about how I should be executing a contract\'s method using the web3 1.0 library.

This code works (so long as I manually unlock the account first):

相关标签:
3条回答
  • 2020-12-29 15:42

    Here's a complete example of how to sign a transaction without a local wallet account. Especially useful if you are using infura for the transaction. This was written for

    'use strict';
    const Web3 = require('web3');
    
    const wsAddress = 'wss://rinkeby.infura.io/ws';
    const contractJson = '(taken from solc or remix online compiler)';
    const privateKey = '0xOOOX';
    const contractAddress = '0xOOOX';
    const walletAddress = '0xOOOX';
    
    const webSocketProvider = new Web3.providers.WebsocketProvider(wsAddress);
    const web3 = new Web3(new Web3.providers.WebsocketProvider(webSocketProvider));
    const contract = new web3.eth.Contract(
      JSON.parse(contractJson),
      contractAddress
    );
    // change this to whatever contract method you are trying to call, E.G. SimpleStore("Hello World")
    const query = contract.methods.SimpleStore('Hello World');
    const encodedABI = query.encodeABI();
    const tx = {
      from: walletAddress,
      to: contractAddress,
      gas: 2000000,
      data: encodedABI,
    };
    
    const account = web3.eth.accounts.privateKeyToAccount(privateKey);
    console.log(account);
    web3.eth.getBalance(walletAddress).then(console.log);
    
    web3.eth.accounts.signTransaction(tx, privateKey).then(signed => {
      const tran = web3.eth
        .sendSignedTransaction(signed.rawTransaction)
        .on('confirmation', (confirmationNumber, receipt) => {
          console.log('=> confirmation: ' + confirmationNumber);
        })
        .on('transactionHash', hash => {
          console.log('=> hash');
          console.log(hash);
        })
        .on('receipt', receipt => {
          console.log('=> reciept');
          console.log(receipt);
        })
        .on('error', console.error);
    });
    

    Using

    "web3": "1.0.0-beta.30"

    0 讨论(0)
  • 2020-12-29 15:53

    This code allows me to sign a transaction server-side (node.js) using the privateKey from the account I created (using web3.eth.accounts.create()), and send the signed transaction to the network without having to unlock the account.

    I am using Geth 1.7.1

      var contract = new web3.eth.Contract(contractJson, contractAddress);
      var transfer = contract.methods.transfer("0x...", 490);
      var encodedABI = transfer.encodeABI();
    
      var tx = {
        from: "0x...",
        to: contractAddress,
        gas: 2000000,
        data: encodedABI
      }; 
    
      web3.eth.accounts.signTransaction(tx, privateKey).then(signed => {
        var tran = web3.eth.sendSignedTransaction(signed.rawTransaction);
    
        tran.on('confirmation', (confirmationNumber, receipt) => {
          console.log('confirmation: ' + confirmationNumber);
        });
    
        tran.on('transactionHash', hash => {
          console.log('hash');
          console.log(hash);
        });
    
        tran.on('receipt', receipt => {
          console.log('reciept');
          console.log(receipt);
        });
    
        tran.on('error', console.error);
      });
    
    0 讨论(0)
  • 2020-12-29 15:53

    A way to be able to call your contract methods without having to sign the transaction explicitly is this (web3js 1.0.0):

    const privateKey = 'e0f3440344e4814d0dea8a65c1b9c488bab4295571c72fb879f5c29c8c861937';
    const account = web3.eth.accounts.privateKeyToAccount('0x' + privateKey);
    web3.eth.accounts.wallet.add(account);
    web3.eth.defaultAccount = account.address;
    
    // ...
    contract = new web3.eth.Contract(JSON_INTERFACE, address);
    contract.methods.myMethod(myParam1, myParam2)
            .send({
                from: this.web3.eth.defaultAccount,
                gas: myConfig.gas,
                gasPrice: myConfig.gasPrice
            })
    
    0 讨论(0)
提交回复
热议问题