Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
本文解析的为比原提供的币币合约 模板如下:
! o+ |* z( }8 ~! S' D
  1. contract TradeOffer(assetRequested: Asset,( B6 a- }9 F: L8 X9 _) V/ z
  2.                     amountRequested: Amount,. n, G/ g1 ~5 q2 b5 m; F# l
  3.                     seller: Program,6 P5 S. B7 j( g8 p% F4 `
  4.                     cancelKey: PublicKey) locks offered {$ W& A& f% n. [8 O8 ~' \8 {
  5.   clause trade() requires payment: amountRequested of assetRequested {
    2 t& ?' v; N/ {# C9 j. R
  6.     lock payment with seller
    1 K* n% b( Z- e  G0 V% m
  7.     unlock offered, S/ U" k( Y! Z" C, _5 A' @
  8.   }
    9 E+ G/ b$ j- `/ Z! U+ q
  9.   clause cancel(sellerSig: Signature) {
    , e( d+ y( O: M4 Y( _; n
  10.     verify checkTxSig(cancelKey, sellerSig)" r# W3 P* u  A4 ]
  11.     unlock offered$ q4 ~" p! ~' I' I* X
  12.   }. M: n! ~# e% o6 @+ h1 r
  13. }
复制代码
; K! M4 R  B9 s% J
导读: 初次接触比原只能合约的请点击比原智能合约入门 和 Equity 语言入门 学习,方便更好的理解该文档
) `+ g- ?8 |$ r: K& c! i锁定合约$ l9 J' S4 O* _: j1 c/ w' f9 J3 e, ^9 j
第一步:调用create-account-receiver 生成 control_program
/ n. `" \0 M# P6 W7 d
# ]( ~/ L6 f. z* z以下是相关代码片段:
' u2 T0 K9 q& U7 n* W+ S5 n! A$ osendHttpPost("{\"account_id\":\"0IJVD7MNG0A02\"}","create-account-receiver","http://127.0.0.1:9888","");, S/ a9 ?- z! G+ a* Q& z; ^  c, g
第二步调用list-pubkeys 获取 pubkey
6 u/ n1 `! w7 O" j0 x/ J, I
5 J6 a" Q: i+ [$ m! H1 G5 P+ X5 e" L2 q: a2 K3 I. v  \: B
以下是相关代码片段:: {. f1 G0 n; T* e) S
sendHttpPost("{\"account_id\":\"0IJVD7MNG0A02\"}","list-pubkeys","http://127.0.0.1:9888","");$ n: k& P2 f# `% \
第三步: 将1 2步获取的值调用compile接口编译合约获得program 合约程序  l0 C6 \  s2 y5 ?3 N8 c9 G
1 A1 N, H1 q+ _0 Y

0 t' R( r: O# |6 w' K以下是相关代码片段:0 X6 ^8 h7 o, ]/ Q! h  {
           
  1. JSONObject param=new JSONObject();7 l( i5 D" {0 u
  2.             JSONArray agrs=new JSONArray();# e1 |( Q4 n: w, A' p; S
  3.             //合约的四个参数值6 W3 ]) W4 C  k2 v6 |
  4.             JSONObject assetParam=new JSONObject();
    - F) ~3 |( B; I" o+ C8 _0 S
  5.             assetParam.put("string","81d097312645696daea84b761d2898d950d8fba0de06c9267d8513b16663dd3a");, C0 O% ?5 Q: B) p5 r6 F1 K
  6.             agrs.put(assetParam);- @! {, h/ _/ b! c
  7.             JSONObject amountParam=new JSONObject();
    4 F8 {) X9 H; G: m- A, i
  8.             amountParam.put("integer",200000000l);5 A; T! H7 T1 D' W# I9 D8 A
  9.             agrs.put(amountParam);
    , z+ ?, ?9 w$ e! [! M
  10.             JSONObject programParam=new JSONObject();
    2 y" O( j- l" r. n- a
  11.             programParam.put("string",control_program);* N9 M% S2 f, v9 S+ O
  12.             agrs.put(programParam);
    5 l7 E: d! D9 v$ \% X! P7 N
  13.             JSONObject publicKeyParam=new JSONObject();
    : L+ X' |. `' C3 X
  14.             publicKeyParam.put("string",pubkey);
    ; a4 j( j1 L) t6 o) e/ f3 y0 f
  15.             agrs.put(publicKeyParam);4 i+ q9 o* k; p4 D! F" w
  16.             param.put("agrs",agrs);
    / j1 U) _! \; E
  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 } }");& o  M1 o& g4 U$ ~2 F
  18.             //调用编译合约( o1 P- y! k1 ~" {7 ^- P' W
  19.             sendHttpPost(param.toString(),"list-pubkeys","http://127.0.0.1:9888","");
复制代码
* m5 w& s0 V: D6 m9 y6 l3 H
第四步:将program 传入build-transaction接口去build一个交易的到data
  S0 L& d/ u: n( C  C
6 h1 _; n$ u4 l2 R: A1 v# m
; L; z! B" G( _2 G2 n# l" x8 ~以下是相关代码片段:) g+ N' F2 u" ^" ]' L( p7 \, y
           
  1. param=new JSONObject();  T: u; h; w- i* i+ z4 j. A
  2.             agrs=new JSONArray();- I  X! C" D% E, h# x- c; ]
  3.             JSONObject spendAccount=new JSONObject();
    . l- \5 U7 @( ]  J: d) a3 T
  4.             spendAccount.put("account_id","0H757LPD00A02");4 N$ L! I$ m- B
  5.             spendAccount.put("amount",9909099090000l);5 M' ^) K3 h. B7 F' v6 V
  6.             spendAccount.put("asset_id","161b9767b664df907fa926a31f9e835236e57f3e9ccc5f80c12bd97723322652");
    : o8 X/ H$ ~' @) g0 r+ h7 l7 `, H
  7.             spendAccount.put("type","spend_account");
    ! C! I" w+ c, w% u$ o  i6 ~+ C/ Q9 a
  8.             agrs.put(spendAccount);
    ; p& M' O8 ~0 Z  E: B/ Q6 H
  9.             JSONObject controlAccount=new JSONObject();: u% \# M# U. A% w, r& r& H" r) h
  10.             controlAccount.put("control_program",program);$ \( `- [- E: T6 x" d, z
  11.             controlAccount.put("amount",9909099090000l);' I+ K# d$ T2 L) n: n
  12.             controlAccount.put("asset_id","161b9767b664df907fa926a31f9e835236e57f3e9ccc5f80c12bd97723322652");
    $ [; a1 y. w" R+ @: \
  13.             controlAccount.put("type","control_program");
    " Z% A9 x& F" H6 m2 m: l( w6 h
  14.             agrs.put(controlAccount);/ u1 u6 F) _& |1 d$ z! t
  15.             JSONObject spendAccount2=new JSONObject();
    6 x& x1 r9 e, a6 l2 f# Q
  16.             spendAccount2.put("account_id","0H757LPD00A02");4 k  L7 P2 m# E
  17.             spendAccount2.put("amount",6000000l);( O+ ~* M4 M3 O- j3 n" _& C; S
  18.             spendAccount2.put("asset_id","ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
    6 c. Q0 l/ @2 `# Y# Q- ^: [. n
  19.             spendAccount2.put("type","spend_account");+ T7 Q) {' L2 t) h) M* h
  20.             agrs.put(spendAccount2);
    , X( A! Z" q. \, m
  21.             param.put("actions",agrs);5 C# Q4 ?# p4 X+ l9 Z
  22.             param.put("ttl",0);4 G0 r; T  R! E1 \% a: J& d
  23.             sendHttpPost(param.toString(),"build-transaction","http://127.0.0.1:9888","");
复制代码
+ }1 O4 ]5 \5 Y! ~2 T
第五步:输入密码调用sign-transaction签名第四步build的data 得到raw_transaction, G. n7 J; X0 ~1 H/ o$ ~: N
* U( c  `; P9 Y# U# j2 ]' l1 Q
) g; x1 O2 ]  O, j, E6 u. x2 A9 ^
以下是相关代码片段:
; j  k! x1 m6 d! I3 A) v            param=new JSONObject();; S1 e, f& \$ r* z
            param.put("password","xxx");
' z9 c& Z" J) f' R: b4 T, ]            param.put("transaction",data);
5 N$ U$ ^" L& N. e* \            sendHttpPost(param.toString(),"sign-transaction","http://127.0.0.1:9888","");
3 ]6 C3 S9 C0 _$ I第六步:调用submit-transactions提交交易, y% N+ O' s7 g# w- d
; A* Z" y5 H3 V1 |
以下是相关代码片段:6 o) z/ z5 B2 `$ F; }
            param=new JSONObject();
0 I( B1 M- H7 ]) ?% i+ n8 @' g6 G6 C            param.put("raw_transaction",raw_transaction);* G+ {3 p+ q8 m5 r- P- D
            sendHttpPost(param.toString(),"submit-transactions","http://127.0.0.1:9888","");
( c4 |  k3 v) ^. l2 {2 N0 J: @8 F解锁/取消合约3 E' _5 I. c) ?; @6 ?* I
首先需要decode出生成合约时候的参数
. ?  `0 D+ o& V" |0 d' v调用list-unspent-outputs 获取生成的合约信息获取program
, n& s8 H, b4 b6 m6 P; u8 O1 Z% M  A3 V3 A# J1 J+ W
以下是相关代码片段:+ A0 Y4 i' v$ _" j2 e( [* r
param=new JSONObject();
9 g( |  M/ J/ a8 y        param.put("id",outputid);
2 @9 P2 J  P* w8 I  k& T' r        param.put("smart_contract",true);
: t) M  f5 r' i        sendHttpPost(param.toString(),"list-unspent-outputs","http://127.0.0.1:9888","");& @( ^; G; b: \, S; O8 |" w
调用decode-program 传入获取生成的合约参数信息
/ ^4 C* Z3 F+ w; J& C; ^; P  B0 `/ I% u9 _- z7 X
以下是相关代码片段:
, S8 O! U/ g- Hparam=new JSONObject();! Z# V$ T7 q% z1 d% J. r
        param.put("program",program);
2 [8 O; L% v- K  L+ a        sendHttpPost(param.toString(),"decode-program","http://127.0.0.1:9888","");
, u; Z. F6 z5 j3 [- I; E1 `6 M需要注意的是decode出来的为值是逆序的(后续会有文章详细介绍)
- Z; ^3 Q1 ?( \0 X& D1 j) t5 M- z解锁/取消其实就是把生成合约的步骤中的第三步去掉,替换调用生成合约第四步的参数即可# e) L+ ~2 B! e9 h! L1 T6 k% ?
取消合约的构造参数如下:
$ S9 X- z4 z1 p
: s; g" P6 }- b% F            
  1.   spendAccountUnspentOutput = arguments: [{
    5 Y: ^0 q+ \1 J5 r5 ]/ D  [" T
  2.                   type: 'raw_tx_signature',
    0 _4 }8 W# t  S" F
  3.                   // 生成合约第二步的pubkeylist 详情
    ( g# q# y; S$ ~/ \
  4.                   raw_data: {
    ) _, F3 J+ v0 P" B* U
  5.                     derivation_path: pubkeylist.pubkey_infos[0].derivation_path,
    6 X3 J2 L9 n9 M
  6.                     xpub: pubkeylist.root_xpub) n) |. v' Y4 W3 v
  7.                   }
    . `2 c+ o* \5 k; Z" }+ g
  8.                 }, {/ o+ a' }! r: l# O
  9.                   type: 'data',# |& W. @# Z0 J; i* l  W
  10.                   raw_data: {
    0 k- ?; e( e) f  }
  11.                     // 参数偏移量 在一个合约里是固定的
    8 K3 m7 G& v# h/ Y7 w
  12.                     value: '13000000'
    0 L# \" [) [; Y2 O. P2 `
  13.                   }
    . P. i5 `4 {+ D% Y
  14.                 }],8 _8 ?3 j) v! k' I6 f4 z
  15.                 output_id: output_id,0 o' ?) H5 P1 V8 V* b% G8 d
  16.                 type: 'spend_account_unspent_output'
    ; k, C# w' V9 k* @2 _$ I8 `5 k0 _
  17.               }
    ( }8 H8 W/ f; U# l* ^
  18.               const controlAction = {9 u1 u9 \- T& J% @) H6 T# g& {
  19.                 type: 'control_program',
    8 X) J+ `) U, H2 @
  20.                 amount: 100000000,$ ^/ M) ?/ [4 G" ~
  21.                 asset_id: asset_id,# f4 A, P7 h0 N8 ~) E( c" p8 v
  22.                 control_program:control_program. K& p  D2 Z" B2 z
  23.               }
    ( O% F: N, o' C, ~  X
  24.               const gasAction = {3 F' i8 A0 j4 f! [' Z
  25.                 type: 'spend_account',' Z; l6 L& F1 _
  26.                 account_id:account_id,
    $ i7 H3 }0 W9 x
  27.                 asset_alias: 'BTM',
    4 k. p' l) l" M4 P3 L+ D! {. w+ y% t
  28.                 amount: 50000000
    % x( G/ \: C, Z) \2 A' _  U+ R
  29.               }
复制代码
6 L* X, t) U# Q" M* s
执行合约的参数构造如下:
( L2 P. v' y5 t1 m0 ~# V9 U6 W4 J; p1 U# }, l' C" L
         
  1. const spendAccountUnspentOutput = {- Q: f5 B! Y1 T) s/ S
  2.                 arguments: [{- R+ I; [% A& g! p6 [
  3.                   type: 'data',
    7 X% T/ n. ?2 R0 V) A, N- b
  4.                   raw_data: {
    5 B. ]) t, U2 s
  5.                     // 执行合约输入资产偏移量
    / a+ S* I9 I7 G# p
  6.                     value: '00000000'
    & I) t6 S6 i& A9 e4 O/ B$ d) Y
  7.                   }
    # L: |* p7 h& z$ |  g
  8.                 }],
      G- a! x, s8 \3 i( U& L
  9.                 output_id: output_id,
    & \* o  a- H# Z) s/ U/ ?
  10.                 type: 'spend_account_unspent_output'
    # v3 J8 w- }* _: ^
  11.               }+ |. f' N" ?4 H" j; p  g) T7 I
  12.               // 合约执行提供的资产) Y; |0 t( ^  r" `1 {$ A* t
  13.               const issueControlAction = {
    4 o$ z8 i0 ?* w9 h3 E1 l  h" V7 V
  14.                 control_program: control_program,9 e+ F  p" y+ K, B9 i2 A9 i
  15.                 amount:  100000000,& V; \4 B& N  D
  16.                 asset_id: asset_id,9 C& s) t  g/ p! n) @" K8 z2 n
  17.                 type: 'control_program'  Y7 b0 x8 {8 @+ j( s
  18.               }
    8 c8 R& ]& k, K' B# ]0 N( N# H% m
  19.               // 合约执行提供的资产
    2 m8 L5 s6 e7 a2 v( A
  20.               const issueSpendAction = {
    4 e- `1 W' o! z5 @+ I2 `" B
  21.                 account_id: account_id,
    : T& r1 H, ^/ h
  22.                 amount: 100000000,8 I4 D- C/ H" R8 ?; @
  23.                 asset_id: asset_id,- s4 s' ~: A! Y2 X% U* }+ @' v# L
  24.                 type: 'spend_account'# w8 @7 U0 P0 t9 N. k! {- Q
  25.               }
    5 V4 w- _4 {+ P. d9 m# L4 J
  26.               // 旷工费
    , H- i3 W1 q% r/ b  ]7 f% ?2 w
  27.               const gasAction = {
    8 v2 Y8 d2 I( N' ]# _- v: @
  28.                 type: 'spend_account',9 a0 Y  b* P6 H/ _" S: g( Y; T
  29.                 account_id: account_id,
    / ]) M% U" b/ E- V% u, D
  30.                 asset_alias: 'BTM',: r1 L) r: s+ L; m
  31.                 amount: 500000001 B9 C3 O' Z% M0 Z) Y
  32.               }
    , l, P0 S0 |" {7 e5 a4 d0 J3 G4 C' i
  33.               // 合约执行获得资产对象7 s- R, M9 F! q( R! r+ [
  34.               const controlAction = {5 i: G8 z8 o* p  n. j  ]& U
  35.                 type: 'control_program',# B& P9 H) L) W% [& s& @/ t
  36.                 amount:  100000000,
    & d6 U& S5 M( e; r
  37.                 asset_id: asset_id,) h8 `  `, X: @2 L- E, D. v- _2 _
  38.                 control_program: compileData.control_program
    * m# W$ A( v1 }6 m* l( b; c
  39.               }
复制代码

! d/ E) J6 e9 l" i  y/ {# y* ~build 操作其实就是指定输入输出的过程,详情请查看 官方build文档 和 官方api文档
5 S: i3 m$ f% s7 |1 _备注8 ?- l7 X, u: U6 X3 L1 `( m
调用比原基于okhttp接口javautil 如下:
4 p! N$ E& J. q4 x  
  1. public static String sendHttpPost(String bodyStr,String method,String bytomApiserverUrl,String bytomApiserverToken) throws IOException {
    . \1 ]0 ]/ m/ D4 N
  2.         OkHttpClient client = new OkHttpClient();
    : G- G3 r2 A) T; A4 S8 i/ ]0 T  ^
  3.         MediaType mediaType = MediaType.parse("application/json");3 B. [$ E( V1 }8 C, j$ w; G
  4.         RequestBody body = RequestBody.create(mediaType, bodyStr);2 e$ s; _% |8 R- \0 v- Q3 {) V' H
  5.         Request request = new Request.Builder()2 p5 }6 T) Z; `/ Y) q% l
  6.                 .url(bytomApiserverUrl+"/"+method)
    * x, q8 M0 w3 s! `! M* n
  7.                 .post(body)
    $ Q+ I/ M: \5 X: `! O* C5 U2 e
  8.                 .addHeader("cache-control", "no-cache")4 Q+ }4 i8 z. b' ^$ Y# l0 P$ E
  9.                 .addHeader("Connection", "close"). i8 L& m: O  t9 C! ]3 h4 d% b
  10.                 .build();
    0 [$ @' k, c$ C+ @" G0 p& I3 V
  11.         if (bytomApiserverUrl==null || bytomApiserverUrl.contains("127.0.0.1") || bytomApiserverUrl.contains("localhost")){
    1 Y8 `3 w; m7 e- R
  12.         }else {8 c% f+ I; Y/ b9 d7 z* x* ?, z
  13.             byte[] encodedAuth = Base64.encodeBase64(bytomApiserverToken.getBytes(Charset.forName("US-ASCII")));2 h* t+ H: D! V2 g
  14.             String authHeader = "Basic " + new String(encodedAuth);
    & V- L7 \1 @6 l5 S8 D- T
  15.             request = new Request.Builder()+ N( S$ ?$ c, X7 H  h
  16.                     .url(bytomApiserverUrl+"/"+method)
    5 x5 M3 w1 t; `( E3 ~" a
  17.                     .post(body)7 _* ^6 i; P& |) c$ ]. J
  18.                     .addHeader("authorization", authHeader)
    9 g; d# s1 {6 k7 C% v' e
  19.                     .addHeader("cache-control", "no-cache")8 j) W/ S/ a# Y( I! M4 D9 W
  20.                     .addHeader("Connection", "close")+ r3 v% {* x" F' }0 o9 M
  21.                     .build();! R" ?3 T9 E; |  e0 a& t
  22.         }
    ! j6 x  n, I  W, C! \
  23.         Response response = client.newCall(request).execute();3 g3 z5 I9 l. S& f# i
  24.         return response.body().string();4 ?+ I) h  w$ W
  25.     }
复制代码

! s8 ]$ d" s: k) {/ O" ?. [: p
% N0 A  Y: J1 |3 i7 |, s- U# }% U+ R' t
比原项目仓库:3 i5 p1 G& U. j  z
Github地址:https://github.com/Bytom/bytom; q$ W2 x  K0 T* O2 a9 C
Gitee地址:https://gitee.com/BytomBlockchain/bytom
标签: 币币合约
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    2

  • 主题

    1