Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
本文解析的为比原提供的币币合约 模板如下:
; B7 X- K5 E4 B1 h5 W1 q
  1. contract TradeOffer(assetRequested: Asset,
    ; B5 q4 n9 m# }4 |% x. @' q$ o
  2.                     amountRequested: Amount,
      M5 I5 s4 C" u
  3.                     seller: Program,4 P! v2 ]) D8 {. J3 T4 Y9 H
  4.                     cancelKey: PublicKey) locks offered {* X/ i& A% s( M& ?, P! G
  5.   clause trade() requires payment: amountRequested of assetRequested {" M# F6 `" t' e9 B" w7 F
  6.     lock payment with seller
    2 `+ |; o* h6 _- V0 N. T4 x) f
  7.     unlock offered6 V; v# E. P8 C- m3 Q
  8.   }$ _& V0 O, J) \5 r1 P7 j: w
  9.   clause cancel(sellerSig: Signature) {
    ' R% L; `& e5 w/ D) Z1 Y5 r
  10.     verify checkTxSig(cancelKey, sellerSig)
    ( J& T% q, _2 G& Q/ e
  11.     unlock offered
    5 o9 i0 G' y" D5 }
  12.   }# I8 h, g7 Q% n# @' M
  13. }
复制代码

( g# v, n4 s( i: a, P; @/ f/ \" Q# q导读: 初次接触比原只能合约的请点击比原智能合约入门 和 Equity 语言入门 学习,方便更好的理解该文档( N& i, `1 o+ {) F: L
锁定合约
# d2 _3 d1 P1 B4 c; s( g" o3 d第一步:调用create-account-receiver 生成 control_program
/ e9 ?$ X1 v& V! {2 s- }
+ m7 |& k' s1 D9 B. P- k0 X7 C, b以下是相关代码片段:
  E6 [) T4 s7 r2 a. J1 I+ v. H  ?2 v& psendHttpPost("{\"account_id\":\"0IJVD7MNG0A02\"}","create-account-receiver","http://127.0.0.1:9888","");  Y7 P% p; D9 n" @: V: Q2 c
第二步调用list-pubkeys 获取 pubkey
  {) K5 `- F: t3 o. e: j& n
) [" J+ b) ^' y. ]9 `. C+ Y  z; g+ J" M: y
以下是相关代码片段:
; W* x: u+ F5 F! I. _. r% @2 F' JsendHttpPost("{\"account_id\":\"0IJVD7MNG0A02\"}","list-pubkeys","http://127.0.0.1:9888","");" Q4 }2 x! R& v) l: i2 U7 c  P
第三步: 将1 2步获取的值调用compile接口编译合约获得program 合约程序- S6 {- G1 e" \0 @3 J5 l( T

+ Z0 Z; b+ ?9 M, F
7 \0 t, v- E0 y! y5 f2 ?' [以下是相关代码片段:
6 Z/ s- |# v; l7 `% |7 N7 a1 N+ ?- j           
  1. JSONObject param=new JSONObject();
    ! |% L! }( K0 L% F4 L! ^, r6 `
  2.             JSONArray agrs=new JSONArray();
    * O0 S: u/ O$ U3 x$ B2 G
  3.             //合约的四个参数值
    * o( T2 M, K/ k1 V1 H$ B
  4.             JSONObject assetParam=new JSONObject();
      B9 a/ a# T5 j! @, m& V$ |( e, R/ N
  5.             assetParam.put("string","81d097312645696daea84b761d2898d950d8fba0de06c9267d8513b16663dd3a");
    & D* F0 ~8 R; x/ u
  6.             agrs.put(assetParam);" X2 L  J# I9 k% D
  7.             JSONObject amountParam=new JSONObject();
    % E& _% v  M, A: v- B
  8.             amountParam.put("integer",200000000l);
    ' W( m% j" D- L; j1 ?2 }* i  d
  9.             agrs.put(amountParam);
    ; q; ~4 I  Q( @$ f6 E% i) I
  10.             JSONObject programParam=new JSONObject();& i2 X/ S, p% [  A
  11.             programParam.put("string",control_program);& s: N, ?& e+ d" F
  12.             agrs.put(programParam);
    & L6 G6 W6 \" U1 @- ~1 f+ A, L
  13.             JSONObject publicKeyParam=new JSONObject();
    , j! E( H+ N" [  i- a
  14.             publicKeyParam.put("string",pubkey);
    9 s3 N) f3 e; z6 P6 `/ C3 {
  15.             agrs.put(publicKeyParam);
    3 j) }! D: N! k1 C6 i
  16.             param.put("agrs",agrs);8 ?* v8 A% ^+ n1 Y8 R% u
  17.             param.put("contract","contract TradeOffer(assetRequested: Asset, amountRequested: Amount, seller: Program, cancelKey: PublicKey) locks offered { clause trade() requires payment: amountRequested of assetRequested { lock payment with seller unlock offered } clause cancel(sellerSig: Signature) { verify checkTxSig(cancelKey, sellerSig) unlock offered } }");
    ; T! ~+ l# O* s
  18.             //调用编译合约/ g, |/ c; L# P& K7 i# m
  19.             sendHttpPost(param.toString(),"list-pubkeys","http://127.0.0.1:9888","");
复制代码
6 e& C7 R) a) x' u
第四步:将program 传入build-transaction接口去build一个交易的到data/ Y9 a1 [( o; f% |5 m
; t$ b% p$ n. s+ H0 j+ D/ r* q0 {

# L( E. D9 V+ w5 G% K6 h1 e( }以下是相关代码片段:( G1 q; E: {! z7 W/ G( H
           
  1. param=new JSONObject();  q8 l1 Z5 P+ |; I" i% V, }
  2.             agrs=new JSONArray();
    / r# m* s; I* u  J8 y6 k
  3.             JSONObject spendAccount=new JSONObject();# U0 }6 M: D6 ?8 n3 x5 Q
  4.             spendAccount.put("account_id","0H757LPD00A02");& s0 L! C4 Y9 o9 ~
  5.             spendAccount.put("amount",9909099090000l);% I3 _: o4 p/ k1 l5 w! g. [- C
  6.             spendAccount.put("asset_id","161b9767b664df907fa926a31f9e835236e57f3e9ccc5f80c12bd97723322652");
    ) q- G" B5 x' _
  7.             spendAccount.put("type","spend_account");7 ]1 t% n0 E* U' [0 e
  8.             agrs.put(spendAccount);
    + W9 w  q% k; k. z$ [. ?% r! l4 C( Q
  9.             JSONObject controlAccount=new JSONObject();" R- ?0 ]4 o3 d1 U. x& z: n; L
  10.             controlAccount.put("control_program",program);
    % R- j1 l) k0 r1 D
  11.             controlAccount.put("amount",9909099090000l);
    4 G1 P; U, @$ Y) ]  z9 z1 z& W
  12.             controlAccount.put("asset_id","161b9767b664df907fa926a31f9e835236e57f3e9ccc5f80c12bd97723322652");. V) x; z/ c! k- m4 e4 }, u
  13.             controlAccount.put("type","control_program");
    + p2 p4 M- x& ]# R, m/ T; n
  14.             agrs.put(controlAccount);
    - _, x' m# {: Y- A" t
  15.             JSONObject spendAccount2=new JSONObject();
    ) R1 a- U( X: f2 Y' l, u
  16.             spendAccount2.put("account_id","0H757LPD00A02");
    $ z3 C2 M! }1 p' h2 f
  17.             spendAccount2.put("amount",6000000l);1 A3 X: D. [; Z& u4 m  ~% ]/ U
  18.             spendAccount2.put("asset_id","ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
      x* O* [  K7 K6 P7 ]2 _3 v
  19.             spendAccount2.put("type","spend_account");0 c9 R2 ^' {. E; F; l' y
  20.             agrs.put(spendAccount2);
    4 d9 J8 ]+ S) ~  f/ @+ h( z
  21.             param.put("actions",agrs);7 C- H1 ^4 {% m0 x' R0 b9 F
  22.             param.put("ttl",0);
    2 t7 _7 m, q: o( J* D& `9 D
  23.             sendHttpPost(param.toString(),"build-transaction","http://127.0.0.1:9888","");
复制代码

2 c- y' _3 _) i第五步:输入密码调用sign-transaction签名第四步build的data 得到raw_transaction
, \/ u6 L1 d& z: f* I$ M- |7 @9 N  x, F9 u+ n
) o$ q( X) n6 k' U: ~2 o- g4 r2 G
以下是相关代码片段:& k- E8 k$ h9 M. E# m
            param=new JSONObject();
/ C/ U: Q" ]# Z* Q+ o; ~            param.put("password","xxx");# ]) |  P8 n9 l  i. M
            param.put("transaction",data);6 V: O" ]1 Z" b9 r# q% A; ?
            sendHttpPost(param.toString(),"sign-transaction","http://127.0.0.1:9888","");
# F- D# ]- K% `9 c) E第六步:调用submit-transactions提交交易& F% S7 \# D* R& L+ h% H' X: o

; [$ N) k4 P2 C$ i9 n' y4 }以下是相关代码片段:
' [- F$ p/ @) Q! f2 E. ^            param=new JSONObject();
' V, D( [& W4 `5 t3 h6 T            param.put("raw_transaction",raw_transaction);  R7 u' }+ G% C. L- n
            sendHttpPost(param.toString(),"submit-transactions","http://127.0.0.1:9888","");
* [$ ~! y9 e! z) K解锁/取消合约! d/ O* C1 H1 W, g8 |& X
首先需要decode出生成合约时候的参数
5 I% L# Z; K- x6 b1 v7 i7 F调用list-unspent-outputs 获取生成的合约信息获取program. h* k- U' r3 T+ L- ~  }

! c( R8 M" [5 r. H; Q以下是相关代码片段:9 S8 N. h5 Z; g) V5 M
param=new JSONObject();/ u1 ]1 O$ t1 y7 b4 z0 ~' x
        param.put("id",outputid);) G0 l: _5 A5 i& q, b
        param.put("smart_contract",true);$ J1 \1 c+ E9 S4 s4 \! q
        sendHttpPost(param.toString(),"list-unspent-outputs","http://127.0.0.1:9888","");
6 x7 M& A/ }4 T& z" ?5 H7 A) Y调用decode-program 传入获取生成的合约参数信息( Y" |- w1 B9 f' `* }9 w

( C% C. _* }3 [8 I+ ?& W以下是相关代码片段:; q7 O6 O0 m. s- \
param=new JSONObject();
7 W1 U- A) B! k* t' i3 F! V        param.put("program",program);
* x8 w8 P2 r# s1 ?        sendHttpPost(param.toString(),"decode-program","http://127.0.0.1:9888","");
# X( i* ^8 S# p* e& ?需要注意的是decode出来的为值是逆序的(后续会有文章详细介绍)
" G/ _% z  {7 B7 m4 [解锁/取消其实就是把生成合约的步骤中的第三步去掉,替换调用生成合约第四步的参数即可  |3 M* d8 w: \, M# G$ R' V0 ]4 A
取消合约的构造参数如下:% Z0 l" o6 W3 e# V, w

# m5 u3 c, N  d* `% s, Y            
  1.   spendAccountUnspentOutput = arguments: [{
    8 I0 M* c4 H! v' Z3 @
  2.                   type: 'raw_tx_signature',! W% v/ l. v6 Z3 v9 w# y
  3.                   // 生成合约第二步的pubkeylist 详情
    * c9 \$ S/ K$ k3 g* H0 R
  4.                   raw_data: {
    8 x3 g: E  K$ O% Z7 |' \
  5.                     derivation_path: pubkeylist.pubkey_infos[0].derivation_path,
    3 d1 d' H7 ?! H
  6.                     xpub: pubkeylist.root_xpub7 C& b7 N0 y5 d- U2 x
  7.                   }& b, Y2 U: l0 g* v, j( s& E$ ?
  8.                 }, {
    - Q; z) W+ [# x- l
  9.                   type: 'data',
    ( x* @6 X' z9 w7 q
  10.                   raw_data: {
    0 [/ d* Y3 r7 P; W0 {# [" h# J
  11.                     // 参数偏移量 在一个合约里是固定的
    ) E: u; M, `. v! g
  12.                     value: '13000000'/ `* _* k5 p+ D; q7 |$ A
  13.                   }
    6 D8 G) x' U  p, ?
  14.                 }],, C$ C0 p+ T# x2 r2 Z# p
  15.                 output_id: output_id,
    3 Q: i) c1 |; m, m% k4 H3 j
  16.                 type: 'spend_account_unspent_output'
    ; Y$ R* J/ R7 j8 Z
  17.               }- ?, x, a3 ~# `4 `7 e* {! j
  18.               const controlAction = {
    5 ?! P7 Q% l2 n$ _/ V, f! I5 N
  19.                 type: 'control_program',+ P7 [, P) F5 ?  i# S) ^9 Q6 S
  20.                 amount: 100000000,
    ! n4 P3 W0 w/ e  ^
  21.                 asset_id: asset_id,3 u+ @) L9 o+ n9 \5 f1 J
  22.                 control_program:control_program
    / V+ U  k% `& R- n1 W" A0 \8 K
  23.               }6 ~; F9 P( y" p
  24.               const gasAction = {
    8 O5 p) i; n) Q2 `
  25.                 type: 'spend_account',' O8 L4 \$ ]+ W! G3 X# x! W
  26.                 account_id:account_id,3 z9 K3 b8 z, N+ Y0 s
  27.                 asset_alias: 'BTM',
    : a$ o% w1 {9 G' X% I  [
  28.                 amount: 50000000
    % t  T& s+ e& @+ _0 F
  29.               }
复制代码

; G, m0 A" o/ H0 S# X5 j执行合约的参数构造如下:' B4 P, y8 r: X8 K6 J3 f

- \0 X6 b% i6 u5 v- |  u) x         
  1. const spendAccountUnspentOutput = {& X( J4 q) \# m1 [6 K
  2.                 arguments: [{
    3 @7 W& c5 n  n3 b! p4 G# V2 S
  3.                   type: 'data',2 L# L) N6 f' g: E( M
  4.                   raw_data: {
    % s4 U" _; o& p, _$ K+ r
  5.                     // 执行合约输入资产偏移量/ N7 s. \+ e. O. S6 T5 m/ b# ^6 K
  6.                     value: '00000000'
    5 N: h6 [; Z% n2 {
  7.                   }1 @2 N5 l3 m% k+ _; P& e
  8.                 }],8 R  j2 g$ v- f
  9.                 output_id: output_id,
    # z! W9 l& ^& I2 N8 _: g4 e! c
  10.                 type: 'spend_account_unspent_output'- N) N" d( X( b$ E$ g
  11.               }
    + o! b9 p* d0 ^; R8 X
  12.               // 合约执行提供的资产) v% j- v- f0 a8 A
  13.               const issueControlAction = {
    ) d( e6 a+ h9 L* P+ \! w0 L
  14.                 control_program: control_program,
    0 M2 s+ Y- }# n3 L) ~
  15.                 amount:  100000000,  B  [, o& X0 }* `- i
  16.                 asset_id: asset_id,( R; P( m0 n; Y( }
  17.                 type: 'control_program'
    9 @! E% G) F7 U9 q4 o6 Q
  18.               }
    $ Y8 R+ J3 @* X1 t) p5 B  ^
  19.               // 合约执行提供的资产
    0 `2 k4 A$ |3 ]
  20.               const issueSpendAction = {# R4 Y: K0 K) N
  21.                 account_id: account_id,
    9 {9 Z' g2 i- T" {; G
  22.                 amount: 100000000,+ M( B  a" q& u5 i
  23.                 asset_id: asset_id,0 K0 ^# e0 U. s+ g$ a1 s
  24.                 type: 'spend_account'* f4 L2 M7 B$ a
  25.               }( r3 l: d1 A8 T% U
  26.               // 旷工费! @# _* o+ ^) N( w8 a
  27.               const gasAction = {( Z# b$ ?3 n6 M$ H: K. n/ q- T
  28.                 type: 'spend_account',
    1 G- m2 n+ |5 R
  29.                 account_id: account_id,
    : S$ z6 g5 u6 v
  30.                 asset_alias: 'BTM',
    ( S# S. ?( z" G+ D( l) @
  31.                 amount: 500000008 U% B- I5 Z: `$ P1 v! B: Y
  32.               }
    6 \, K& {2 Z4 M8 c+ H
  33.               // 合约执行获得资产对象
    ) t/ J, W7 b6 s& v# H
  34.               const controlAction = {
    9 S- S9 E" r0 C4 N' h
  35.                 type: 'control_program',% Y) z0 z: [/ [3 G/ A6 o
  36.                 amount:  100000000,, T6 J& r5 h. ~/ N4 c% H
  37.                 asset_id: asset_id,0 z1 d( T1 I, W0 K
  38.                 control_program: compileData.control_program
    - N2 E+ N; f6 b/ ?
  39.               }
复制代码

; Y2 i% p3 b; `: G( Bbuild 操作其实就是指定输入输出的过程,详情请查看 官方build文档 和 官方api文档9 W# ]9 V6 n, W. e$ h6 S- S- g
备注
6 C1 `& a) z2 ~" r$ D! M( z调用比原基于okhttp接口javautil 如下:) p: O: V. r4 o9 s
  
  1. public static String sendHttpPost(String bodyStr,String method,String bytomApiserverUrl,String bytomApiserverToken) throws IOException {
    ; D: U, o( J7 Y" B4 u  x
  2.         OkHttpClient client = new OkHttpClient();
    . i+ T9 ]# e; ^  K) u
  3.         MediaType mediaType = MediaType.parse("application/json");! q/ p0 V1 R* P% P% ~+ z; z* Y: |( T
  4.         RequestBody body = RequestBody.create(mediaType, bodyStr);
    + r# Y& |9 z. B( Y; s& A
  5.         Request request = new Request.Builder()0 o' h  J8 o. L" ^4 Q
  6.                 .url(bytomApiserverUrl+"/"+method)5 D. O. m+ z! g
  7.                 .post(body)
    7 v& m- o6 s  t0 L5 I2 ?0 B
  8.                 .addHeader("cache-control", "no-cache"). I' \7 O5 f& m5 ]! I; t, v7 w5 t
  9.                 .addHeader("Connection", "close")
    & `( h- t+ [' L* Z
  10.                 .build();: J0 a) o8 `+ Q6 _
  11.         if (bytomApiserverUrl==null || bytomApiserverUrl.contains("127.0.0.1") || bytomApiserverUrl.contains("localhost")){6 `  K: O0 ~2 g, {4 v
  12.         }else {
    # g. I/ K6 f1 v) ]# W0 Q" F
  13.             byte[] encodedAuth = Base64.encodeBase64(bytomApiserverToken.getBytes(Charset.forName("US-ASCII")));' v' f2 w  {7 {% v5 A6 V
  14.             String authHeader = "Basic " + new String(encodedAuth);
    # ?9 H; d7 E7 d7 M- N9 F. ?
  15.             request = new Request.Builder()
    : P- J* D6 ~$ x  T9 x- k2 ?
  16.                     .url(bytomApiserverUrl+"/"+method)4 X0 X  O3 {/ I" b# B* h
  17.                     .post(body)( R, }% |4 ?0 e* p# w$ q! X
  18.                     .addHeader("authorization", authHeader)
    3 |* T, M  `' ]/ J
  19.                     .addHeader("cache-control", "no-cache")4 V# c: \3 F4 J
  20.                     .addHeader("Connection", "close")$ l( @: _; @. {  c
  21.                     .build();
    3 c' g# b) z5 h
  22.         }4 C# y! l3 @* R. B
  23.         Response response = client.newCall(request).execute();
    2 M5 g. G! P7 f
  24.         return response.body().string();+ B8 p6 G* ]; @5 s! [' y
  25.     }
复制代码

% l# k7 M9 F: B5 Z0 H2 b6 G7 }
, i' M7 h% l# \. b  h
比原项目仓库:; O1 K/ O" _8 F
Github地址:https://github.com/Bytom/bytom
& X7 _% G, N# X% dGitee地址:https://gitee.com/BytomBlockchain/bytom
标签: 币币合约
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

凤翩翩求其凰翩d 小学生
  • 粉丝

    0

  • 关注

    2

  • 主题

    1