查看原文
其他

Patract 重要里程碑:Redspot v0.4完成主要开发计划

Patract Patract开放平台 2021-10-13



10个月前,Patract 提交了 Redspot v0.1 的国库提案#0[1],并描述了未来4个版本的开发规划。几周前,我们提交了 Redspotv 0.4的国库提案#44[2],现在我们已经完成了全部的计划。Redspot 正在努力让 ink! 的发展进行项目化并简化测试以及与合约的交互。源码和文档在 https://github.com/patractlabs/redspot/。




Redspot v0.4 的新增功能


Redspot 的核心功能已经在 Redspot v0.3 的时候完成了。在 Redspot v0.4 我们主要做了一些使用体验上的优化,比如添加了 docker 的支持,添加了 GUI 界面,支持浏览器插件签名,以及其他一些优化。现在让我们展示 v0.4 的设计和实现,以及如何运行和验证。和 Redspot v0.3 一样,你可以通过 npx redspot-new ERC20 在本地安装一个模版项目。具体使用方法可以参考之前的报告或者我们的文档。


Redspot 多合约编译


ink! 的官方编译工具, cargo-contract 是不支持编译多合约的,需要编写额外的脚本[3]完成 。但在 Redspot v0.4 中,我们很好地实现了多合约编译。它支持合约文件的自动检测,以及多语言的合约同时编译。

对于 ink! 合约,Redspot 会通过查找已配置的目录下的所有 cargo.toml 文件,然后解析 cargo.toml 文件,如果包含 ink_lang 依赖,则会认为这是一个 ink! 合约。然后即可找到该项目下所有的合约。

对于 solang 合约,Redspot 是通过匹配 .sol 文件,从而实现查找所有合约的功能。

Redspot 默认模版合约的编译配置如下:
...

export default {
...
contract: {
  ink: {
    toolchain: "nightly",
    sources: ["contracts/**/*"],
  },
},
...
};
其中,toolchain 表示编译合约时需要使用的 toolchain, sources 表示需要找到的目录,支持 glob 语法。同时 sources 选项,也可以通过命令行指定,这会覆盖 config 文件中的配置选项:

也可以指定单个目录,这个就可以编译单个合约了:
npx redspot compile "contracts/erc20"

solang 也是类似的配置:

...

export default {
...
contract: {
  ink: {
    toolchain: "nightly",
    sources: ["contracts/**/*"],
  },
  solang: {
    sources: ['contracts/**/*.sol']
  }
},
...
};

ink! 和 solang 可以同时存在,Redspot 对 ink! 合约使用 cargo-contract,对 solang 合约使用 solang 编译器编译。将来我们也会对其他编译器提供支持。


所有的编译产物能够在 artifacts (或者用户自己配置的目录)下找到:

-- artifacts
    -- erc20.contract
    -- erc20.json
Redspot 会对同一个合约生成一个 .contract 文件和一个 .json 文件。.contract 包含了所有 .json 所有信息,并且还额外包含 Wasm 的源码。所以 .json 仅仅只是提供给前端,在前端不需要上传 Wasm 的情况下使用。

注意,项目中多个合约的名字不应该是一样的。Redspot 会检测到这种情况然后报错。可以在https://github.com/patractlabs/redspot/tree/master/examples/multi-contract/README.md 中找到合约编译的例子。

克隆 Redspot 仓库,然后进入 redspot/examples/multi-contract 目录。


然后安装依赖:
$ yarn

然后你需要确保你已安装 cargo-contract[4]和 solang[5]。Redspot 不会自动安装他们。


然后运行编译命令:
$ npx redspot compile
这将会一次性编译所有合约,包括 solang 合约,solang 合约可以在 contracts/filpper 下找到。编译产物可以在artifacts目录下找到,然后我们删除artifacts文件夹。运行命令:
$ npx redspot compile contracts/erc20
可以编译 ERC20 合约。检测artifacts文件夹,只有 ERC20 合约的编译产物。


Redspot known types


Redspot known types 是一个自动添加已知的链的 types 的插件。

在 Polkadot 中,添加 types 是很麻烦的事,因为必须手动添加,而不能自动生成。而且有时候也要处理不同链的版本的兼容性问题。

我们希望使用 Redspot 的用户,能够专注合约开发,而不用关心这些细枝末节的事。所以我们添加了这个插件,目的就是为了解决不同链的 types 的问题。

大部分链都在 Polkadot apps 上提交过 types,所有 types 定义都在 @polkadot/apps-config 这个 npm 包里面。所以我们会部分引用@polkadot/apps-config 中的 types 定义。但 @polkadot/apps-config 缺少开发环境的 types 定义。然后我们会手动补这一部分。目前支持的链有 Canvas, Jupiter, Europa,Edgeware,Plasm,Clover。


我们已经将这个插件默认加入模版,用户无需进行额外配置。如果需要手动添加这个插件,首先安装依赖:


我们已经将这个插件默认加入模版,用户无需进行额外配置。如果需要手动添加这个插件,首先安装依赖:
$ yarn add @redspot/known-types
然后在redspot.config文件中,引入插件:
...
import "@redspot/known-types"

...

export default {
...
};
我们可以通过 Jupiter 链来验证。我们将配置文件的节点,改为连接 Jupiter,然后注意删除所有 types:
...
// import "@redspot/known-types"
...
export default {
...
networks: {
  development: {
    endpoint: "wss://ws.jupiter-poa.patract.cn/",
  },
  types: {},
  ...
}
...
};
然后启动 redspot console:
$ npx redspot console
然后运行命令,查询账户信息:
$ await network.api.isReady;(await network.api.query.system.account("3eTmoLUQtK2dsVFtzLUztfPSd3KghZggMpnz1XdzVt33vK9c")).toHuman()

{
nonce: '0',
consumers: '1',
providers: '1',
sufficients: '4,106,261,181',
data: {
  free: '23.2834 mDOT',
  reserved: '0',
  miscFrozen: '0',
  feeFrozen: '0'
}
}
现在得到的账户信息是有问题的,我们可以引入 @redspot/known-types 然后对比一下差异:
...
import "@redspot/known-types"
...
export default {
...
networks: {
  development: {
    endpoint: "wss://ws.jupiter-poa.patract.cn/",
  },
  types: {},
  ...
}
...
};
然后,和之前一样步骤查询账户信息,这时我们应该会得到这样的结果:
{
nonce: '0',
consumers: '1',
providers: '1',
data: {
  free: '100.0016 MDOT',
  reserved: '0',
  miscFrozen: '0',
  feeFrozen: '0'
}
}
对比上面结果,这才正确的 accountInfo 的类型,@redspot/known-types 成功识别到了 Jupiter 链并且注入了已知的 types。


Redspot docker


在 Redspot v0.4 中,我们添加了使用 docker 编译合约的支持,这将能保证在不同平台下编译生成的 Wasm 都是一致的。

Redspot将使 redspot/contract [6]这个docker image[7]进行编译和运行测试网。它是在 ParityTech 提供的 contract docker image 的基础上进行修改的。

目前只支持 ink! 合约 docker 编译,配置如下:
...

export default {
...
contract: {
  ink: {
    toolchain: "nightly",
    docker: true,
    sources: ["contracts/**/*"],
  },
},
...
docker: {
  sudo: false,
},
...
};
在运行编译命令之前,请确保本机已安装 docker。运行命令
$ npx redspot compile


注意:当使用docker编译时,可能受网络环境影响(比如中国大陆需要vpn代理),会导致编译时间过长, 如果中途使用 ctrl+c 退出当前编译命令,docker容器并不会自动停止删除。


现在会默认使用 docker 编译。如果想更改默认行为,请添加 --docker false 参数:

$ npx redspot compile --docker false

注意如果遇到权限错误,请将 redspot.config 文件中的 docker.sudo 改为 true。这样将会使用 sudo 运行 docker。
同样的,也可以使用 docker 运行一个测试网。当前内置了 canvas 测试网,在未来我们会内置更多的测试网以供用户选择。
目前运行测试网的命令是:
$ npx redspot testnet
实际上,它的作用是仅仅只是运行命令:
$ docker run -p 9944:9944 --rm redspot/contract /bin/bash -c "canvas --tmp --dev --ws-port=9944 --ws-external"  
如果想要修改默认的运行命令,可以添加 command 参数:
$ npx redspot testnet --command 'docker run -p 9945:9944 --rm redspot/contract /bin/bash -c "canvas --tmp --dev --ws-port=9944 --ws-external"'
我们会推荐和引导用户优先使用 docker, 因为这样可以专注合约的编写,免去很多环境配置和启动节点的麻烦。

Redspot explorer


我们发现大部分用户在开发合约时会使用 @polkadot/apps 或者 canvas ui 进行辅助调试。所以我们基于 @polkadot/apps 开发了 Redspot explorer,目的为了在进行合约开发时取代 @polkadot/apps。为此我们做了大量的修改和优化。并且在一定程序上连通了本机代码和网页。我们主要做了这些优化:

1.重新设计了布局和菜单,更加专注合约模块。完善了 Polkadot apps 的夜间模式,调整了UI,调整配色。删除对合约开发无用的页面。合并了一些工具页面。


2.redspot config 中配置的网络,会被注入到 explorer 中。

3.redspot config 中配置的账号,会出现在 explorer 中,可以在 explorer中使用,比如可以进行转账等交易,就和网页账户中的一样。

4.redspot 中配置的 types 会被 explorer 采用。

5.本地项目中生成的合约的 .contract 文件,会自动上传到 explorer 中。explorer 中的 contracts 页面会收录所有 code 已知的合约。

6.切换网络时,只显示当前网络的合约和abi和账号。

7.可以在本地运行测试或者脚本时,使用 polkadot extension 进行签名。

8.能够在 explorer 中向本地发送编译代码的指令。

9.在 explorer 中可以运行 redspot 的脚本。

10.如果有已知的 code ,那么会在区块详情中,自动解析合约事件和发送合约时的参数。

11.可以查询合约相关的交易。

使用 redspot explorer 需要先安装 @redspot/explorer 插件:


$ yarn add @redspot/explorer
然后在 redspot.config 中添加:
...
import "@redspot/explorer";
...
运行 Redspot explorer:
npx redspot explorer
注意,在运行 Redspot explorer 的时候,会在本地启动一个服务,请不要终止该进程。并且,在每次 redspot.config 更改时,请手动重启该服务。
然后打开默认的网址http://127.0.0.1:8011

打开切换网络


可以看到,能够选择 Redspot 中配置的网络。

检查 accounts 页面,会出现 redspot.config 中配置的账号。


然后你可以使用你的 Polkadot extension 中的账号,进行交易。复制你在 Polkadot extension 中的账号地址。
然后更改 deploy.ts 脚本:
import { network, patract } from "redspot";

const { getContractFactory } = patract;
const { api } = network;

async function run() {
await api.isReady;
const signer = "<your address>";

const contractFactory = await getContractFactory("erc20", signer);

const balance = await api.query.system.account(signer);

console.log("Balance: ", balance.toHuman());

const contract = await contractFactory.deployed("new", "1000000", {
  gasLimit: "200000000000",
  value: "100000000000",
});

await contract.tx.transfer(signer, 7);
console.log("");
console.log(
  "Deploy successfully. The contract address: ",
  contract.address.toString()
);

api.disconnect();
}

run().catch((err) => {
console.log(err);
});
然后运行脚本$ npx redspot run ./scripts/deploy.ts, 然后此时会调用 Polkadot extension 进行签名。检查你的浏览器里面的 Polkadot extension (注意 explorer 页面必须是打开的)。


然后部署合约。然后部署成功后,检查 explorer 页面:



会出现链上的事件。我们查看 contracts.instantiateWithCode 事件,


这里会有合约 message 和合约 event 的解析。检查 contracts 的 codes 页面:



这里会自动出现本地编译好的合约的 code。然后检查 contracts 的 contracts 页面:



这里会出现刚刚部署好的合约。然后我们切换到 console 页面,在这里我们可以运行脚本和编译合约:


我们点击 compile contract ,出现此提示表示编译成功:



如果编译时间过长,请切换到运行npx redspot explorer命令的终端,查看日志提示。

然后我们点击 run 运行脚本,右边控制台会输出运行日志:


现在合约成功,我们再切换到 contracts 页面进行检查:


可以看到,刚刚部署成功的合约会出现在这里。

我们点击 extrinsics 按钮(即图中“recent contracts”中的每一行中的蓝色的 “extrinsics”),会跳出一个对话框(dialog),会展示当前合约的相关交易:


@redspot/decimals


@redspot/decimals是一个自动转换数字精度的插件,例如将1 DOT转换为10000000000

目前,此插件实现的功能有以下几种:

固定的 decimal
  • 1 DOT => 10 ** 10
  • 1 KSM => 10 ** 12
    自动获取链的 tokenDecimal
  • 1 UNIT => 10 ** tokenDecimal
  • Install:
yarn add @redspot/decimals
并将以下语句添加到你的redspot.config.ts:

在部署合约的时候使用:
const contract = await contractFactory.deployed('new', '10000', {
  gasLimit: '400000000000',
  value: '10000 UNIT'
});
在转账中使用:
import { network } from 'redspot';

const { api } = network;

async function run() {
  await api.isReady;

  api.tx.balances.transfer(address, '1 UNIT')
}

原理

@polkadot/api实现了自己的一套类型系统,因此,我们对WeightBalance进行了重写,以达到可以识别类似1 DOT的功能。如果使用的功能不是WeightBalance的类型,以上方法就不会生效。



如何验证 Redspot v0.4 Github 库


  • 当前我们支持任意数量的 ink! 合约和 solang 合约混合编译。只需要设定好需要编译的目录即可。参考 Redspot 多合约编译。


  • 我们创建了一个 docker image 用于编译合约和启动测试网https://hub.docker.com/r/redspot/contract ,并且集成到了 Redspot 中。

  • Redspot's 网站界面: 使用 @redspot/explorer 插件。


    • Redspot explorer 能够显示 Redspot 中配置的网络。自动上传了本地目录中的合约 abi 文件。将会展示所有与当前 abi 文件相关联的合约。

    • Redspot explorer 能够查询当前的合约相关的交易(类型 Polkadot apps explorer)。对 Europa,Redspot 会扫描所有区块。

    • 在 Redspot explorer 中,会自动解析所有能够查询到 abi 的合约的 message 和 event 信息。在区块详情中可以查看。

    • Redspot explorer 中提供一个 console 功能,它能将代码发送本地执行。并且我们也添加了一个编译合约的按钮。可以让用户能够直接在 Redspot explorer 上执行执行编译命令。

    • 当开启 Redspot explorer 服务时,在本地需要签名的时候,可以通过 Redspot explorer gui 间接的访问到 Polkadot extensions。从而实现这个功能。


  • 其他插件


    • 使用 @redspot/watcher 插件可以保存 rust 和 toml 文件信息,如何没有更改,在执行 test run console 命令时,会跳过默认的编译。

    • 我们当前为 Europa, Jupiter,Canvas,Edgeware, Plasm,Clover 等添加了 types。在使用这几条链的时候无需再手动配置 types。其中 Canvas,Edgeware,Plasm,Clover 是通过 @polkadot/app-config 获取到 types 的,所以类型的正确性依赖于他们提交的配置。而 Europa,Jupiter 我们会手动维护类型。

    • 使用 @redspot/decimals 可以实现这个功能。


延伸阅读:

[1]Redspot v0.1 的国库提案#0链接:

https://polkadot.polkassembly.io/treasury/0

[2]Redspot v0.4的国库提案#44链接:

https://polkadot.polkassembly.io/treasury/44

[3]额外的脚本链接:

https://github.com/paritytech/ink/blob/master/examples/delegator/build-all.sh

[4] cargo-contract链接:

https://github.com/paritytech/cargo-contract 

[5] solang链接:

https://github.com/hyperledger-labs/solang
[6]redspot/contract 链接:
https://github.com/patractlabs/docker-images/tree/master/contract
[7]docker image链接:
https://github.com/paritytech/scripts/blob/master/dockerfiles/contracts-ci-linux/
Dockerfile


About Patract


Patract 为波卡 Wasm 合约生态的平行链和 DApp 开发提供解决方案。我们帮助社区平行链设计和开发链上合约模块和 Runtime 支持,并且为 DApp 开发者提供覆盖开发、测试、调试、部署、监控、数据提供和前端开发等阶段的全栈工具和服务支持。

How to join Patract


1.对于合约开发者,可以访问官网 (https://patract.io),熟悉测试链和工具套件。欢迎加入官方开发群:
Element(https://app.element.io/#/room/#PatractLabsDev:matrix.org)
Discord(https://discord.gg/wJ8TnTfjcq)
 
2.对于将要集成 Wasm 合约功能的平行链项目方,或者使用 Wasm 合约开发的 DApp 项目方,商务合作欢迎联系 santry@patract.io
 
3.对于用户,欢迎加入:
Telegram(https://t.me/patract)
Twitter(https://twitter.com/PatractLabs)
 
4.对于求职者,我们在招聘区块链开发工程师、前端/全栈开发工程师、产品经理、开发者运营等岗位,可以联系 sean@patract.io

扫码加入Patract 微信开发群



往期精彩:
//PatraShare#3回顾|ink! 的初级实践(Solidity 范式)——多合约
//PatraShare#2回顾|Ink! 的初级实践(Solidity范式)
//TechShare#1回顾|快速上手ink!智能合约


: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存