Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

比原链合约入门教程

获画关喊
88 0 0
比原项目仓库:
& y8 B* D, @/ w8 O& _5 ]7 @Github地址:https://github.com/Bytom/bytom4 ~, q, q+ t# i- z
Gitee地址:https://gitee.com/BytomBlockchain/bytom6 v9 H8 W: ]+ G8 x. ?
一、合约简述
& W5 j" P% L; requity是bytom的一种智能合约语言,是一门声明性谓词语言。详细说明请参考官方equity合约相关介绍。6 p' o/ V" j# @, C( u' j+ j' S
二、锁定合约流程
: V! A; P% N0 b0 ^* e1、合约编写: M9 q' O' q7 N: d
合约的编写可以通过参考合约模板来进行构造,如果需要更进一步的了解,可以阅读一下合约相关的说明文档。以典型的锁定publickey合约为例,其合约代码如下:
! L1 P8 F# o/ y9 W; r4 L  f% `contract LockWithPublicKey(publicKey: PublicKey) locks locked { clause unlockWithSig(sig: Signature) { verify checkTxSig(publicKey, sig) unlock locked } }
" J! U' r; `' E$ x2、编译合约; t8 |9 v% P$ H2 m' o- o- C
编译合约的工具暂未提供,建议使用api调用的方式来编译合约。调用的方式可以使用 curl 命令行 或 postman 工具等。
" G+ f* P" {& W+ G* |curl 调用方式如下:
! V9 p( K- {( hcurl -X POST http://localhost:9888/create-key -d '{"alias": "alice", "password": "123456"}', [! ?: r; m! }4 H/ r& l- ~
postman 需要到官网下载工具:+ R0 s: G) s! g( F0 M
https://www.getpostman.com/  ~- L4 P& g# c! H$ n, T
1)bytomd默认启动或开启auth认证,需要通过curl的方式调用API接口 获取access toekn6 j& y( m3 b1 P8 K# a8 a/ s
curl -X POST http://localhost:9888/create-access-token -d '{"id":"token1"}'1 G( d/ d$ [# [2 D
返回结果如下:
4 _" L9 R1 E8 p7 ^/ w7 K{ "token": "token1:1fee70f537128a201338bd5f25a3adbf33dad02eae4f4c9ac43f336a069df8f3", "id": "token1", "created_at": "2018-03-20T18:56:01.043919771+08:00" }
$ m* q, i& k/ C; b/ W! B, l2)选择 basic auth 认证方式,填入 access-token 的用户名和密码,即上述返回结果的 token1 和 1fee70f537128a201338bd5f25a3adbf33dad02eae4f4c9ac43f336a069df8f3
: m" ]6 |9 F( X0 ~$ i. x8 L- u  Z& }
3)如果合约参数包含类型PublicKey,便需要获取合约参数 PublicKey, publicKey可通过API接口获取。这里需要将结果保存下来,以后解锁合约的时候需要用到 root_xpub 和 pubkey对应的 derivation_path。# X7 ^2 _/ E% ~7 l
. \9 b+ m. |4 L/ x/ a1 W& G
4)编译合约,返回结果program 便是可锁定的合约。(直接编译合约产生的是合约执行步骤,如果部署这样的合约,用户可以直接构造对应的参数便能解锁)2 ]7 t* g4 x4 c' K* k0 I9 e& @

  f& P5 Y- p: P% F, b% x4 R, N3、构建锁定合约交易6 S% ?- R+ t8 X$ F  _. S
下面表示锁定 1000 个 777e3586d2ec47c4974d262e0ff86fd3c1c063d242d32bdef71d6d16eed6763e 类型的资产到合约 204e925f0fcc2f2618d96b7a3dce2aad28e60ab3339377760d48aea8ae8169ae417403ae7cac00c0 之中。具体内容参考构建交易的wiki: https://github.com/Bytom/bytom/wiki/API-Reference#build-transaction9 ]1 w6 i: n! z  X

" t- P. w* O% s5 _5 Y4、签名交易+ `' \6 n( B8 {; I6 }2 K& r
具体内容参考签名交易的wiki:https://github.com/Bytom/bytom/wiki/API-Reference#sign-transaction
, P! e. @( }$ g, u* j8 z
+ G1 J. J3 r1 F3 z) ?" _. \3 S5、提交交易! ?5 u' A" g6 N( C) W
具体方式参考提交交易的wiki:https://github.com/Bytom/bytom/wiki/API-Reference#submit-transaction* M% s4 o8 v$ a+ Z* v  Y
# A* O6 L' C3 Z
一旦合约交易打包成功,这样合约交易便发送成功了。
/ ^" l: H) K* r; u) f- K! P' Y9 P三、解锁合约流程
3 R  [/ }7 E0 P: H2 k1、合约交易被区块打包成功之后,可以查看具体的合约交易内容,找到对应的outputID。
$ e* d% h4 w& {( }& i8 T- C/ ]% R
% y% _3 u8 N5 [# C% h5 A7 ]  Q7 U$ U0 n" }8 b0 o
其中ID字段便表示 outputID
3 b% J/ q. U  Z, X3 j2、根据outputID通过list-unspent-outputs 接口API 查找合约的UTXO,查看合约锁定的资产类型和数量是否匹配: G1 X: V6 @) ^4 J  E! x" E7 {9 z

* P% B% T- ?8 ?0 G' a3、构建解锁合约交易,解锁clause unlockWithSig 的参数为 Signature, 但是签名结果只能在 sign-transaction 成功之后才能得到,所以我们只需构建完成签名参数即可。于之前构建的publicKey 为 4e925f0fcc2f2618d96b7a3dce2aad28e60ab3339377760d48aea8ae8169ae41,那么签名参数为root_xpub 和 derivation_path,对应的值分别为: “dc903a862a14966d47dc6bc935c687c6cccb7a8f9c70f13bb82a41a0fe2696596cb141ff1840f90c75f8f25099f0dc50e005e1e36817d184b2b1eb1354b61575” 和 [ “010400000000000000”, “0100000000000000” ] 。 其结构如下:(具体字段可参考官方智能合约文档说明)5 S% r7 w1 c: G! ~

9 B$ J8 u; t: F9 ^, Q, ^" `0 B/ J4、签名交易,具体内容参考签名交易的wiki:https://github.com/Bytom/bytom/wiki/API-Reference#sign-transaction; q+ l& o0 Z0 _" J* l- U

+ l, ^( i# b2 M$ V% x' j5、提交交易,具体方式参考提交交易的wiki:https://github.com/Bytom/bytom/wiki/API-Reference#submit-transaction0 v' _" s6 j( W0 [3 I

/ d$ G# e7 z' W( c5 k- Z" V7 z3 O解锁合约交易打包成功之后,根据 outputID 通过list-unspent-outputs 接口API 查找原来的合约 UTXO,将显示为空,否则合约交易解锁失败。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

获画关喊 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    8