Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

比原链合约入门教程

获画关喊
89 0 0
比原项目仓库:2 l* H6 M- H9 Y/ R3 I' D
Github地址:https://github.com/Bytom/bytom- a% Z) \* R, R5 E; L$ i+ R
Gitee地址:https://gitee.com/BytomBlockchain/bytom
, O! K+ R7 j! x0 d一、合约简述
; y  H0 q: M. ], B; Requity是bytom的一种智能合约语言,是一门声明性谓词语言。详细说明请参考官方equity合约相关介绍。
4 `' x' X- N8 u- c二、锁定合约流程
7 t7 h0 F" [" O3 A8 ~; h- i7 _2 w1、合约编写
" l' s# k4 r/ T合约的编写可以通过参考合约模板来进行构造,如果需要更进一步的了解,可以阅读一下合约相关的说明文档。以典型的锁定publickey合约为例,其合约代码如下:
1 X% Z6 @' A* e* bcontract LockWithPublicKey(publicKey: PublicKey) locks locked { clause unlockWithSig(sig: Signature) { verify checkTxSig(publicKey, sig) unlock locked } }9 I6 _3 q* k" v7 C
2、编译合约
5 c5 B$ L+ p; H; M; p" K编译合约的工具暂未提供,建议使用api调用的方式来编译合约。调用的方式可以使用 curl 命令行 或 postman 工具等。9 X, k( D0 N7 [3 M6 x- `
curl 调用方式如下:
& V  J5 |2 L  y- T4 i1 p! hcurl -X POST http://localhost:9888/create-key -d '{"alias": "alice", "password": "123456"}'
  k" L2 T$ T" e% r( Dpostman 需要到官网下载工具:
, t* `- B" i* Phttps://www.getpostman.com/  u1 n6 V3 _8 u' K/ {
1)bytomd默认启动或开启auth认证,需要通过curl的方式调用API接口 获取access toekn9 N( V5 A6 }. `& H! U) H7 K( g% o
curl -X POST http://localhost:9888/create-access-token -d '{"id":"token1"}'# u; i6 H; H$ u$ u4 C# d1 ?% d% ~
返回结果如下:0 X7 f/ C! w6 J/ g
{ "token": "token1:1fee70f537128a201338bd5f25a3adbf33dad02eae4f4c9ac43f336a069df8f3", "id": "token1", "created_at": "2018-03-20T18:56:01.043919771+08:00" }2 b7 H$ {1 d* b3 I9 c) `! f. K  `* q
2)选择 basic auth 认证方式,填入 access-token 的用户名和密码,即上述返回结果的 token1 和 1fee70f537128a201338bd5f25a3adbf33dad02eae4f4c9ac43f336a069df8f3
) w4 p* {5 y& p' s' ^$ a$ Z
& b* v, u* S! T3)如果合约参数包含类型PublicKey,便需要获取合约参数 PublicKey, publicKey可通过API接口获取。这里需要将结果保存下来,以后解锁合约的时候需要用到 root_xpub 和 pubkey对应的 derivation_path。. K, `. g. T# b: Q

* q/ U! p5 {( V. `" |0 k' _4)编译合约,返回结果program 便是可锁定的合约。(直接编译合约产生的是合约执行步骤,如果部署这样的合约,用户可以直接构造对应的参数便能解锁)
% s& R9 }+ F2 I4 u
) @6 l; e0 X& p8 ^3、构建锁定合约交易7 {' [& [% r- n3 x
下面表示锁定 1000 个 777e3586d2ec47c4974d262e0ff86fd3c1c063d242d32bdef71d6d16eed6763e 类型的资产到合约 204e925f0fcc2f2618d96b7a3dce2aad28e60ab3339377760d48aea8ae8169ae417403ae7cac00c0 之中。具体内容参考构建交易的wiki: https://github.com/Bytom/bytom/wiki/API-Reference#build-transaction  F; {. ?* B6 h" B8 N+ N: s& W) a

- N& d6 j8 l6 ?+ m% Z& c" n* N4、签名交易
; }% u) f) \9 h具体内容参考签名交易的wiki:https://github.com/Bytom/bytom/wiki/API-Reference#sign-transaction! r2 M$ s) x2 {6 b; Q- Z
6 d8 ]5 \& i# E5 j$ Z5 _' \
5、提交交易
/ |& p- h7 X0 G$ q具体方式参考提交交易的wiki:https://github.com/Bytom/bytom/wiki/API-Reference#submit-transaction
1 v3 S/ D1 l# e. A
( w, G/ o+ e7 \5 Z0 ^: h, K5 U6 D一旦合约交易打包成功,这样合约交易便发送成功了。" {2 h: P4 }3 ?9 d
三、解锁合约流程
' J5 T3 {) \7 b5 U* L$ E+ o9 Y1、合约交易被区块打包成功之后,可以查看具体的合约交易内容,找到对应的outputID。8 [5 m/ h! n' O; S% [0 x% ^4 [
4 `5 v# C$ |& s: y# ~# l

4 o0 y2 K" S$ L其中ID字段便表示 outputID8 T7 i' Z6 x8 L4 a' G1 n% J5 A
2、根据outputID通过list-unspent-outputs 接口API 查找合约的UTXO,查看合约锁定的资产类型和数量是否匹配
1 }; I9 _6 I# ~$ E& m$ P' w; t. ?0 |  k5 n5 R
3、构建解锁合约交易,解锁clause unlockWithSig 的参数为 Signature, 但是签名结果只能在 sign-transaction 成功之后才能得到,所以我们只需构建完成签名参数即可。于之前构建的publicKey 为 4e925f0fcc2f2618d96b7a3dce2aad28e60ab3339377760d48aea8ae8169ae41,那么签名参数为root_xpub 和 derivation_path,对应的值分别为: “dc903a862a14966d47dc6bc935c687c6cccb7a8f9c70f13bb82a41a0fe2696596cb141ff1840f90c75f8f25099f0dc50e005e1e36817d184b2b1eb1354b61575” 和 [ “010400000000000000”, “0100000000000000” ] 。 其结构如下:(具体字段可参考官方智能合约文档说明)
4 A: [) |: U. b' Q7 p0 ?) i2 B0 Y" @4 |/ z( Y
4、签名交易,具体内容参考签名交易的wiki:https://github.com/Bytom/bytom/wiki/API-Reference#sign-transaction9 B+ A/ `% e/ O: F& |) r

6 w* t4 r' b! _5、提交交易,具体方式参考提交交易的wiki:https://github.com/Bytom/bytom/wiki/API-Reference#submit-transaction
& N& }6 H/ l' q( v& j* W
- Z, s3 ~! a9 @2 Q" \, O解锁合约交易打包成功之后,根据 outputID 通过list-unspent-outputs 接口API 查找原来的合约 UTXO,将显示为空,否则合约交易解锁失败。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

获画关喊 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    8