Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

比原链Java版本离线签名

yuan081608
111 0 0
    tx_signer
6 D5 E, D. A% S4 }' ]) t3 p' p    Javaimplementationofsigningtransactionofflinetobytomd.* B& ]3 q, Q  h3 S7 W% [7 S
    Pre0 e  h4 y  D# G2 z$ l/ K9 E  l
    Getthesourcecode
  Z+ P5 {7 q% r6 E    $gitclonehttps://github.com/Bytom/bytom.git$GOPATH/src/github.com/bytom
7 }4 a5 T" B$ I* ?    gitcheckout
9 ~7 D3 b( s: d- f' M; G    $gitcheckoutdev
' W; r2 N5 `3 {1 ?+ \    Whyneeddevbranch?Becauseyoucouldcalldecodetransactionapifromdevbranchandobtaintx_idandsomeinputsids.$ }, a: r: g% o/ j: Z4 n
    Build# r2 l9 X' e+ y7 E( ^* d
    $cd$GOPATH/src/github.com/bytom
5 `3 e/ r9 B. @: u& B9 T- j. p0 u    $makebytomd#buildbytomd. s' O: b* \1 H4 D6 z4 H2 C
    $makebytomcli#buildbytomcli0 _- g" R/ _  F4 X
    Whensuccessfullybuildingtheproject,thebytomandbytomclibinaryshouldbepresentincmd/bytomdandcmd/bytomclidirectory,respectively.
/ y) x8 _6 B" o+ L    Initialize9 e5 F9 C# }  d
    Firstofall,initializethenode:; h+ U2 i* [; v$ p
    $cd./cmd/bytomd1 X4 W: J5 M( J. f& ]( A% Y
    $./bytomdinit--chain_idsolonet
* g1 S. ?5 y9 T* ?' F    launch
& n9 U+ s$ @4 u6 ]% |    $./bytomdnode--mining
# i, y# Y3 f1 p$ ?& }    Usage! H9 x" H' k; L$ ?+ E, C# n) q
    Buildjar' ]4 i, n! M1 ]* {8 D

' I/ |. q0 W6 L# x* I    firstgetsourcecode
& A" b( O  h% Z+ \$ h    gitclonehttps://github.com/successli/tx_signer.git
; r$ j2 G; P4 X6 G$ t1 D, {* K6 f    getjarpackage  ]4 V& A6 ~& g5 ?! S: x9 ^0 j
    $mvnassembly:assembly-Dmaven.test.skip=true2 P' K' ~$ l7 C8 E3 L& W" k5 g
    Youcangetajarwithdependencies,andyoucanuseitinyourproject.5 \5 d$ c4 n; C

5 j/ m( _' I1 g' E' T    Testcases: ^3 A8 Z; h! A
    Need3Parameters:" m) f; H5 E/ O
    PrivateKeysArray
- D4 W5 Z+ @" h. O( @' C1 T5 L9 T: w    TemplateObject* \2 i) y& E* ^$ Y: p* ^7 p) L
    AftercallbuildtransactionapireturnaTemplatejsonobject.buildtransactionapi
- v; q7 P' T# |* L: k    usebytomjavasdkreturnaTemplateobject.
6 E1 |% D5 r7 O7 M! r* Y  a  }9 t    RawTransaction
7 e+ z" l( ]0 C3 D( }: C  p" V; a    calldecoderaw-transactionapifromdevbranch.decoderaw-transactionapi
. ?" F: u* A% o2 t$ _9 B    Callmethod:  P& O8 r1 i. f* z3 q
    //returnaTemplateobjectsignedofflinebasically.: W; U8 s: Q) W8 ^
    Templateresult=signatures.generateSignatures(privates,template,rawTransaction);
( D- h$ Q7 x$ T& ]& N2 S; `    //useresult'sraw_transactioncallsigntransactionapitobuildanotherdatabutnotneedpasswordorprivatekey.
( {. q$ n7 K$ i; {. U' z    Single-keyExample:6 n2 r- {/ ?' y( F% v, ]9 w; x  }) b
    @Test
0 p. O! r" K/ h3 I8 }& B0 K3 W; H    //使用SDK来构造Template对象参数,单签
& A! M8 d' r# O0 o4 i3 |    publicvoidtestSignSingleKey()throwsBytomException{2 Z) B; v3 q; I
    Clientclient=Client.generateClient();
( V2 I; T4 u# q5 @, ^+ J    Stringasset_id="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
6 @" e# \( h; d, d' N: v    Stringaddress="sm1qvyus3s5d7jv782syuqe3qrh65fx23lgpzf33em";, [) B# y2 s, b' v/ p& l
    //buildtransactionobtainaTemplateobject1 o/ B, T3 x# ~: C! n# R+ P* k
    Templatetemplate=newTransaction.Builder()% n# v9 T$ d0 O  T
    .addAction(
6 v/ |& `, R' Q8 O( c# B# t    newTransaction.Action.SpendFromAccount()
' V# N  h5 I! V" T& g) n" T    .setAccountId("0G0NLBNU00A02"). B9 y3 V4 W  y5 t+ j1 P3 w' l: |; N
    .setAssetId(asset_id)% g5 g& w$ I( Q, r. z' h8 ~
    .setAmount(40000000); j# u8 }. f4 X1 w; ~: K7 @9 W# s. V. T
    )
& ~! ]3 R/ z; T5 u) @. W    .addAction(5 c; T" g8 L8 ~) M, e* X+ o3 d
    newTransaction.Action.SpendFromAccount()
, M6 }0 u  T$ e; r    .setAccountId("0G0NLBNU00A02")
( N! O8 u9 Q3 f' ]# @4 L    .setAssetId(asset_id)9 p3 S' R0 G. u1 v8 ^
    .setAmount(300000000)
& b  Q5 g8 J6 [  @, r9 r    )
+ l1 _$ N6 S1 C( H" S* L, G! ~    .addAction(
& s: o; T( K; b5 Q0 s    newTransaction.Action.ControlWithAddress()
  H, M* s( p2 l' Z- p    .setAddress(address)
- M( a1 L8 Q- l% c5 F  Y    .setAssetId(asset_id)
. E  \0 m& x- I    .setAmount(30000000)$ F% a1 u2 ?- b
    ).build(client);/ d- @) T1 _' l8 |! p! E1 Z
    logger.info("template:"+template.toJson());+ m- _& ~1 b7 u6 ^- a/ A- {# R
    //useTemplateobject'sraw_transactionidtodecoderaw_transactionobtainaRawTransactionobject
  ?; [% ^- b4 Z+ K9 w    RawTransactiondecodedTx=RawTransaction.decode(client,template.rawTransaction);
9 d" c1 X* z9 M9 `4 p; D. p    logger.info("decodeTx:"+decodedTx.toJson());
; P9 J6 S$ Y7 p2 V    //needaprivatekeyarray. w4 N' m& `  R2 Z% @
    String[]privateKeys=newString[]{"10fdbc41a4d3b8e5a0f50dd3905c1660e7476d4db3dbd9454fa4347500a633531c487e8174ffc0cfa76c3be6833111a9b8cd94446e37a76ee18bb21a7d6ea66b"};/ g9 G8 Q' Y; d) }" }
    logger.info("privatekey:"+privateKeys[0]);
5 w( |# B& q! D. f) m% q$ z    //callofflinesignmethodtoobtainabasicofflinesignedtemplate
* N) v4 K$ }% f3 i& j+ W    Signaturessignatures=newSignaturesImpl();
4 r# P' s' ~; Z( A" i    TemplatebasicSigned=signatures.generateSignatures(privateKeys,template,decodedTx);3 T% N/ `9 z# A9 k! \; i1 g
    logger.info("basicsignedraw:"+basicSigned.toJson());! j8 m" v# \3 T. W. ~
    //callsigntransactionapitocalculatewholeraw_transactionid
. f. |! ?& v5 g! O" u$ x$ R    //signpasswordisNoneoranotherrandomString
. W5 v& M& Q" v    Templateresult=newTransaction.SignerBuilder().sign(client,
2 l  |, H" V3 v3 a& s    basicSigned,"");( B, H, h1 N% a. A9 h/ f
    logger.info("resultraw_transaction:"+result.toJson());
4 |7 o$ T/ k3 k6 Q! h    //successtosubmittransaction+ i  [4 F9 S* }  w1 Z- F4 @4 \
    }+ u5 m7 p" ^4 f+ a
    Multi-keysExample:
, S# c! [# }$ V5 z5 _$ s    Needanaccounthastwoormorekeys.
. Q1 e, t& J+ e& y    @Test
8 o% @: M4 g* Q# ?    //使用SDK来构造Template对象参数,多签
; ~, r& h' D  `9 }# ~" R    publicvoidtestSignMultiKeys()throwsBytomException{
( o6 n6 G: Z5 f5 o* |6 j    Clientclient=Client.generateClient();
, H9 y/ W% t7 ?    Stringasset_id="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
8 N  ]! ~- A$ x    Stringaddress="sm1qvyus3s5d7jv782syuqe3qrh65fx23lgpzf33em";
7 Q; l: D) Z1 `/ e6 Q& K4 N    //buildtransactionobtainaTemplateobject/ W3 r1 z  i' M# o( q+ M$ e
    //account0G1RPP6OG0A06hastwokeys3 t& n3 f; L+ Y2 D* Z6 X1 P& e
    Templatetemplate=newTransaction.Builder()
# |) i+ u) C  B  p( W$ r* I    .setTtl(10)7 p, N/ I  t6 L% y% g; m
    .addAction(
1 y( b' p" H, U8 i' R* O& t3 R    newTransaction.Action.SpendFromAccount()
. Q% j& ]" s5 R, W% ~  M' ?    .setAccountId("0G1RPP6OG0A06")* @* w6 C1 H! }* \3 j. I% C) X
    .setAssetId(asset_id)
" H( o+ [' Q: l. r9 E+ A. `    .setAmount(40000000)
# y3 w, E! u# X5 F, H    )
' I& F, J/ b8 z( t+ q    .addAction(
2 t3 V* G) j1 H7 `2 r% Z    newTransaction.Action.SpendFromAccount()' P0 B5 P- r1 e6 \+ `6 e5 J0 C) ]
    .setAccountId("0G1RPP6OG0A06")
$ Z: X: H! N& X    .setAssetId(asset_id), s$ a& C3 }) S/ a2 A
    .setAmount(300000000)& ~5 B( P1 t- l/ h3 k  x
    )
( I( e! S. f- d5 |. [* R5 ~" \    .addAction(# f' Z* u' w0 U0 d9 ^
    newTransaction.Action.ControlWithAddress()
2 C0 ^% a: A; x4 Z' p1 @    .setAddress(address)
1 P) L( D, r6 a  [: D    .setAssetId(asset_id)8 P5 n' ~# q, K9 S6 z) N, _5 J
    .setAmount(30000000)
* q0 Q+ S1 ]: i6 O( Z    ).build(client);
( R1 s6 p1 A$ v5 I; {7 B, G    logger.info("template:"+template.toJson());9 c2 ~/ o8 X1 R: U
    //useTemplateobject'sraw_transactionidtodecoderaw_transactionobtainaRawTransactionobject  c# ^3 t0 L) V5 m0 S
    RawTransactiondecodedTx=RawTransaction.decode(client,template.rawTransaction);  f8 A0 @1 w: y$ ?3 v) D& N; F" L
    logger.info("decodeTx:"+decodedTx.toJson());7 v3 f! T% e* C; j3 w. Z2 a
    //needaprivatekeyarray
3 u. |: O3 ?0 m# ^* X" J    String[]privateKeys=newString[]{"08bdbd6c22856c5747c930f64d0e5d58ded17c4473910c6c0c3f94e485833a436247976253c8e29e961041ad8dfad9309744255364323163837cbef2483b4f67",: Q' O8 ]6 K1 g. m
    "40c821f736f60805ad59b1fea158762fa6355e258601dfb49dda6f672092ae5adf072d5cab2ceaaa0d68dd3fe7fa04869d95afed8c20069f446a338576901e1b"};# I# l6 J8 i: r! p- J7 D3 p" E+ i
    logger.info("privatekey1:"+privateKeys[0]);
( |$ l  S: H0 H# Z9 X    logger.info("privatekey2:"+privateKeys[1]);
- a/ V3 I' [6 ?  p    //callofflinesignmethodtoobtainabasicofflinesignedtemplate
" d( C9 b, l# S    Signaturessignatures=newSignaturesImpl();
: D# i5 K4 ]* A8 K+ q    TemplatebasicSigned=signatures.generateSignatures(privateKeys,template,decodedTx);
* f; b; K- K5 @    logger.info("basicsignedraw:"+basicSigned.toJson());$ Z* f' j9 [: [! K# H: b5 a
    //callsigntransactionapitocalculatewholeraw_transactionid
' a8 d4 C2 ^- V+ a: ~    //signpasswordisNoneoranotherrandomString% A& \+ [# @. Y9 _1 X0 _
    Templateresult=newTransaction.SignerBuilder().sign(client,3 T& R3 W5 J6 \& D4 y( V  V
    basicSigned,"");
3 f. @7 h+ O; K1 \+ ~, d    logger.info("resultraw_transaction:"+result.toJson());6 x  Y# X5 j& o5 n0 t
    //successtosubmittransaction, ^% C0 {9 X; q- }( \9 F
    }* l+ ^% c- M; U
    Multi-keysandMulti-inputsExample:
' @7 V7 y+ g; C& @) J% u0 T    @Test
0 ~! F) g. M  J% K6 l1 r    //使用SDK来构造Template对象参数,多签,多输入
; J8 A; D( e7 @9 x0 M8 Z8 D, J3 X    publicvoidtestSignMultiKeysMultiInputs()throwsBytomException{
' p- O9 ^# ^+ e8 w0 t+ D9 Y  S: w    Clientclient=Client.generateClient();% D7 [( ?: Y/ r$ I+ ^3 N2 j
    Stringasset_id="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";9 U: a6 I3 @! R8 |9 O, C
    Stringaddress="sm1qvyus3s5d7jv782syuqe3qrh65fx23lgpzf33em";) O5 [0 s+ n2 t/ |
    //buildtransactionobtainaTemplateobject
" |# X9 y* _1 {0 K) F7 z) R0 M    Templatetemplate=newTransaction.Builder()
* _* R$ a# n) g5 H1 v1 R% _    .setTtl(10)
. `. Z" U' V5 P2 f: {: h" V. q    //1input
- H' f; d, a0 {    .addAction(
& d2 n* q( @. z/ y8 O7 t) [0 L. E    newTransaction.Action.SpendFromAccount()
' a% K6 R3 N7 Q2 v& L) E: A    .setAccountId("0G1RPP6OG0A06")//Multi-keysaccount7 p$ [- e% p: V3 N5 B1 P
    .setAssetId(asset_id)4 B6 j" f0 _2 S: d
    .setAmount(40000000)
/ l6 b$ t8 H7 W* B! t, O    )7 o1 R: l+ u# t# l8 w
    .addAction(
; {" r# `* Z1 W; ?) ^4 G7 y6 L2 o    newTransaction.Action.SpendFromAccount()2 m) C1 z. S& [7 U
    .setAccountId("0G1RPP6OG0A06")
) m- c5 s6 _2 P- A8 b( d8 w    .setAssetId(asset_id)
1 k/ p7 G  |/ x. ?; g/ i$ |3 _    .setAmount(300000000)
6 Q9 I  V8 F& P* \' F    )//2input  H! D- E3 g7 o+ j1 Y0 r# Y
    .addAction(
: K! m8 E& h& l" I+ S    newTransaction.Action.SpendFromAccount()
! T1 V; @4 U) j4 b. |8 ]: v    .setAccountId("0G1Q6V1P00A02")//Multi-keysaccount. M. y; B' ~; r* L" F( R
    .setAssetId(asset_id)
4 {0 t5 G/ P& M' L) v) b4 l    .setAmount(40000000)4 u6 Z$ D1 n7 h, x/ A
    )' y5 T& p' p  Y( v. g& N4 _
    .addAction(4 a( t  x! p$ A$ M3 V, @
    newTransaction.Action.SpendFromAccount()' E0 X, \/ ?2 x' v$ _
    .setAccountId("0G1Q6V1P00A02")
- e0 b$ O6 W# q7 Q9 b  j" z  P6 ?, `" ~2 f    .setAssetId(asset_id), o8 d- |. p' F
    .setAmount(300000000): I  x- D) f8 ]/ c/ w) `9 _
    )
/ I9 V. B: i4 H5 K' \8 t0 f    .addAction(8 d. q0 `. K: \4 K1 w
    newTransaction.Action.ControlWithAddress()* N2 G$ U  N# k7 K6 D
    .setAddress(address)
, [4 A. j6 m" g( [) x+ ^# Y    .setAssetId(asset_id)8 o9 F+ k' H4 T/ \9 V
    .setAmount(60000000)
# w! j) @7 Z. h$ v% j    ).build(client);1 D- _, h+ O) c/ W$ k
    logger.info("template:"+template.toJson());- n  O% k9 y+ l  ?' @2 O
    //useTemplateobject'sraw_transactionidtodecoderaw_transactionobtainaRawTransactionobject4 v7 W) S0 ~- H* V" l5 V' h
    RawTransactiondecodedTx=RawTransaction.decode(client,template.rawTransaction);
$ Y: Z; ?. w- F! w* _    logger.info("decodeTx:"+decodedTx.toJson());
) ?0 G# p' p( ~# q4 ?4 n    //needaprivatekeyarray% o) g3 \9 t8 J; h
    String[]privateKeys=newString[]{"08bdbd6c22856c5747c930f64d0e5d58ded17c4473910c6c0c3f94e485833a436247976253c8e29e961041ad8dfad9309744255364323163837cbef2483b4f67",+ b/ R( \6 R+ o$ l8 h3 `8 n2 r
    "40c821f736f60805ad59b1fea158762fa6355e258601dfb49dda6f672092ae5adf072d5cab2ceaaa0d68dd3fe7fa04869d95afed8c20069f446a338576901e1b",5 t) @" Z8 ?( i# K: T
    "08bdbd6c22856c5747c930f64d0e5d58ded17c4473910c6c0c3f94e485833a436247976253c8e29e961041ad8dfad9309744255364323163837cbef2483b4f67"};
0 T" y* n2 g# f( d; m5 H  N    logger.info("privatekey1:"+privateKeys[0]);$ ?7 g" ~. o7 N3 }2 T
    logger.info("privatekey2:"+privateKeys[1]);
( }! b. P0 c4 o    //callofflinesignmethodtoobtainabasicofflinesignedtemplate% S, I# c% o. {4 ]
    Signaturessignatures=newSignaturesImpl();
# x" ]; f) U) S1 _$ ]    TemplatebasicSigned=signatures.generateSignatures(privateKeys,template,decodedTx);
/ x8 Y5 M9 h- F: c* q8 t    logger.info("basicsignedraw:"+basicSigned.toJson());
- O$ I8 ~/ z5 Q. X- V: T    //callsigntransactionapitocalculatewholeraw_transactionid
0 y. o5 g9 r3 ]! V: u; i    //signpasswordisNoneoranotherrandomString) P5 a* W: j; q7 G
    Templateresult=newTransaction.SignerBuilder().sign(client,
8 @) d% @& x2 _, v# B' A, c0 ?    basicSigned,"");; ]* }5 g5 R+ I& y
    logger.info("resultraw_transaction:"+result.toJson());
9 a! b0 ^9 a- ?! ^" b# ?    //successtosubmittransaction
+ w# J$ z; g6 v: A: Z* y) t    }
. ^4 r! D) ~" ]# R  r% @5 `
' W4 M2 G0 W, Y5 b( O6 t
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

yuan081608 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2