开发
合约 Playground
七个示例合约,每个都有自己的页面,跑在公开 signet 上。可以直接用,也可以修改它们的 Rust 源码,在浏览器里编译,再部署你自己的那一份。
合约 Playground 是一个独立的页面,和 signet 钱包并列。它跑在公开 signet 上,每个操作都在你自己的钱包里签名,手续费用测试 KSA 支付。钱包的顶栏、页脚和首页,以及合约详情页,都有它的链接。
示例
| 示例 | 展示什么 | Crate |
|---|---|---|
| 计数器 | 最小的合约:一个任何人都能加一的数 | playground-counter |
| 代币 | 钱包能列出的内置资产:在上限内增发、销毁、转账 | mintable-token |
| NFT | 可以铸造、转赠、授权,并按固定价格出售的藏品 | nft |
| AMM | 两种资产之间的兑换,以及赚取手续费的流动性份额 | amm |
| 借贷 | 存款生息、抵押借款、清算 | lending |
| 多签钱包 | 由多位所有者共同批准、执行提案的钱包 | multisig |
| 锁仓释放 | 随时间逐步释放给受益人的代币 | vesting |
每个示例有四个标签页:应用,专为它做的页面;代码,它的 Rust 源码;方法,每个方法一张表单;记录,这个浏览器发出的操作。示例之间相互衔接:AMM、借贷和锁仓释放的页面会建议先部署一个代币,代币页面也链接到它们。这些 crate 连同各自的原生测试位于仓库的 contracts/examples/;示例合约把它们和其他示例列在一起。
开始
连接钱包
用 Unisat、OneKey 或 Xverse,账户是比特币 signet 上的 Taproot(tb1p…)地址,和 signet 钱包一样。Playground 只请钱包签名,从不接触你的私钥。
领取测试 KSA
领取测试 KSA 向水龙头申请 100 KSA,每个账户每天一次。部署和调用都是路径 B 操作,手续费用 KSA 支付;部署的手续费随模块大小增加。
部署一个示例
部署新合约会填好示例 init 的参数,你也可以改。核对操作,然后在钱包里签名;在区块收录这次部署之前,页面显示的是预测的合约 ID。要用别人部署的合约,打开对方分享的链接,或者用按 ID 打开。
使用它
应用页是示例自己的页面:AMM 的兑换和流动性,借贷的存款、借款和还款,多签钱包的提案。每一次写入都经过同一个核对步骤:先在最新状态上只读地运行一遍,会失败时提前提醒你。
写代码,在线构建
代码页放着示例的 src/lib.rs。编辑器只构建这一个文件,依赖 ksana-contract-sdk,和仓库构建这些示例的方式相同。
- 编译把源码发给编译服务,错误和警告会标在对应的行上。
- 部署这个版本把你的模块部署成一个新合约,方法页的表单跟随你源码里的 ABI 块。修改过的代码可能和示例自己的应用页对不上,页面会提示这一点。
- 未经修改的示例源码,编译出的模块和 Playground 自带的那个逐字节相同(哈希记录在
playground/src/examples/wasm/builds.json),所以一个示例的部署可以和页面上显示的源码相互核对。 - 没有编译服务的 Playground 副本,依然可以部署自带的模块。按示例合约的说明自己构建模块,再在代码页上传
.wasm。
在线构建的限制
- 一份源码最多 128 KiB,只能作为七个示例 crate 之一来构建,只带这个 crate 自己的依赖。构建时没有网络,120 秒后停止。
- 模块最大 1 MiB,但一个操作最多携带 64 KiB,所以能部署的模块要小于后者。
- 同一个地址每分钟最多构建六次。构建在一个不长的队列里排队,队列满时服务会回答繁忙。
ABI 块
合约在自己的文档里向 Playground 说明它的方法:src/lib.rs 开头的 //! 注释里,一个标记为 abi 的代码块,每行一个声明,可以用 // 附一句说明。计数器的 ABI 块:
//! ```abi
//! init() // starts the count at 0
//! call increment() -> u64 // adds one; returns the new count
//! call add(amount: u64) -> u64 // adds 1 to 1000 at a time; returns the new count
//! view get() -> u64 // the count
//! event changed(by: Account, value: u64)
//! ```init在部署时运行一次;call声明会改变状态的方法,作为操作发送;view声明只读的方法,不用签名就能运行。init或call前面加payable,表示这个方法接收附带的资产。struct和enum声明方法用到的类型,event声明合约发出的事件。- 类型:整数
u8到u128、i8到i128,bool、String、Bytes、[u8; N],Account、ContractId、AssetId、Hash(各 32 字节),Option<T>、Vec<T>、元组、(),以及块里声明的结构体和枚举。参数和返回值都用 Borsh 编码,和所有 Ksana 合约一样(合约)。
这个块同时也是写给人看的文档:rustdoc 会把它显示成一个代码块。没有 ABI 块的源码照样可以编译和部署,只是没有表单。
打开一个合约
钱包的区块浏览器里,合约详情页有在 Playground 中打开。示例的部署会在那个示例的页面上打开;其他合约,贴上它的源码或者只贴 ABI 块,就有了表单。Playground 首页的任意合约也能按合约 ID 打开。
要知道的事
- Playground 只跑在 signet 上。signet 的 KSA 没有价值,这些示例用来学习,不是经过审计的软件。
- 失败的操作照样支付手续费,也照样用掉它的 nonce。
- 每次写入在发送之前都先记录在这个浏览器里。回答丢失的操作会一直占着它的 nonce,直到节点显示它;释放这个 nonce 只解除这条本地占用,什么也不会取消,因为别的节点仍可能收录那笔旧操作。清除网站数据会失去这层保护。