IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 区块链 -> 使用ethers.js执行读函数与写函数 -> 正文阅读

[区块链]使用ethers.js执行读函数与写函数

? ? ethers.js是一个简洁的以太坊操作库,使用它非常方便的执行读函数、写函数。下面介绍使用ethers.js执行CountOne.sol里的读写函数。

1、CountOne.sol智能合约

? ? // CountOne.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;

contract CountOne {
    uint    public count;
    address public owner;

    constructor() public {
        count = 0;
        owner = msg.sender;
    }

    function getCount() public view returns(uint) {
        return count;
    }

    function increaseCount() public {
        require(count + 1 > count,"add is overflow");
        count = count + 1;
    }

    function decreaseCount() public {
        require(count >= 1,"sub is overflow");
        count = count - 1;
    }


    function clearCount() public onlyOwner {
        count = 0;
    }

    modifier onlyOwner() {
        require(owner == msg.sender,"info: caller is not owner");
        _;
    }
}

? ? 使用Remix将这个合约部署到Rinkeby测试网,然后编写JS测试脚本,通过contract.count()函数读取值,contract.increaseCount()函数更新值。
? ? Remix合约部署请参考这篇文章

2、创建测试工程ethersDemo

2.1 创建文件夹并初始化

## 创建工程并初始化
mkdri ethersDemo
cd ethersDemo
npm init -y
truffle init

## 创建2个文件
touch .infuraKey
touch .secret

2.2 修改package.json文件

? ? 修改好的package.json文件如下:

{
  "name": "ethersDemo",
  "version": "1.0.0",
  "description": "",
  "main": "",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "@truffle/hdwallet-provider": "^1.7.0",
    "web3": "^1.6.1",
    "@ethereumjs/tx": "^3.4.0",
    "ethers": "^5.5.1"
  },
  "devDependencies": {
    "@babel/core": "^7.12.3",
    "@babel/preset-env": "^7.12.1"
  }
}

2.3 安装依赖包

npm install

2.4 修改solidity的版本

? ? 在truffle-config.js文件里,将solidity的版本修改为0.6.6,并开启development字段,如下:

  networks: {
    development: {
     host: "127.0.0.1",     // Localhost (default: none)
     port: 8545,            // Standard Ethereum port 
     network_id: "*",       // Any network (default: none)
    },

  compilers: {
    solc: {
      version: "0.6.6",  
    }
  } 

2.5 启动ganache

? ? 在ganache里设置IP为127.0.0.1,端口为8545,重启ganache

2.6 拷贝合约

? ? 将第1章的CountOne.sol拷贝到ethersDemo/contracts目录下

3 编译合约,并导出abi

3.1 使用truffle编译合约

cd ethersDemo
truffle console
compile

3.2 导出abi

? ? 在build/contracts目录下,找到CountOne.json,找到abi:字段,在[ 坐标,按Ctrl+Shift+→ 快捷键,即可拷贝整个abi,具体请看这篇文章[json压缩成一行],将其保存到ethersDemo/myabi/countOne_abi.json文件里。

? ? //countOne_abi.json

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"count","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"increaseCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decreaseCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"clearCount","outputs":[],"stateMutability":"nonpayable","type":"function"}]

4、设置infuraKey和私钥

? ? a) 在 infura.io里创建一个工程,在【设置】页面,就得到Project ID,这个Project ID就是infuraKey,如图(2)所示,把它拷贝到ethersDemo/.infuraKey文件里;

图(2) 在infura.io里获取Project ID

? ? b) 点击MEtaMask --> 选中某个Account ----> 详情 —> 导出私钥,将其拷贝ethersDemo/.secret文件里

5、工程目录结构

? ? 整个工程目录结构如下:

图(1) ethersDemo的目录结构

6、执行读写函数

6.1 编写测试脚本

? ? 在ethersDemo/test目录,创建一个脚本: 1.getCount.js

cd ethersDmeo
touch 1.getCount.js

? ? //1.getCount.js

const {ethers} = require("ethers")
const fs = require('fs')

//use rinkeby
let network = getNetWork("4") 
let provider = new ethers.providers.JsonRpcProvider(network)


function getNetWork(netId) {
    let infuraKey = fs.readFileSync(".infuraKey").toString().trim();

    //default network is rinkeby
    let net = 'https://rinkeby.infura.io/v3/'+infuraKey
    if (netId == "4") {
        return net
    }

    switch (netId) {
        case "1":
            net = 'https://mainnet.infura.io/v3/'+infuraKey;
            break;
        case "3":
            net = 'https://ropsten.infura.io/v3/'+infuraKey;
            break;
        case "5":
            net = 'https://goerli.infura.io/v3/'+infuraKey;
            break;
        case "42":
            net = 'https://kovan.infura.io/v3/'+infuraKey;
            break;     
    }
    return net;
}

function getString(prikeyPath) {
    const privKeyFile = fs.readFileSync(prikeyPath).toString().trim();
    const privKey = '0x' + new Buffer.from(privKeyFile);    
    return privKey
}


async function preGetValue(contract) {
    let value = await contract.count()
    let valone = ethers.BigNumber.from(value).toNumber()
    console.log("curValue=",valone)
}

async function preSetValue(contract) {
    let tx = await contract.increaseCount()
    console.log('tx=',tx.hash)
    await tx.wait()
}

async function doValue(){
    var privKey = getString(".secret")
    let wallet = new ethers.Wallet(privKey,provider)
    
    var contractAddr = '0x2F70e8A246350ED1fD7b798F7CeDFdc4E645123D'
    var jsonStr = fs.readFileSync('./myabi/countOne_abi.json')
    var jsonAbi  = JSON.parse(jsonStr)   
    let contract = new ethers.Contract(contractAddr,jsonAbi,wallet)
    //读取旧值
    await preGetValue(contract)

    //执行更新
    await preSetValue(contract)

    //读取更新后的值
    await preGetValue(contract)
}

doValue()

6.2 执行脚本

node test/1.getCount.js

? ? 效果如下:

? ? count值从3变成4,更新成功。
  区块链 最新文章
盘点具备盈利潜力的几大加密板块,以及潜在
阅读笔记|让区块空间成为商品,打造Web3云
区块链1.0-比特币的数据结构
Team Finance被黑分析|黑客自建Token“瞒天
区块链≠绿色?波卡或成 Web3“生态环保”标
期货从入门到高深之手动交易系列D1课
以太坊基础---区块验证
进入以太坊合并的五个数字
经典同态加密算法Paillier解读 - 原理、实现
IPFS/Filecoin学习知识科普(四)
上一篇文章      下一篇文章      查看所有文章
加:2021-11-23 12:24:43  更:2021-11-23 12:25:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:56:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码