http://www.7klian.com

合约开拓全新技能栈:Buidler + Ethers + Waffle + Typescript

import { ethers } from “@nomiclabs/buidler”;
  function countUp() public returns (uint256) {
const RINKEBY_PRIVATE_KEY = “”;
配置 buidler.config.ts 以便利用 Ethers 插件(包罗 buidler-waffle插件):
Ethers.js是一个Javascript SDK,用于与以太坊区块链举办交互。当我开始举办Solidity开拓时,我恒久利用Web3.js。当我第一次实验Ethers时,我对它的配置如此简朴以及API的精彩水平感想震惊。我催促曾经利用Web3.js的任何人实验一下Ethers。它具有利用钱包,帐户和合约的所有必须成果,而且还具有一些简捷的实用措施,譬喻ABICoder,HDNode,BigNumber,以及用于十六进制字符串,以太单元和以太坊地点的各类名目化实用措施。
    “esModuleInterop”: true,
     Error: VM Exception while processing transaction: revert Uint256 underflow
mv buidler.config.js buidler.config.ts
在 contracts/ 目次建设一个很是简朴的 Counter.sol 合约文件,当前利用的最新Solidity 版本是 0.6.8:
译者注:这里原作者稍微有点浮夸,其实此刻其他东西链也会给出 revert 原因。
Compiled 2 contracts successfully
配置 TypeChain
此刻可以开始编写代码:
import { Counter } from “../typechain/Counter”;
import { BuidlerConfig, usePlugin } from “@nomiclabs/buidler/config”;
    const signers = await ethers.signers();
  },
    process.exit(1);
颠末测试后,开拓周期的最后一步是陈设合约。
      CounterArtifact
 Welcome to Buidler v1.3.8 
import { BuidlerConfig, usePlugin } from “@nomiclabs/buidler/config”;usePlugin(“@nomiclabs/buidler-waffle”);
本文通过建设一个项目,来实验这些新东西来构建和测试智能合约与DApp[3]。
const config: BuidlerConfig = {
{
在tsconfig.json添加需要的范例界说:
    “target”: “es5”,
  }
Buidler[5] 称本身为“以太坊智能合约开拓者的跑腿”(“task runner for Ethereum smart contract developers”)。在实践中,Buidler将辅佐我们利用模板启动Solidity[6]项目,并提供测试及陈设智能合约所需的所有脚手架。之前,利用 Truffle 初始化(truffle init ),编译(truffle compile ),测试(truffle test )和陈设(truffle migrate )成果来敦促Solidity项目。
import CounterArtifact from “../artifacts/Counter.json”;
import { BuidlerConfig, usePlugin } from “@nomiclabs/buidler/config”;usePlugin(“@nomiclabs/buidler-waffle”);
  // The transaction that was sent to the network to deploy the Contract
       count down
Typescript 无处不在
这根基就是全部了,本文一步步举办建设项目测试、陈设情况,他们都是范例安详的而且利用一些很酷的东西。
    // The url for the Etherscan API you want to use.
const RINKEBY_PRIVATE_KEY = “”;
}
88888P”   “Y88888 888  “Y88888 888  “Y8888  888
为了使一切保持清洁大度,让我们编写一些顺手的NPM剧本。将以下内容添加到您的package.json中:
    “./buidler.config.ts”,
{
      const count = await counter.getCount();
    “outDir”: “dist”,
    “target”: “es5”,
在buidler.config.ts中通过修改solc.version 来配置Solidity版本:
  },
  Create a sample project
  ]
安装插件:
Ethers.js[7] 是一个Javascript SDK,用于与以太坊举办交互。我之前利用Solidity开拓时,一直利用Web3.js。当我第一次实验Ethers.js时,我对它如此简朴及API的精彩水平感想震惊。我推荐曾经利用Web3.js的任何人实验一下Ethers.js。它具有利用钱包,帐户和合约的所有必须成果,而且还具有一些简捷的实用措施,譬喻ABICoder,HDNode,BigNumber,以及用于十六进制字符串,以太单元转换和以太坊地点的各类名目化实用东西。
    “esModuleInterop”: true,
  });
  // The address the Contract WILL have once mined
  },
    outDir: “typechain”,
2.利用从 1 获取的签名器陈设合约。导入 Counter 范例,并将其作为 beforeEach 中陈设的变量的范例。
    outDir: “typechain”,
    “node_modules/@nomiclabs/buidler-ethers/src/type-extensions.d.ts”,
  “build”: “npm run compile && npx buidler typechain”,
  “test”: “npx buidler test”
888 d88P Y88b 888 888 Y88b 888 888 Y8b.     888
$ npm install –save-dev ts-node typescript @types/node @types/mocha
    console.log(“countDown: count =”, count);
});
import { BuidlerConfig, usePlugin } from “@nomiclabs/buidler/config”;usePlugin(“@nomiclabs/buidler-waffle”);

固然还很年青,但已经走了很长一段路。当我于2017年开始开拓Solidity智能合约和以太坊DApp时,Truffle[1]和Web3.js[2]是行业尺度。这些都是很棒的东西。可是,有一些新的东西使开拓流程变得更好。
}
  “compilerOptions”: {
  describe(“count down”, async () => {
  networks: {
  }
封装一下
      let count = await counter.getCount();
  },
    // 3
  typechain: {
编写测试大多遵循Waffle语法[10],但有一个主要区别:ethers.provider工具是从”@nomiclabs/buidler”库而不是ethereum-waffle库导入的。
  // If we had constructor arguments, they would be passed into deploy()
  “compilerOptions”: {
    const initialCount = await counter.getCount();
  event CountedTo(uint256 number);
pragma solidity ^0.6.8;
usePlugin(“buidler-typechain”);
  },
Waffle (替代Truffle 测试东西)
  }
“scripts”: {
  .then(() => process.exit(0))
很是简朴!此刻,在Etherscan[15]上查察合约地点,可以查察到完整的合约源代码,并在网页上读写合约。
    version: “0.6.8”
  await contract.deployed();
    “./scripts”,
> npx builder compile
    console.log(“countUp: count =”, count);
3.Waffle有一些有用的Chai匹配器可用于编写合约测试,譬喻BigNumber匹配器和以太坊地点匹配器。 在这里[11]查察所有内容。
Buidler的杀手级成果是仓库跟踪信息,当您的Solidity 碰着回退(revert)和用console.log()举办调试时,很是好用。
  },
  “include”: [“./scripts”, “./test”],
  const factory = await ethers.getContract(“Counter”);
❯ Create an empty buidler.config.js
我将Infura用作以太坊节点,不外你可以利用任何长途以太坊节点。假如你之前没有利用过 Infura,请从Infura[12]获取API密钥。
4.简朴计数测试,确保计数器正常事情。
  });
  }
可以通过我构建的Typechain插件利用,先安装:
译者注:Chai 是一个断言库,利用链式布局举办断言。
译者注,假如npm 安装慢,本文的npm 呼吁都可以用cnpm替换
    “node_modules/@nomiclabs/buidler-waffle/src/type-extensions.d.ts”,
最后的想法
    return count;
它打印了Solidity 的输出以及仓库信息,显示了触发回退的行号!!! 
    version: “0.6.8”
    outDir: “typechain”,
    “esModuleInterop”: true,
    target: “ethers-v4”
// buidler.config.ts
$ npm install –save-dev @nomiclabs/buidler-etherscan
    “node_modules/@nomiclabs/buidler-waffle/src/type-extensions.d.ts”,
修改buidler.config.ts:
  },
};export default config;
888                        888 888
import { BuidlerConfig, usePlugin } from “@nomiclabs/buidler/config”;
  ]
Buidler有一个超等利便的插件,可用于在Etherscan上验证合约,此任务其实比看起来要巨大。Buidler的东西可觉得帮我们处理惩罚合约组合,当我们导入了其他合约,譬喻利用了OpenZeppelin等库的合约会很是利便。
举办Buidler项目引导:
请继承存眷有关全栈dapp开拓和东西的更多后续帖子!
$ npm install –save-dev buidler-typechain typechain ts-generator @typechain/ethers-v4 @typechain/truffle-v4 @typechain/web3-v1
      <Wallet>signers[0],
    expect(initialCount).to.eq(0);
    version: “0.6.8”
    count = newCount;
async function main() {
npm init
逐行注释合约以查察触发了哪个还原(revert)去揣摩变量值的日子已经一去不复返了。
    rinkeby: {
  “include”: [“./scripts”, “./test”],
    “node_modules/buidler-typechain/src/type-extensions.d.ts”
    “node_modules/@nomiclabs/buidler-ethers/src/type-extensions.d.ts”,
import { BuidlerConfig } from “@nomiclabs/buidler/config”;
假如运行 npx buidler,则会在菜单中看到新呼吁typechain。
我会继承密切存眷这个项目,并尽我所能为其生态系统做出孝敬。
    “resolveJsonModule”: true
import { Wallet } from “ethers”;
};
    “./buidler.config.ts”,
const ETHERSCAN_API_KEY = “”;
    });
{
$ mkdir contracts test scripts
888  888 888  888 888 888  888 888 88888888 888
$ npx buidler test
Ethers.js (替代Web3.js)
  “files”: [
usePlugin(“@nomiclabs/buidler-etherscan”);
  solc: {
usePlugin(“buidler-typechain”);const config: BuidlerConfig = {
东西链
此刻开始真正有趣的实践!在一个空文件夹中,运行以下呼吁初始化一个npm项目:
export default config;
{
    “module”: “commonjs”,
陈设合约
      await counter.countUp();
  },
888               Y8P      888 888
    “node_modules/@nomiclabs/buidler-ethers/src/type-extensions.d.ts”,
    counter = (await deployContract(
[1] Truffle: https://learnblockchain.cn/docs/truffle/
    “outDir”: “dist”,
安装Typescript需要的依赖项:
usePlugin(“@nomiclabs/buidler-waffle”);
};export default config;
  solc: {
88888b.  888  888 888  .d88888 888  .d88b.  888d888
    // Obtain one at https://etherscan.io/
此刻在typechain/目次中,您应该看到生成了一些文件,个中最主要的是Counter.d.ts。这是合约对应的 Typescript 范例文件,提供了范例安详测试所需的信息!
usePlugin(“@nomiclabs/buidler-waffle”);
  },
usePlugin(“buidler-typechain”);const INFURA_API_KEY = “”;
建设一些目次来生存项目文件,如 contracts,test,scripts, 呼吁如下:
    version: “0.6.8”
}
    // 2
      accounts: [RINKEBY_PRIVATE_KEY]
      url: `https://rinkeby.infura.io/v3/${INFURA_API_KEY}`,
export default config;
Builder设置文件中添加 typechain以设置插件:
      at Counter.countDown (contracts/Counter.sol:29)
$ npm install –save-dev @nomiclabs/buidler
    emit CountedTo(count);
    apiKey: ETHERSCAN_API_KEY
    “module”: “commonjs”,
    it(“should count down”, async () => {
初始化进程中,需要多项目有一个简朴的配置,因为我们只是演练,可以随意填。
给 tsconfig 添加范例:
const config: BuidlerConfig = {
      expect(count).to.eq(1);
$ npx buidler verify-contract –contract-name Counter –address 0xF0E6Ea29799E85fc1A97B7b78382fd034A6d7864
      await counter.countDown();
  “files”: [
import { deployContract, solidity } from “ethereum-waffle”;
    “./buidler.config.ts”,
  defaultNetwork: “buidlerevm”,
  “include”: [
    // Your API key for Etherscan
import { BuidlerConfig } from “@nomiclabs/buidler/config”;
$npm install –save-dev ethers @nomiclabs/buidler-waffle ethereum-waffle
All contracts have already been compiled, skipping compilation.
  ]
项目启动(Project setup)
福利: 在Etherscan上验证
      accounts: [RINKEBY_PRIVATE_KEY]
    return count;
重定名Builder设置文件buidler.config.js,修改后缀并使其范例安详:
    “esModuleInterop”: true,
2 passing (1s)
    console.error(error);
接下来,我们在buidler.config.ts中添加所需的设置,前往Etherscan[14]并从您的帐户页面获取API密钥:
  });
}
  }
    “module”: “commonjs”,
export default config;
  defaultNetwork: “buidlerevm”,
    “strict”: true,
References
? What do you want to do? … 
    target: “ethers-v4”
通过运行呼吁npx buidler typechain来生成范例文件。
    });
  // 4
  }
我们可以前往 Etherscan[13] 查察生意业务详情。
      await counter.countDown();
Typescript 最近很火,这是有原因的。对我而言,,Typescript 的最大的改变是 IDE的集成,它提供所有类属性,工具键,函数参数等的自动补全成果。熟悉Typescript之后,我再也不会回过甚来编写原始Javascript了。
const INFURA_API_KEY = “”;
         should fail:
All contracts have already been compiled, skipping compilation.
    “outDir”: “dist”,
}
outDir 界说了发生文件的目次,生成方针的文件指定匹配ethers 。
  describe(“count up”, async () => {
      await counter.countUp();
Successfully verified contract on etherscan
    version: “0.6.8”
  // The contract is NOT deployed yet; we must wait until it is mined
    // 5
    }
陈设很是简朴,此刻运行这个剧本,我们在节制台可以看到地点及生意业务hash.
    rinkeby: {
    “node_modules/@nomiclabs/buidler-etherscan/src/type-extensions.d.ts”,
TypeChain[9] 是一款很是酷的东西,可为智能合约提供完整的范例接口。配置完成后,我们可以在Typescript中得到合约函数的范例提示!
  function getCount() public view returns (uint256) {
  function countDown() public returns (uint256) {
让我们运行测试。
  typechain: {
    emit CountedTo(count);
const config: BuidlerConfig = {};
    “strict”: true,
    “strict”: true,
}
假如您需要任何辅佐,请执行Telegram上的Buidler Support group[16],这是迅速办理问题的好资源。Nomic Labs团队常常在外面闲逛,而且回响迅速。
    “resolveJsonModule”: true
    count = newCount;
    }
    “strict”: true,
  solc: {
建设和编译合约
    });
  typechain: {
const config: BuidlerConfig = {
    “./buidler.config.ts”
$ npx buidler run –network rinkeby scripts/deploy.ts 
chai.use(solidity);
    “target”: “es5”,
  let counter: Counter;
};
  uint256 count = 0;
    “node_modules/@nomiclabs/buidler-waffle/src/type-extensions.d.ts”
在根目次中建设tsconfig文件:
    uint256 newCount = count – 1;
但愿我们可以顺手生存上一步的陈设地点,因为这样就可以简朴地运行插件提供的内置呼吁来验证合约:
0x2ae1444920ed76420fb69c9f2fc914c20956efc2ae05c94ab1ea53f224aa0930
  }
此刻,我们在 scripts 文件夹内建设一个名为deploy.ts的陈设剧本:
const { expect } = chai;
第一步是将网络设置添加到buidler.config.ts文件。为此,本案例我们将利用rinkeby,但您可以雷同地添加任何网络(如:mainnet),设置很简朴:
usePlugin(“buidler-typechain”);
Successfully submitted contract at 0xF0E6Ea29799E85fc1A97B7b78382fd034A6d7864 for verification on etherscan. Waiting for verification result…
  defaultNetwork: “buidlerevm”,
    “outDir”: “dist”
const config: BuidlerConfig = {
0x01FF454Dd078dC7f3cd0905601d093b17E7B9CD7
    “module”: “commonjs”,
留意在功效中有不寻常的内容:
上面提到的所有东西都可以与Typescript一起很好地事情,而且一旦完成所有配置,开拓的体验很梦幻。
  },
import { ethers } from “@nomiclabs/buidler”;
1.从Ethers获取一写预先存款的签名器。
编写和运行合约测试
然后,添加到tsconfig.json以确保我们的Typescript情况利用此插件:
test 剧本运行合约测试。
      url: `https://rinkeby.infura.io/v3/${INFURA_API_KEY}`,
import chai from “chai”;
  ]
    version: “0.6.8”,
contract Counter {
You probably meant to type buidler. We got you.
main()
  },
    “target”: “es5”,
[2] Web3.js: https://learnblo

888               d8b      888 888
  “compile”: “npx buidler compile”,
在整个利用进程中,Buidler的开拓者体验给我留下了深刻的印象。它具备许多酷炫成果,而且他们打算构建更多更酷的对象。除了Solidity仓库跟踪,该团队还打算推出另一个急需的智能合约调试成果:console.log!。
选择”Create an empty buidler.config.js”选项,意思是常见一个新的而不是参考一个样例。
$ npx buidler
 Config file created 
首先,我们将Buidler设置为利用其buidlerevm网络,该网络提供了所有Solidity调试邪术:
    require(newCount > count, “Uint256 overflow”);
配置 Typescript
  “files”: [
  “compilerOptions”: {
    // 1
  },
  console.log(contract.deployTransaction.hash);
  solc: {
  networks: {
  etherscan: {
const config: BuidlerConfig = {
  “compilerOptions”: {
      expect(count).to.eq(0);
    it(“should count up”, async () => {
    target: “ethers”
  ],
}
    url: “https://api-rinkeby.etherscan.io/api”,
  let contract = await factory.deploy();
  }
  typechain: {
Builder 集成了编译任务,因此编译是小菜一碟:
此刻让我们编写一个测试。在 test/ 目次中建设一个名为counter.ts的文件:
  .catch(error => {
本文代码在Starter Kit repo[4],克隆下来,就可以在成果齐全的Typescript开拓情况中举办开拓,编译,测试和陈设。
build 用于执行合约编译并生成TypeChain绑定
代码中几处标志处表明如下:
    “./test”
  console.log(contract.address);
  solc: {
import “@nomiclabs/buidler/console.sol”;
  solc: {
describe(“Counter”, () => {
    outDir: “typechain”,
    it(“should fail”, async () => {
Compiling…
  });
    return count;
  “files”: [
    require(newCount < count, “Uint256 underflow”);
Buidler (替代Truffle)
    “resolveJsonModule”: true
    target: “ethers-v4”
Buidler利用AMAZING 来对Solidity举办版本节制。切换版本很容易,Buidler会按照需要自动下载并安装Solidity版本,您所需要做的就是在设置中举办变动。Buidler团队提供了许多选项举办配置!
};export default config;
usePlugin(“@nomiclabs/buidler-etherscan”);
  beforeEach(async () => {
Ethereum Waffle[8] 是以太坊智能合约的轻量级测试运行器。Waffle内置了一些很是不错的测试东西函数,譬喻用于以太坊地点,哈希和BigNumbers的Chai匹配器,Waffle利用原生Typescript,与Ethers.js共同很是好。
安装 Buidler:
    expect(counter.address).to.properAddress;
利用Ethers和Waffle设置测试情况
  “include”: [“./scripts”, “./test”],
此刻,建设一个测试情况,安装 Ethers, Waffle, 以及 Buidler 插件:
5.此测试将失败,值得存眷,等下会看到 Buidler 的真正魔力。
    uint256 newCount = count + 1;
此刻运行测试:
888 “88b 888  888 888 d88″ 888 888 d8P  Y8b 888P”
  1 failing1) Counter
$ npx buidler
    “node_modules/buidler-typechain/src/type-extensions.d.ts”
    )) as Counter;
}

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

相关文章阅读