Web3.js与智能合约交互

本文提供了一篇关于Web3.js的详细教程,Web3.js是用于以太坊区块链开发的JavaScript库。教程涵盖了从安装、设置到使用Web3.js进行智能合约交互的步骤,包括调用和发送交易。示例代码展示了如何在Node.js环境中以及H5版本中与以太坊网络进行通信,获取账户余额和执行智能合约操作。
摘要由CSDN通过智能技术生成

Web3.js教程:

web3.js - 以太坊 JavaScript API — web3.js 中文文档 — 登链社区https://learnblockchain.cn/docs/web3.js/index.html

Web3js源码:

GitHub - ChainSafe/web3.js: Ethereum JavaScript APIhttps://github.com/ChainSafe/web3.js初始化

cd web3jTest
npm init

下载web3到项目中

npm install web3 --save

交互代码示例:

Nodejs版本:

var Web3 = require('web3');
var provider = new Web3.providers.HttpProvider("http://localhost:7545");

var web3 = new Web3(provider);

var json = require("./contracts/MetaCoin.json");
var contractAddr = '0x9C334Fb3287dA1E6cc063B084c5432985a708999';

var metacoin = new web3.eth.Contract(json['abi'],contractAddr);

var account = "0x060f4e095Eeb77ad987412578652a5201436E3c3";

metacoin.methods.getBalance(account).call({from: account}, function(error, result){
    console.log(error);
    console.log(result);
});

//内网测试
metacoin.methods.buyNow(10000, 1).send({from: account, gas: "300000"}, function(error, transactionHash){
  console.log(error)
  console.log(transactionHash)
});

//公网测试
var functionEncode = metacoin.methods.buyNow(10000, 1).encodeABI();
console.log(functionEncode)
var sign = web3.eth.accounts.signTransaction({
  from: account,
  gasPrice: 20000000000,
  gas: 300000,
  to: contractAddr,
  data: functionEncode,
}, privateKey, function(error, result){
  console.log(error)
  console.log("signTransaction:", result)
  var result = web3.eth.sendSignedTransaction(result.rawTransaction, function(error, result){
    console.log(error)
    console.log("sendSignedTransaction:", result)
  });
});

测试执行

node test.js

执行结果:

null
9500

H5版本:

<script src="./dist/web3.min.js"></script>
<script>
  const tokenABI = [...];
  var ethereum
  var localAccount
  if (typeof window.ethereum !== 'undefined') {
    console.log('MetaMask is installed!')
    ethereum = window.ethereum
  }
  const contractAddr = '0x28e784AB8FA34321cb78F7F92B8b374646111111';

  //获取当前钱包地址
  ethereumButton.addEventListener('click', () => {
    event.preventDefault()
    ethereum.request({
      method: 'eth_requestAccounts'
    }).then((ret) => {
      localAccount = ret[0]
      console.log('accounts: ', ret)
    })
  })

  getNonceButton.addEventListener('click', (event) => {
    event.preventDefault()
    getBalanceTx()
  })

  buyNowButton.addEventListener('click', (event) => {
    event.preventDefault()
    buyNowTx(10000, 1)
  })
</script>


<script type="text/javascript">
  const buyNowTx = async (artworkId, num) => {
    var web3 = new Web3(ethereum)
    var tokenContract = new web3.eth.Contract(tokenABI, contractAddr)
    var nonceVal = await web3.eth.getTransactionCount(localAccount);
    var ret =  await tokenContract.methods.buyNow(artworkId, num).send({
      from: localAccount,
      nonce: nonceVal,
      gas: 800000
    })
    console.log(ret.transactionHash)
    return ret
  }

  const getBalanceTx = async () => {
    var web3 = new Web3(ethereum)
    var tokenContract = new web3.eth.Contract(tokenABI, contractAddr)
    var balance = await tokenContract.methods.getBalance(localAccount).call()
    console.log("balance:", balance)
    return balance
  }
</script>
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值