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