FROM : https://docs.blockstack.org/core/smart/sdk-quickstart.html
您可以使用software developer kit (SDK)来开发、测试和部署Clarity 智能合约。SDK超越了基本的测试环境,允许开发调用Clarity合约的Javascript或TypeScript客户端。
关于本教程和您需要的先决条件
任务1:生成一个初始的Clarity项目
任务2:调查生成的项目
任务三:试着扩大合同
Clarity在预发布中
Clarity及其附带的工具集和SDK都在预发行版中。如果您遇到有关Clarity的问题或有特性请求,请在blockstack/blockstack-core存储库上创建一个问题。要阅读以前的或加入正在进行的关于智能合约的讨论,特别是关于Clarity的讨论,请访问Blockstack论坛中的智能合约主题。
关于本教程和您需要的先决条件
对于本教程,您将使用npm来管理依赖项和脚本。本教程依赖于npm依赖关系管理器。在开始之前,请使用要验证的命令验证是否安装了npm。
$ which npm
/usr/local/bin/npm
如果在系统中没有找到npm,请安装它。
使用npm安装Yeoman。Yeoman是一个通用的脚手架系统,帮助用户快速启动新项目,并简化现有项目的维护。使用which命令验证您已经安装了yo。
$ which yo
/usr/local/bin/yo
如果没有Yeoman,可以使用npm install -g yo命令安装它。
任务1:生成一个初始的Clarity项目
SDK使用Yeoman生成一个项目脚手架——一组初始目录和文件。
1.为项目创建一个新目录。
mkdir hello-clarity-sdk
2.切换到新的项目目录。
cd hello-clarity-sdk
3.使用npm命令初始化Clarity项目。
npm init yo clarity-dev
npx: installed 15 in 1.892s
create package.json
create .vscode/extensions.json
...
Project created at /private/tmp/hello-clarity-sdk
✔ create-yo ok!
根据您的连接速度,可能需要花费一些时间来构建脚手架。
任务2:调查生成的项目
你的项目应该包含三个目录:
目录 | 描述 |
---|---|
contracts | 这里包含.clar文件(Clarity合约文件)。 |
test | 包含用于测试应用程序的文件 |
node_modules | 包含项目所依赖的包。添加npm |
合约目录在sample/hello-world中包含一个sample/hello-world.clar文件。
(define (say-hi)
"hello world")
(define (echo-number (val int))
val)
该合约公开了两个基本功能。say-hi返回一个hello world字符串。
increment-number : 打印 val。
该项目还包括tests/hello-world.ts文件。测试是用Typescript写的。您还可以用Javascript编写测试。
import { Client, Provider, ProviderRegistry, Result } from "@blockstack/clarity";
import { assert } from "chai";
describe("hello world contract test suite", () => {
let helloWorldClient: Client;
let provider: Provider;
before(async () => {
provider = await ProviderRegistry.createProvider();
helloWorldClient = new Client("hello-world", "sample/hello-world", provider);
});
it("should have a valid syntax", async () => {
await helloWorldClient.checkContract();
});
describe("deploying an instance of the contract", () => {
before(async () => {
await helloWorldClient.deployContract();
});
it("should return 'hello world'", async () => {
const query = helloWorldClient.createQuery({ method: { name: "say-hi", args: [] } });
const receipt = await helloWorldClient.submitQuery(query);
const result = Result.unwrap(receipt);
const parsedResult = Buffer.from(result.replace("0x", ""), "hex").toString();
assert.equal(parsedResult, "hello world");
});
it("should echo number", async () => {
const query = helloWorldClient.createQuery({
method: { name: "echo-number", args: ["123"] }
});
const receipt = await helloWorldClient.submitQuery(query);
const result = Result.unwrap(receipt);
assert.equal(result, "123");
});
});
after(async () => {
await provider.close();
});
});
hello-world.ts测试文件是一个运行hello-world.clar合约。测试对于智能合约来说是至关重要的,因为测试的目的是操纵资产及其所有权。这些操作在区块链中是不可逆的。在创建合约时,如果您在测试中花费的时间和代码比在契约目录中花费的时间更多,您应该不会感到惊讶。tests/hello-world.ts文件包含以下内容:
测试的第一部分(第1 -10行)设置测试环境。它定义了一个Clarity provider并启动它(第9行)。这个测试还检查客户端(第14行),然后启动它(第19行),这相当于用命令行运行clear -cli check。其余的测试代码执行契约。试着运行这个测试。
npm run test
hello-clarity-sdk@0.0.0 test /private/tmp/hello-clarity-sdk
mocha
hello world contract test suite
✓ should have a valid syntax
deploying an instance of the contract
✓ should print hello world message
✓ should echo number
3 passing (182ms)
在下一节中,尝试扩展hello-world。明白”计划。
任务3:试着扩大合约内容
在这个任务中,您将面临扩展contracts/hello-world.clar的挑战。使用您最喜欢的编辑器并打开contracts/hello-world.clar文件。如果使用Visual Studio代码,可以安装Blockstack Clarity扩展。该扩展提供语法着色和一些自动完成功能。
编辑hello-world.clar文件
;; Functions
(define (hello-world)
"hello world")
(define (echo-number (val int))
val)
使用+函数创建一个递增10的函数。
;; Functions
(define (say-hi)
"hello world")
(define (increment-number (number int))
(+ 1 number))
(define (increment-number-by-10 (number int))
(+ 10 number))
使用+和-函数创建用户定义的递减数方法。
;; Functions
(define (say-hi)
"hello world")
(define (increment-number (number int))
(+ 1 number))
(define (increment-number-by-10 (number int))
(+ 10 number))
(define (decrement-number (number int))
(- number 1))
最后,尝试添加counter变量,并确保存储它。在代码中增加counter并添加get-counter函数来返回结果。这里有一个提示,你可以添加一个var '到一个合约添加以下行(在函数之前):
;; Storage
(define-data-var internal-value int 0)
答案:
;; Storage
(define-data-var counter int 0)
;; Functions
(define (say-hi)
"hello world")
(define (increment-number (number int))
(+ 1 number))
(define (increment-number-by-10 (number int))
(+ 10 number))
(define (decrement-number (number int))
(- number 1))
(define (increment-counter)
(set-var! counter (+ 1 counter)))
(define (get-counter)
(counter))
要查看其他更长时间的示例程序,请访问clear -js-sdk存储库。
网友评论