Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
本文解析的为比原提供的币币合约 模板如下:2 T5 B7 {* x6 q7 \- U
  1. contract TradeOffer(assetRequested: Asset,: ]" i1 n; M& V0 O4 g. u
  2.                     amountRequested: Amount,
    : I! ^  ]0 @$ [+ R% [% \
  3.                     seller: Program," \7 G+ |4 H6 O
  4.                     cancelKey: PublicKey) locks offered {
    $ {" z$ _. u3 h0 B4 p
  5.   clause trade() requires payment: amountRequested of assetRequested {
    . G' Y* x  P) V
  6.     lock payment with seller
    4 o: ~# W8 O- O# @# K/ F
  7.     unlock offered% f& b$ w. W* Z  i
  8.   }! f! {+ h$ @, R5 I
  9.   clause cancel(sellerSig: Signature) {
    ( W! [+ x: Z9 Y( q4 a! E& h
  10.     verify checkTxSig(cancelKey, sellerSig). G% T: ~# [% U+ d* A6 g7 ~4 E1 L
  11.     unlock offered
    2 F- H* I* z" i5 Q! ^8 A
  12.   }- y3 h/ V' G" k6 H
  13. }
复制代码

+ Q( @7 _6 S. W* X4 N' c4 |1 L导读: 初次接触比原只能合约的请点击比原智能合约入门 和 Equity 语言入门 学习,方便更好的理解该文档
% d+ o$ S2 m# I4 B. N锁定合约8 V' O; P( S- m
第一步:调用create-account-receiver 生成 control_program5 A8 ?2 h7 {! J7 N: R- u
) A8 O& d7 q& l6 I4 \; I
以下是相关代码片段:4 R) u7 @# H( X: v
sendHttpPost("{\"account_id\":\"0IJVD7MNG0A02\"}","create-account-receiver","http://127.0.0.1:9888","");
0 B1 T4 f1 P. a  U$ M5 V! [第二步调用list-pubkeys 获取 pubkey
9 F, J# l6 z. Z# P* {% r6 B# ~- X. M8 v# U
1 D% H4 }" U0 @7 E9 q( A
以下是相关代码片段:
) G( `2 @; X: I% G- {1 `sendHttpPost("{\"account_id\":\"0IJVD7MNG0A02\"}","list-pubkeys","http://127.0.0.1:9888","");
. C. z: {+ t; L5 w第三步: 将1 2步获取的值调用compile接口编译合约获得program 合约程序. b* Q: P( _5 _' p& T' X) z# J

* l: ?% \; c' d; O( ?
  S. A- O: U; ]+ D2 l以下是相关代码片段:
9 D% ^% k* U* t! G) ]           
  1. JSONObject param=new JSONObject();! R+ j* m1 l- E
  2.             JSONArray agrs=new JSONArray();6 S# `2 w9 W3 Y. }( @/ R, m' k
  3.             //合约的四个参数值
    1 [* }# D; j3 e/ W9 _! f
  4.             JSONObject assetParam=new JSONObject();1 _: x0 ~# ~$ [# @
  5.             assetParam.put("string","81d097312645696daea84b761d2898d950d8fba0de06c9267d8513b16663dd3a");# V. R: ?! t8 x1 B8 c' o: s
  6.             agrs.put(assetParam);
    . ^& v- s; k: k# k( }
  7.             JSONObject amountParam=new JSONObject();0 a" y/ ?9 x: U$ R* r
  8.             amountParam.put("integer",200000000l);0 ~2 \" T! q) _" e
  9.             agrs.put(amountParam);
    ; ^9 p. |3 I0 v% P& T5 C4 g
  10.             JSONObject programParam=new JSONObject();! F6 \) D' i. e+ a- w
  11.             programParam.put("string",control_program);+ `' Y+ S* h: |6 A6 s+ w
  12.             agrs.put(programParam);" I" i' L, U0 o) `0 x
  13.             JSONObject publicKeyParam=new JSONObject();
    ! q( x" G: v: H2 C( B* J( \  D8 i: [
  14.             publicKeyParam.put("string",pubkey);
    ( X5 Y) d2 L& {$ j4 H/ g  L
  15.             agrs.put(publicKeyParam);8 ]' T& P1 e" ^8 j% O
  16.             param.put("agrs",agrs);
    ( ~+ I0 J8 b4 p# f% t" P+ d
  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 } }");, Y& k6 d+ e" A
  18.             //调用编译合约% I& U; q! q- N. f8 A9 R9 `
  19.             sendHttpPost(param.toString(),"list-pubkeys","http://127.0.0.1:9888","");
复制代码
9 p) T% {6 P7 k5 O- W4 K) k' Z2 ~
第四步:将program 传入build-transaction接口去build一个交易的到data; [2 y/ i/ \* p/ G! W

. S! w2 K$ `2 b# J5 R# U- p2 E+ p" h
以下是相关代码片段:
6 A$ e6 Q1 F! i! Z4 X           
  1. param=new JSONObject();) E! A6 W  M7 Y3 t* X
  2.             agrs=new JSONArray();
    % L; d, |1 r; J* [3 K1 m3 U8 q
  3.             JSONObject spendAccount=new JSONObject();
    3 k. a  M; {* E$ ?1 ^% e
  4.             spendAccount.put("account_id","0H757LPD00A02");
    # }" U# `% G: r, d1 V5 Y
  5.             spendAccount.put("amount",9909099090000l);( k! f: S8 j+ @! ^
  6.             spendAccount.put("asset_id","161b9767b664df907fa926a31f9e835236e57f3e9ccc5f80c12bd97723322652");
    / r6 \, w' G( X6 C
  7.             spendAccount.put("type","spend_account");
    & S2 u$ A$ ]& p. Z' g0 X
  8.             agrs.put(spendAccount);. x7 C/ P) X8 R  S/ e6 @
  9.             JSONObject controlAccount=new JSONObject();# M4 `% d/ L! F+ U: |
  10.             controlAccount.put("control_program",program);
    " Q3 e- f0 ?" J; b  Y, B% W
  11.             controlAccount.put("amount",9909099090000l);
    : z/ c" U% W) ?& u- [5 W/ H
  12.             controlAccount.put("asset_id","161b9767b664df907fa926a31f9e835236e57f3e9ccc5f80c12bd97723322652");% D# N' l9 s/ i
  13.             controlAccount.put("type","control_program");
    + k* `$ O; }9 F* r0 Z
  14.             agrs.put(controlAccount);
    8 W% ], I  |# Y9 [' r; v$ l$ e" _
  15.             JSONObject spendAccount2=new JSONObject();- s7 y+ T* y7 D* l! U
  16.             spendAccount2.put("account_id","0H757LPD00A02");
    " H" u: p$ x/ X# Y# k5 z
  17.             spendAccount2.put("amount",6000000l);; S+ o  m* H4 G# m9 M( u
  18.             spendAccount2.put("asset_id","ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
    2 k  @' l9 l# G# {# e7 ^. q8 M
  19.             spendAccount2.put("type","spend_account");
    3 d- n/ M; d3 W' p0 h; a
  20.             agrs.put(spendAccount2);
    . }6 o8 M5 D$ H3 v( I$ h
  21.             param.put("actions",agrs);
    + F- l5 z- N3 c: D6 V9 k
  22.             param.put("ttl",0);3 h4 m/ r5 W) }/ u7 K
  23.             sendHttpPost(param.toString(),"build-transaction","http://127.0.0.1:9888","");
复制代码

3 U5 T9 z% m9 S第五步:输入密码调用sign-transaction签名第四步build的data 得到raw_transaction4 L4 e: G. T3 r# o1 g

' R  W( P  f3 [) H/ `0 O& j0 B6 b) C  Y! _5 N; G/ ]9 p/ I
以下是相关代码片段:
' I/ }% C3 H9 x" D9 g$ N            param=new JSONObject();/ w% W9 }! u6 m7 H. T0 u8 _+ O' Z5 r
            param.put("password","xxx");7 P4 P/ S; a* A* r% O
            param.put("transaction",data);
8 z6 `- T5 k9 K$ {1 Q3 _            sendHttpPost(param.toString(),"sign-transaction","http://127.0.0.1:9888","");  w$ t( b2 J3 m# l7 E; v5 X! g8 I
第六步:调用submit-transactions提交交易
/ R* t" A& l+ k9 h% }0 J3 Y2 h+ r/ n6 ?+ l3 m( C% n
以下是相关代码片段:
$ _- [1 P0 b& i0 X            param=new JSONObject();
- d, \* w4 Q5 p            param.put("raw_transaction",raw_transaction);
$ b1 C4 V4 I4 s! L$ B            sendHttpPost(param.toString(),"submit-transactions","http://127.0.0.1:9888","");
0 ?  P6 J' Q- x8 `解锁/取消合约
, h6 z1 m+ G& ~首先需要decode出生成合约时候的参数
9 U$ f: b9 B1 _调用list-unspent-outputs 获取生成的合约信息获取program
7 x; C3 S3 x# R) M8 D3 P
1 w, B% Q7 [1 c4 B5 g以下是相关代码片段:
; O+ |) O3 C4 m4 r* w9 eparam=new JSONObject();6 Y0 _0 j7 `7 f4 q1 @
        param.put("id",outputid);
# b! c$ C" ~' D# x6 ?* g        param.put("smart_contract",true);
" u( R& X7 \: Y- b3 H2 m        sendHttpPost(param.toString(),"list-unspent-outputs","http://127.0.0.1:9888","");3 C5 e6 s- n, E- A3 r
调用decode-program 传入获取生成的合约参数信息. H5 x1 D* H$ w* w: g7 q' F/ T4 q" o
6 m; k1 Y. }: ?, u' b+ I" K7 J
以下是相关代码片段:9 U9 i) P8 o- V/ ?& Y
param=new JSONObject();
9 H( h$ z" F4 ]! g* `        param.put("program",program);2 x! b+ p5 y. m/ ~: a
        sendHttpPost(param.toString(),"decode-program","http://127.0.0.1:9888","");7 A1 H" ~. M) t. K! b4 _
需要注意的是decode出来的为值是逆序的(后续会有文章详细介绍)
" Y( L$ B9 m  X/ d) E% P. h8 R) S解锁/取消其实就是把生成合约的步骤中的第三步去掉,替换调用生成合约第四步的参数即可
# _( b* q7 a" l* l取消合约的构造参数如下:
! J7 I8 j: i+ o( F8 r4 a; q2 V  z2 ?4 M. X4 ?
            
  1.   spendAccountUnspentOutput = arguments: [{2 f# f3 m7 D! U* P" `* W) N
  2.                   type: 'raw_tx_signature',
    5 {2 I/ q2 t/ e0 c' B  u9 X9 h
  3.                   // 生成合约第二步的pubkeylist 详情0 `4 w2 S! j2 F8 G! q0 ?; D6 R
  4.                   raw_data: {
    8 o- K# Q/ R( R) D7 X8 W! N+ C; c2 a
  5.                     derivation_path: pubkeylist.pubkey_infos[0].derivation_path,
    0 A6 ?( u6 }$ I3 u2 Y
  6.                     xpub: pubkeylist.root_xpub% g" @( _! F0 y+ P
  7.                   }
    " Q, w( z6 F; [  E) k' _; O, Q
  8.                 }, {# L: r+ J! h% R) d& K
  9.                   type: 'data',
    & D* N7 k- B1 Q4 b
  10.                   raw_data: {7 o! ?2 J0 ^( y8 {1 Y
  11.                     // 参数偏移量 在一个合约里是固定的
    7 @8 @# p+ W/ X" s. L4 S# m- W% P9 w
  12.                     value: '13000000'
    0 w# T1 ~/ ]4 x) P, m( X# n- z9 f
  13.                   }
    6 u$ C) u0 Z' H/ g1 q2 f( Q9 u7 A
  14.                 }],* Y1 r) f" F) z
  15.                 output_id: output_id,
    ; n% P) |- u  k, y4 ?$ o2 o3 }+ `. ~
  16.                 type: 'spend_account_unspent_output'
    " E4 Q' p8 ?4 ^. `# X
  17.               }
    : k4 {# ~- Z0 w
  18.               const controlAction = {- \/ O, k3 M+ `, I
  19.                 type: 'control_program',8 i6 Q! K6 c7 G) F+ B! M
  20.                 amount: 100000000,8 |$ ]; R5 T* y0 u" ]& J! D. r
  21.                 asset_id: asset_id,
    , {8 A; {1 Q9 g: I
  22.                 control_program:control_program
    9 u. P/ G: u& f7 ~, d5 x
  23.               }
    9 |+ ?8 h, P/ r8 q1 ~) s
  24.               const gasAction = {6 l! j0 K& }) [
  25.                 type: 'spend_account',
    % m) Q9 I' }! s. i0 |/ m
  26.                 account_id:account_id,
    ; z+ F9 }' a# o' _
  27.                 asset_alias: 'BTM',
    ) R9 C) P  Q& @  S! s/ {0 `- ^6 q
  28.                 amount: 50000000
    # m1 y# L$ s8 N& c& L
  29.               }
复制代码

& G& Q: c# I4 R执行合约的参数构造如下:; P* D. V) B* `: Q& I8 P) l
# o+ p) m3 g0 @
         
  1. const spendAccountUnspentOutput = {0 z0 s' p! R+ h  e3 }5 h: J5 o
  2.                 arguments: [{0 o: E) X" o- ?. C# t- T+ Q2 F" c0 U
  3.                   type: 'data',
    & I& O6 i+ R1 L, {* x5 r- s
  4.                   raw_data: {9 S5 a" X/ z1 S) ?
  5.                     // 执行合约输入资产偏移量
    - \# z1 U( t% J
  6.                     value: '00000000'
    + u& V7 h) f: c1 q5 e
  7.                   }6 ?6 ^" R( ?# A% [
  8.                 }],# Z1 M5 Y2 m" P5 f1 v
  9.                 output_id: output_id,
    8 {2 l% t1 N$ c) q
  10.                 type: 'spend_account_unspent_output'" q1 M* e; u$ {$ P2 m
  11.               }
    3 z2 D; Z& W7 b0 l
  12.               // 合约执行提供的资产- d$ [; L5 p. T7 E
  13.               const issueControlAction = {
    + |. T* j1 ]! y
  14.                 control_program: control_program,9 F! V7 p. t! s- v  |8 _
  15.                 amount:  100000000,
    ! \- Q& D/ z  L3 c' i, g6 P
  16.                 asset_id: asset_id,
    , }' o& R3 |( m$ M( p4 @) m
  17.                 type: 'control_program'" B5 [$ }) @% A0 ?* {  h# l2 j- Y
  18.               }, g3 y4 G1 |0 i* H: ^8 e2 z4 l
  19.               // 合约执行提供的资产
    9 _" L6 J! }" _, H
  20.               const issueSpendAction = {
    # L; L$ ^! @2 [! J8 F5 V/ \  _" ?
  21.                 account_id: account_id,. n9 ]& I. q0 H# {
  22.                 amount: 100000000,  O0 t4 }* T; ~" s' k6 o3 R9 @
  23.                 asset_id: asset_id,% q1 @' v! C: G- ^" P
  24.                 type: 'spend_account'4 N/ ?9 ]3 D+ k. x% b
  25.               }
    : V) Q$ O5 x+ ?2 s. l
  26.               // 旷工费# g: V2 k9 B$ d% r% I5 m" p
  27.               const gasAction = {
    ' y$ b: @% d5 {5 U, \
  28.                 type: 'spend_account',
    0 y: ?% E" _, o% D4 L4 c% G2 t, u
  29.                 account_id: account_id,+ o' d+ |+ Z8 t# G( l9 e
  30.                 asset_alias: 'BTM',
    ; S# m4 u& y+ M0 u
  31.                 amount: 50000000
    2 a* L  Z  p- |8 t0 \! K  u) U
  32.               }& H+ {& \9 ~4 c3 c# W
  33.               // 合约执行获得资产对象
    : ?2 m% S( v. D% h( C. f/ g( L1 w
  34.               const controlAction = {! A3 l, I6 ^4 ]; |, o: M# S
  35.                 type: 'control_program',4 q! W5 T" K. E
  36.                 amount:  100000000,+ I% |( {6 @8 J" w9 `- a
  37.                 asset_id: asset_id,
    $ M; p. ^! V% o7 l
  38.                 control_program: compileData.control_program! z% h" A0 R% t0 s# ^1 o6 x# c2 O
  39.               }
复制代码

" y; r" M  ~$ D  c* Z% ^6 Tbuild 操作其实就是指定输入输出的过程,详情请查看 官方build文档 和 官方api文档
! [* R# ?2 K$ J7 A# f备注
% j% a) R" @! w调用比原基于okhttp接口javautil 如下:3 m+ ]/ U. M( L9 M  z# U0 q* \
  
  1. public static String sendHttpPost(String bodyStr,String method,String bytomApiserverUrl,String bytomApiserverToken) throws IOException {
    ' [) f/ J4 |$ z& Q' H+ S
  2.         OkHttpClient client = new OkHttpClient();5 m+ t5 p% k! _+ a% M. }* H
  3.         MediaType mediaType = MediaType.parse("application/json");, \2 y# Z/ T1 B# a  n5 O3 ~+ Y
  4.         RequestBody body = RequestBody.create(mediaType, bodyStr);9 E  V5 A: Q7 b$ j
  5.         Request request = new Request.Builder()
    7 g: y& S: J$ [6 d7 `/ S1 R
  6.                 .url(bytomApiserverUrl+"/"+method)9 k6 Y! l8 `% E1 O, Z6 D0 ]
  7.                 .post(body)
    2 t3 Q! z1 Z1 s+ S
  8.                 .addHeader("cache-control", "no-cache")  u4 F4 W6 q4 c. ]: p
  9.                 .addHeader("Connection", "close")
    1 w) r: z. [" F. K. c
  10.                 .build();( z0 p3 u2 R* s, c7 Z
  11.         if (bytomApiserverUrl==null || bytomApiserverUrl.contains("127.0.0.1") || bytomApiserverUrl.contains("localhost")){  F5 h% Q- o4 Q
  12.         }else {) U$ Z) ?1 X, C4 b" P
  13.             byte[] encodedAuth = Base64.encodeBase64(bytomApiserverToken.getBytes(Charset.forName("US-ASCII")));0 P4 c2 t, M# r# X* K: l+ {5 l; I' K
  14.             String authHeader = "Basic " + new String(encodedAuth);
    ( Z4 f6 ~( r  K/ Y2 S8 m
  15.             request = new Request.Builder()
    + ]6 S$ [+ w5 W. l9 N
  16.                     .url(bytomApiserverUrl+"/"+method), A- Q( e) [! I% r9 O) e' m
  17.                     .post(body)% {# ^7 z( M0 S5 [
  18.                     .addHeader("authorization", authHeader)* Y) |& }3 c+ b7 p. h& W& u1 l
  19.                     .addHeader("cache-control", "no-cache")
    ; U+ r5 I/ e' X) [; z0 P# U/ W
  20.                     .addHeader("Connection", "close")
    ' a: W5 t' c# S. T' x7 ?9 d
  21.                     .build();
    $ U/ @3 Q9 \8 f4 `5 Q
  22.         }! M" b2 H9 E" g
  23.         Response response = client.newCall(request).execute();: ~7 k" y# m, Z, o& U
  24.         return response.body().string();/ b9 f! S* y+ b$ P' ^  S  U: U# m
  25.     }
复制代码
% }8 |3 ]# w+ e) d( ^. a

/ T1 m3 `2 e2 R9 e+ F+ ?9 E6 s  J1 q& R
! O: e6 }! f+ ]7 Q# u比原项目仓库:
. n- S  [+ _! s& DGithub地址:https://github.com/Bytom/bytom
! w8 M) ^5 p. {+ ZGitee地址:https://gitee.com/BytomBlockchain/bytom
标签: 币币合约
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    2

  • 主题

    1