Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

比原链合约入门教程

获画关喊
142 0 0
比原项目仓库:& X. |( n3 |( e' d: p
Github地址:https://github.com/Bytom/bytom; r. E3 B) h5 y4 {% J0 E
Gitee地址:https://gitee.com/BytomBlockchain/bytom
  {  g) x/ K* L一、合约简述$ W, z& D+ g, Q- }; L
equity是bytom的一种智能合约语言,是一门声明性谓词语言。详细说明请参考官方equity合约相关介绍。
7 M. q( F3 T& A0 C% N" ^( D0 I; Y二、锁定合约流程1 I/ C; [: B( F4 X( {
1、合约编写& v! X% h; K& z: q' i: k
合约的编写可以通过参考合约模板来进行构造,如果需要更进一步的了解,可以阅读一下合约相关的说明文档。以典型的锁定publickey合约为例,其合约代码如下:3 n% u3 y9 l& M! Y5 c, P
contract LockWithPublicKey(publicKey: PublicKey) locks locked { clause unlockWithSig(sig: Signature) { verify checkTxSig(publicKey, sig) unlock locked } }, ]5 z5 t) \- P! J& e
2、编译合约
. ^/ q0 E8 i4 w! w编译合约的工具暂未提供,建议使用api调用的方式来编译合约。调用的方式可以使用 curl 命令行 或 postman 工具等。8 w* b9 f7 v, U. o
curl 调用方式如下:
5 ]* w( F1 F+ n7 l$ @, e) m/ \2 }curl -X POST http://localhost:9888/create-key -d '{"alias": "alice", "password": "123456"}'5 e8 _9 G# y. s6 D3 j* z+ A1 |
postman 需要到官网下载工具:
6 P  |" Z$ ^& d- {+ `https://www.getpostman.com/
0 T2 \; V$ K' O3 ]6 ?5 Y- F. |1)bytomd默认启动或开启auth认证,需要通过curl的方式调用API接口 获取access toekn
; U8 }% E) d9 R4 d- K3 S* Hcurl -X POST http://localhost:9888/create-access-token -d '{"id":"token1"}'0 o$ U. U! ?: {0 }" P- X: F( i
返回结果如下:6 g$ |; O, f8 H- j/ M' H6 d
{ "token": "token1:1fee70f537128a201338bd5f25a3adbf33dad02eae4f4c9ac43f336a069df8f3", "id": "token1", "created_at": "2018-03-20T18:56:01.043919771+08:00" }! v  D! t. T3 h& u
2)选择 basic auth 认证方式,填入 access-token 的用户名和密码,即上述返回结果的 token1 和 1fee70f537128a201338bd5f25a3adbf33dad02eae4f4c9ac43f336a069df8f3
, T+ k' G8 q7 H# Q/ [
6 v; m, L" {; m/ K1 {. M" \% _6 ?! a3)如果合约参数包含类型PublicKey,便需要获取合约参数 PublicKey, publicKey可通过API接口获取。这里需要将结果保存下来,以后解锁合约的时候需要用到 root_xpub 和 pubkey对应的 derivation_path。' Q6 W  d4 m+ ?
& t8 k+ ?/ {' j, T% M( E$ r2 I8 a, i" @
4)编译合约,返回结果program 便是可锁定的合约。(直接编译合约产生的是合约执行步骤,如果部署这样的合约,用户可以直接构造对应的参数便能解锁)1 L' D$ T4 [# W* ^4 D6 f6 f

7 Y9 d+ s  @9 q3、构建锁定合约交易, d$ a. u8 r& J9 I
下面表示锁定 1000 个 777e3586d2ec47c4974d262e0ff86fd3c1c063d242d32bdef71d6d16eed6763e 类型的资产到合约 204e925f0fcc2f2618d96b7a3dce2aad28e60ab3339377760d48aea8ae8169ae417403ae7cac00c0 之中。具体内容参考构建交易的wiki: https://github.com/Bytom/bytom/wiki/API-Reference#build-transaction
. \8 g$ p' r8 M: P' T
1 r; N# w' v8 m4、签名交易
$ w% C9 {" G7 Z. o具体内容参考签名交易的wiki:https://github.com/Bytom/bytom/wiki/API-Reference#sign-transaction
& K, A  _( y0 Z6 q! C  V: U1 a5 V' H7 Q
5、提交交易8 m/ [& c, D0 _0 _! b; d% g
具体方式参考提交交易的wiki:https://github.com/Bytom/bytom/wiki/API-Reference#submit-transaction
! L) K' G3 Y; g7 A' l8 C1 X* F# k4 E/ ?; Q
一旦合约交易打包成功,这样合约交易便发送成功了。
) ]7 T; s- l- }" e) g) K三、解锁合约流程
- q$ y# O' j# R, I1、合约交易被区块打包成功之后,可以查看具体的合约交易内容,找到对应的outputID。  b9 p" l; y; [9 X0 R  f: v8 _$ x

7 l1 B$ z8 X: t6 a
' ]% K" l* n9 G% {其中ID字段便表示 outputID
* l" P, Q0 k  Y# N4 R2、根据outputID通过list-unspent-outputs 接口API 查找合约的UTXO,查看合约锁定的资产类型和数量是否匹配
6 }6 e! f) [2 M# K3 I/ |. h4 e* q* l5 A) R( e. L
3、构建解锁合约交易,解锁clause unlockWithSig 的参数为 Signature, 但是签名结果只能在 sign-transaction 成功之后才能得到,所以我们只需构建完成签名参数即可。于之前构建的publicKey 为 4e925f0fcc2f2618d96b7a3dce2aad28e60ab3339377760d48aea8ae8169ae41,那么签名参数为root_xpub 和 derivation_path,对应的值分别为: “dc903a862a14966d47dc6bc935c687c6cccb7a8f9c70f13bb82a41a0fe2696596cb141ff1840f90c75f8f25099f0dc50e005e1e36817d184b2b1eb1354b61575” 和 [ “010400000000000000”, “0100000000000000” ] 。 其结构如下:(具体字段可参考官方智能合约文档说明)9 b2 Z& t) r! \  T+ K  o0 h4 H

# N2 X! Q1 x6 j! l) V0 h4、签名交易,具体内容参考签名交易的wiki:https://github.com/Bytom/bytom/wiki/API-Reference#sign-transaction
- X( |3 d7 A+ f
, J  m2 K; U% E4 l  d5、提交交易,具体方式参考提交交易的wiki:https://github.com/Bytom/bytom/wiki/API-Reference#submit-transaction
% G: F5 w8 Z( p  U
+ Z" J' g4 Z6 P' j) O" r' h* i: |解锁合约交易打包成功之后,根据 outputID 通过list-unspent-outputs 接口API 查找原来的合约 UTXO,将显示为空,否则合约交易解锁失败。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

获画关喊 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    8