继上次我们推出 sCrypt Deploy 功能后,这次我们新增了调用有状态合约的功能。
本文以 boilerplate 项目中的 advancedCounter 合约为例,介绍如何使用这个功能部署和调用合约。
部署合约
AdvancedCounter
合约是一个有状态的计数器合约,它会在每次成功调用 increment
方法时,将内部状态值 counter 增加 1。这里我们将其初始状态设置为 00
(即从0开始计数),并且合约锁定的 bsv 余额使用默认设置 10000 聪。
使用这个方法 部署合约成功之后,会看到左下角的 DEPLOYED CONTRACTS 增加了一个 AdvancedCounter
合约实例。展开该实例的 transactions 子项,可以看到对应的部署交易。
注意:如果点击了 Deploy 按钮后,在运行输出中看到这个错误:Error: Contract description version deprecated, Please update your sCrypt extension to the latest version and recompile
,请尝试执行以下步骤:1.打开合约的 sCrypt 源码,右键运行 Compile to Bitcoin Script 进行再次编译;2.点击 COMPILED CONTRACTS 视图里的 REFRESH 刷新按钮;3.关闭并再次打开该合约的部署面板后再次尝试部署。
调用合约
在上述成功部署的 AdvancedCounter
合约实例中,点击 increment
方法的 Call 按钮, 右侧出现合约方法调用面板。在该面板上可以看到合约的当前信息,如合约锁定余额、当前执行阶段、内部状态等。要调用当前合约方法,还需要根据情况完成以下几个步骤:
Step 1(必选):填写调用方法所需的实参。
本合约包括以下几个参数:
txPreimage
: 交易原像参数。这里可以点击右侧的 Preimage 按钮手动生成;amount
:新的合约 UTXO 中锁定的 bsv 余额。这里设置为 8000 聪;changePKH
:找零用的 P2PKH 地址哈希。这里使用默认设置;changeSats
:找零的 bsv 数量。这里设置为 1000 聪;
Step 2(可选):定制交易的所有 Output。
如果是无状态合约,只需要填写参数值一般就可以了,但是对于有状态合约,一般会限制合约的输出脚本,所以需要手动管理所有 Output。目前支持的输出类型有三种:
Stateful Output
:有状态合约的输出State
: 合约状态的序列化值;Amount
: 合约中锁定的余额;
P2PKH Output
:P2PKH
类脚本输出Address
: 收款人地址;Amount
: 该输出中包含的 bsv 数量;
OpReturn Output
:op_return
类脚本输出OpReturn
: op_return 脚本中的数据部分,asm 格式;Amount
: 该输出中包含的 bsv 数量,一般为0;
通过 AdvancedCounter
合约的源码,我们知道调用 AdvancedCounter
合约的交易会产生两个 Output, 第一个 Output 是一个带有新状态的 AdvancedCounter
合约 UTXO;第二个 Output 是一个找零的 P2PKH Output。
首先在 Add Output 按钮左边的 Output 类型列表中选择 Stateful Output, 然后点击 Add Output。之后给这个 Stateful Output 填写新的状态: 由于初始状态是 0,那计数加1后的新状态是1,故在 State
中输入 01
;余额 Amount
设置为 8000 聪,需要与第一步函数参数中的 amount
保持一致;
接下来添加一个找零的 P2PKH Output:在列表中选择 P2PKH Output,然后点击 Add Output。其中 Address
可以使用默认值;Amount
设置为 1000,需要与第一步函数参数中的 changeStas
保持一致。
到此调用参数和 Outputs 就添加完成了。在添加和修改 Output 的过程中,细心的朋友会发上面 txPreimage
参数的值会自动变化。原因是构建交易的 Output 改变时,我们会自动帮你更新原象参数值。当然你也可以手动点击上面的 Preimage 按钮进行更新。
Step 3(可选):设置交易相关参数。
Transaction Settings 中包括构建整个交易的若干参数:
-
Fee
:交易费用。设置时必须满足的限制条件是:合约当前的锁定余额Contract Amount
= 所有 Output 中的Amount
之和 + 交易费用Fee
。比如这里我们使用
默认值 1000, 加上上面两个 Output 的输出余额 8000 + 1000,刚好等于合约初始化时的余额 10000。 -
SighashType
:交易签名类型。默认用于计算原象 Preimage 的签名类型是ALL
,但是AdvancedCounter
合约代码中用于计算原象的的签名类型是ANYONECANPAY | ALL
,这里的选择需要与合约内部一致。注意:修改SighashType
同样会自动重新生成原象txPreimage
。
Step 4(必选):点击 Call 按钮发送交易。
所有设置均完成后点击 Call 按钮,会触发 API 发送这个合约调用交易到测试网。交易发送成功后,我们可以看到顶部显示合约余额发生变化,变成刚刚设置的 8000。同样,可以看到左下角的 AdvancedCounter
合约实例的 transactions 子项中增加了一个交易,并且可通过右侧的 View Tx 按钮在区块链浏览器上进行查看。另外,选中该交易子项时,increment
方法下的参数列表中会显示出此次调用时传递的各个实参。
重复调用
针对有状态合约 AdvancedCounter
,可以重复上面的步骤继续调用其方法并观察其状态变更,直到合约中的余额不足(因为目前暂不支持添加 Input 来支付费用,否则即可无限调用下去)。同样,大家也可以使用文中介绍的方法,自行尝试调用其他已支持的合约示例。Have fun 😃
来源:oschina
链接:https://my.oschina.net/u/4343937/blog/4926854