Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

比原链Java版本离线签名

yuan081608
106 0 0
    tx_signer( @) v) w) C& c6 Z+ e/ _. y
    Javaimplementationofsigningtransactionofflinetobytomd.
5 E8 i) P  j+ A# p% K; b! j    Pre
6 ~& `" {; h# t) p0 Q, q' B    Getthesourcecode
/ c1 G9 X. Y/ P1 E    $gitclonehttps://github.com/Bytom/bytom.git$GOPATH/src/github.com/bytom
9 q# ~% k4 `) F5 G; q    gitcheckout, K% V0 t9 m3 n! y4 Q
    $gitcheckoutdev) Y- b4 M2 ?- F" ~  I0 n2 w
    Whyneeddevbranch?Becauseyoucouldcalldecodetransactionapifromdevbranchandobtaintx_idandsomeinputsids.
' Q- R9 k2 t3 x3 `3 s. p1 w  h    Build8 s* ?- _5 ]; y5 u7 v
    $cd$GOPATH/src/github.com/bytom& B6 N# _& ]  l* |" Z  o
    $makebytomd#buildbytomd( Q, R2 r4 E6 }: o9 U8 \! a
    $makebytomcli#buildbytomcli* i! |% j$ j$ ^  Z
    Whensuccessfullybuildingtheproject,thebytomandbytomclibinaryshouldbepresentincmd/bytomdandcmd/bytomclidirectory,respectively.
  x3 ?  e& A2 U  V/ E    Initialize8 v, ]% b" W8 n/ M' A! U! L
    Firstofall,initializethenode:" c' L1 K: W( \4 t* U
    $cd./cmd/bytomd
; A% p5 w8 H3 L. c! D5 \6 @    $./bytomdinit--chain_idsolonet, f, z' v$ w; p- b
    launch7 z( [# V, {' A/ {( k( m
    $./bytomdnode--mining. Y3 L: G! v  Y" u
    Usage! l* \  P8 Y& i: p' B
    Buildjar
' Q% g3 A0 s' v# l2 B3 J. r! d7 e6 z& L5 Z
    firstgetsourcecode
2 P  ]# F9 h( E8 e; O7 y  E    gitclonehttps://github.com/successli/tx_signer.git9 P# h% B. y0 k
    getjarpackage
8 I/ }7 h8 V) I" ]& g6 n    $mvnassembly:assembly-Dmaven.test.skip=true
! u: `$ P5 m. x    Youcangetajarwithdependencies,andyoucanuseitinyourproject.# u" O6 d, c  N* M6 Z
  w1 G" W, o0 M# I/ {; z! r# e( c( ~
    Testcases
, x7 F4 f" b! K  l  {0 p) X/ ^    Need3Parameters:$ W( S, E, W+ x; y0 w0 s% f( |' k
    PrivateKeysArray5 c# E# P+ j9 u1 m( R: u5 p
    TemplateObject3 o" o1 M2 K8 V9 c& w" x/ M6 U
    AftercallbuildtransactionapireturnaTemplatejsonobject.buildtransactionapi% u5 {3 X( |1 `/ k) r8 q
    usebytomjavasdkreturnaTemplateobject.
3 _- d" c$ E4 |3 `! Q. `    RawTransaction
" y) o- f+ P, j" Z3 A# L    calldecoderaw-transactionapifromdevbranch.decoderaw-transactionapi
' d" h7 _7 _% ?1 e: u    Callmethod:
: L% b/ f% {3 R2 J5 S* L2 {4 I# t2 H    //returnaTemplateobjectsignedofflinebasically.
# q$ P5 s1 i, C+ w    Templateresult=signatures.generateSignatures(privates,template,rawTransaction);: z0 O; A5 N  ?9 Y* [0 }
    //useresult'sraw_transactioncallsigntransactionapitobuildanotherdatabutnotneedpasswordorprivatekey.  v/ d9 a% k2 C. P% P2 F
    Single-keyExample:5 o5 ^/ ~4 B# E$ I2 i
    @Test$ p+ y/ J3 m" L, b9 Y% M# l
    //使用SDK来构造Template对象参数,单签: {8 R, Q" |( T+ ]8 R* H8 S3 z
    publicvoidtestSignSingleKey()throwsBytomException{
" u9 }8 t/ d- ^    Clientclient=Client.generateClient();
& w9 b4 w7 D9 z  u% h    Stringasset_id="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";' X$ ^4 L; T! }
    Stringaddress="sm1qvyus3s5d7jv782syuqe3qrh65fx23lgpzf33em";
" h" W6 A% l' o$ U- i6 m4 h: W    //buildtransactionobtainaTemplateobject) t& l9 |+ ^) B6 ~5 W3 V3 @" |
    Templatetemplate=newTransaction.Builder()* f" A4 j. F4 b3 y/ i2 A' _
    .addAction(
6 D- q. M; `+ N" c2 N    newTransaction.Action.SpendFromAccount()
, p% v7 C# _+ t1 y    .setAccountId("0G0NLBNU00A02")! O; y! T  L( D* l$ z
    .setAssetId(asset_id)8 o$ C( Y6 {) r, \( Z
    .setAmount(40000000)
$ L! R* R& i# @& Q    )+ Y7 D8 {& h' R' T+ w
    .addAction(" _$ T% {0 H. o
    newTransaction.Action.SpendFromAccount()
% H9 ~4 A/ I- J/ s' W: K/ R    .setAccountId("0G0NLBNU00A02")
7 z) j! w- K; f# w7 I    .setAssetId(asset_id)
) i! V7 A9 }0 ?) [: m- [    .setAmount(300000000)/ u1 S# a/ M% @/ J! f
    )
6 @" U$ t4 s; Z, a# k    .addAction(9 z5 v* {! I' _" w3 Z" }
    newTransaction.Action.ControlWithAddress()
  M/ p/ }! D2 \4 B; Y    .setAddress(address)4 p8 A  X1 c' R7 u9 A+ N
    .setAssetId(asset_id)' O# @! @  c. {/ ~3 p- \! d
    .setAmount(30000000)
; ?8 x3 B& a: {    ).build(client);
& @- H& u- |& w/ m3 }    logger.info("template:"+template.toJson());
( Q: A% o0 O3 C6 L    //useTemplateobject'sraw_transactionidtodecoderaw_transactionobtainaRawTransactionobject
% O+ Z  h5 A* z8 h+ [    RawTransactiondecodedTx=RawTransaction.decode(client,template.rawTransaction);
$ w9 `  s' U* Y    logger.info("decodeTx:"+decodedTx.toJson());/ C( T2 E: u2 F0 P! ~- e1 w
    //needaprivatekeyarray
. H/ X0 Q4 q3 N    String[]privateKeys=newString[]{"10fdbc41a4d3b8e5a0f50dd3905c1660e7476d4db3dbd9454fa4347500a633531c487e8174ffc0cfa76c3be6833111a9b8cd94446e37a76ee18bb21a7d6ea66b"};8 o  @4 C% a$ D# J% ?5 X% q: E
    logger.info("privatekey:"+privateKeys[0]);, V% T% I3 ]  D0 i- l- p
    //callofflinesignmethodtoobtainabasicofflinesignedtemplate6 Q/ V: `& F* z; }- ], [
    Signaturessignatures=newSignaturesImpl();
" G) m) M' I1 e) r    TemplatebasicSigned=signatures.generateSignatures(privateKeys,template,decodedTx);- X, }3 h) o* t/ v8 [; Z; ?
    logger.info("basicsignedraw:"+basicSigned.toJson());. L3 m! g' [0 t+ i5 c3 d2 R
    //callsigntransactionapitocalculatewholeraw_transactionid
8 z) K- i) k! p+ G! T  n4 O+ n    //signpasswordisNoneoranotherrandomString
- w, e( l) \4 v: ^- @7 h: P5 Y    Templateresult=newTransaction.SignerBuilder().sign(client,
( ^- E) v! }. r    basicSigned,"");
0 s& }* ?2 Q7 c. b1 Y4 ?    logger.info("resultraw_transaction:"+result.toJson());: j" \& X. l* Q
    //successtosubmittransaction
5 i- t# Z0 O; a2 l    }
% F+ o5 R9 M/ A9 C    Multi-keysExample:% P5 `8 |  q6 X3 C9 b
    Needanaccounthastwoormorekeys.
; G( [" [. Z! ]3 G' y4 p3 v8 r' L/ q    @Test
; {) P) G6 M+ d$ i& U/ Y    //使用SDK来构造Template对象参数,多签
8 P% A: _6 O/ g$ z    publicvoidtestSignMultiKeys()throwsBytomException{7 ^8 u4 @$ E1 P! n5 i# A
    Clientclient=Client.generateClient();, S& e, \: d' Z0 ~, X  j& O
    Stringasset_id="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";* t; v7 P) h: J% a
    Stringaddress="sm1qvyus3s5d7jv782syuqe3qrh65fx23lgpzf33em";! q3 m$ A' E' |
    //buildtransactionobtainaTemplateobject+ R1 {7 R% Q: A( B& p
    //account0G1RPP6OG0A06hastwokeys
9 l; I7 I4 [0 }" H  x& p9 J    Templatetemplate=newTransaction.Builder()3 W! g% G% A: R- J8 S
    .setTtl(10)- W4 o/ T9 `1 p, M7 E* g. P8 D
    .addAction(- q- |# Q3 i) l: P1 X
    newTransaction.Action.SpendFromAccount()
9 {* t, u( D: d5 Q5 W: G; J    .setAccountId("0G1RPP6OG0A06"): N+ G/ A9 \9 F6 |4 r
    .setAssetId(asset_id)/ w; Y9 I$ x( ?
    .setAmount(40000000)% ]/ y1 I& B3 u5 X
    )6 i+ O6 E& Y$ z0 p' N+ v7 z1 Q& |
    .addAction(
3 c3 `! S2 H6 c0 R    newTransaction.Action.SpendFromAccount()  V; m2 x! K4 u& p  e
    .setAccountId("0G1RPP6OG0A06")! T) i5 p! b5 R) C4 I7 ~5 t
    .setAssetId(asset_id)9 S, |% m) g6 J
    .setAmount(300000000)
) P1 `2 K% H* Z: q! O    )
+ H  I5 B/ K& @) F2 E& {- A    .addAction(. C: |( z" o2 `& F- S2 ]
    newTransaction.Action.ControlWithAddress()
: I) f7 y& [0 D. u8 G- }    .setAddress(address)6 X4 Z! m: ^: m: ?
    .setAssetId(asset_id)6 q9 N/ {" g" M* x  w) R- @
    .setAmount(30000000)
+ g5 L$ M& P) n4 U& F* [    ).build(client);
; N; g! d2 V* Y+ A6 U* d    logger.info("template:"+template.toJson());
; E& \  R0 V1 b- J    //useTemplateobject'sraw_transactionidtodecoderaw_transactionobtainaRawTransactionobject' l# D( D" ^, U# F" b* D
    RawTransactiondecodedTx=RawTransaction.decode(client,template.rawTransaction);
( b: U( c5 v, W; `" z2 Q) B3 \    logger.info("decodeTx:"+decodedTx.toJson());5 l* ?0 ?* o1 K/ X
    //needaprivatekeyarray
% ^8 C* t; M1 \) }& }    String[]privateKeys=newString[]{"08bdbd6c22856c5747c930f64d0e5d58ded17c4473910c6c0c3f94e485833a436247976253c8e29e961041ad8dfad9309744255364323163837cbef2483b4f67",  I% q1 {4 g+ F4 z3 B
    "40c821f736f60805ad59b1fea158762fa6355e258601dfb49dda6f672092ae5adf072d5cab2ceaaa0d68dd3fe7fa04869d95afed8c20069f446a338576901e1b"};
# A4 X& L  q5 k1 M    logger.info("privatekey1:"+privateKeys[0]);! |% T+ ^. j$ s$ _. q5 Y; d! I
    logger.info("privatekey2:"+privateKeys[1]);
. n8 T* @3 @% X, O/ q    //callofflinesignmethodtoobtainabasicofflinesignedtemplate5 W- r0 u* g; Q# B: P$ f
    Signaturessignatures=newSignaturesImpl();
) e4 g; ]0 Z" T- ]  G6 G    TemplatebasicSigned=signatures.generateSignatures(privateKeys,template,decodedTx);% F# _) Z, x, D: k- X4 P
    logger.info("basicsignedraw:"+basicSigned.toJson());
* w6 b- v3 X- ?5 ]    //callsigntransactionapitocalculatewholeraw_transactionid, D7 B9 i0 B( b0 X
    //signpasswordisNoneoranotherrandomString* l9 k. w; z1 y1 A$ c' K
    Templateresult=newTransaction.SignerBuilder().sign(client,
- @  c$ k+ V3 P8 c1 s# ~- G2 U8 W    basicSigned,"");
4 T# `: t/ ~% _: `0 }    logger.info("resultraw_transaction:"+result.toJson());
) ], |1 w) _. o1 W    //successtosubmittransaction
: o. [) M' K) V' |$ o( L9 }    }: q& w, a& {1 R0 s2 [9 U
    Multi-keysandMulti-inputsExample:  Y! ?" y* ^1 Q8 P
    @Test
# c  X$ w6 _$ r: p. p! N% }3 K3 S    //使用SDK来构造Template对象参数,多签,多输入/ K1 d: h; f& W' k5 _9 p
    publicvoidtestSignMultiKeysMultiInputs()throwsBytomException{2 L8 j1 B$ Q9 a9 F% E- v3 O
    Clientclient=Client.generateClient();2 {& b0 k% P# K2 B$ ]6 r) p3 d1 X; f
    Stringasset_id="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
3 Z8 J- W) v. @) t3 y5 y    Stringaddress="sm1qvyus3s5d7jv782syuqe3qrh65fx23lgpzf33em";
' H1 ?; H7 H  D: t1 f7 P% B8 R    //buildtransactionobtainaTemplateobject
; n6 X3 Y: L  e# c' j    Templatetemplate=newTransaction.Builder()- s2 z% I9 I4 t2 @( K
    .setTtl(10)+ C( i6 R2 q( q0 Y4 u% x8 L
    //1input6 a; d9 T6 a4 B; ^0 m8 Q
    .addAction(8 J* E  R: Y0 c/ E. n) a, _% m" p" }
    newTransaction.Action.SpendFromAccount()
. b) y% n8 Q% N! |    .setAccountId("0G1RPP6OG0A06")//Multi-keysaccount% a3 i( M* n  v  _! {. D% I
    .setAssetId(asset_id)
0 V6 S* l3 K9 R; y8 Y$ b) R" O    .setAmount(40000000)
) _/ b$ x; A/ T# V! |" q    )7 ?) G! x" N/ ~7 j2 X. Y' ~8 ?
    .addAction(5 l* X; F& L# |0 X! J& Q
    newTransaction.Action.SpendFromAccount()
8 L3 s' G/ U  O5 ~5 `    .setAccountId("0G1RPP6OG0A06")) b+ a* s8 _9 w$ N9 w( e, `
    .setAssetId(asset_id)- x! j/ ~. b/ T8 E/ P& w$ ~
    .setAmount(300000000)2 b* ~7 y& B: C3 q- H" A3 X
    )//2input
# [/ E8 m3 M# R: M, O    .addAction(' ?( Q/ Z# l+ I( Y0 l# }
    newTransaction.Action.SpendFromAccount()
, z. |& I3 X4 }$ n3 C    .setAccountId("0G1Q6V1P00A02")//Multi-keysaccount; i; B9 o/ a& I0 ?9 F- z
    .setAssetId(asset_id)5 q+ ?4 \% E: n* h! Y# |" ?
    .setAmount(40000000)
# f% N" G5 i4 ~* k  i# L5 w  v! `    )  C2 U) t+ n. ~' s3 ~/ Y# Q  @# q
    .addAction(
5 [+ T8 z: {8 A$ S3 d; r( e    newTransaction.Action.SpendFromAccount()" m/ Q% |- N. ?$ _' h9 ~
    .setAccountId("0G1Q6V1P00A02")
" w% O8 D/ i0 I    .setAssetId(asset_id)* `* k1 [$ r6 N& }
    .setAmount(300000000)
% I1 d, H" ?4 U8 w" Q    )
& N+ U6 g% @6 ~& M    .addAction(
+ L3 ]6 ~& x5 t1 f6 j    newTransaction.Action.ControlWithAddress()
1 n/ I1 M' T# H7 L6 w: ]: r' p    .setAddress(address)
& b* z, L7 O6 j/ w6 P    .setAssetId(asset_id)
$ d1 Z3 n# e6 |! }" ^, @, c( ]    .setAmount(60000000)
8 U& _: b1 m6 e2 W    ).build(client);
5 ?, J; J( y( N1 `9 Y: H9 X' r    logger.info("template:"+template.toJson());, j, E. R  Z# P- p7 ]
    //useTemplateobject'sraw_transactionidtodecoderaw_transactionobtainaRawTransactionobject
) H. m% C" h! ?5 D, A. q7 y$ N    RawTransactiondecodedTx=RawTransaction.decode(client,template.rawTransaction);
- j; W. t7 f& i5 g" m. T6 m    logger.info("decodeTx:"+decodedTx.toJson());! `, U* t  d; L* L: l% N* H5 V% D
    //needaprivatekeyarray; D8 x7 C* Y1 Q& Y+ B% {
    String[]privateKeys=newString[]{"08bdbd6c22856c5747c930f64d0e5d58ded17c4473910c6c0c3f94e485833a436247976253c8e29e961041ad8dfad9309744255364323163837cbef2483b4f67",* G1 p8 Y: H2 a* U" r& W$ d4 m
    "40c821f736f60805ad59b1fea158762fa6355e258601dfb49dda6f672092ae5adf072d5cab2ceaaa0d68dd3fe7fa04869d95afed8c20069f446a338576901e1b",/ F5 P" v, \4 o6 P: \. L; @
    "08bdbd6c22856c5747c930f64d0e5d58ded17c4473910c6c0c3f94e485833a436247976253c8e29e961041ad8dfad9309744255364323163837cbef2483b4f67"};
9 Y. F8 d3 j0 j7 d2 Y    logger.info("privatekey1:"+privateKeys[0]);
3 h6 z" i# F$ u) P, R    logger.info("privatekey2:"+privateKeys[1]);
- A  a% ^& U. l! v9 t. w3 k. N    //callofflinesignmethodtoobtainabasicofflinesignedtemplate
% {- _( P5 v* J9 ~! k    Signaturessignatures=newSignaturesImpl();. b, c- l* k/ E6 c  K
    TemplatebasicSigned=signatures.generateSignatures(privateKeys,template,decodedTx);- r* U+ B0 ^5 L/ K5 ^$ {* g$ h
    logger.info("basicsignedraw:"+basicSigned.toJson());6 m, G6 z6 D7 Q! G# W; @- n" ?; j
    //callsigntransactionapitocalculatewholeraw_transactionid
& W' @/ Q% D4 b$ a" q$ l# t    //signpasswordisNoneoranotherrandomString
( F  U' i: I% i, E" m    Templateresult=newTransaction.SignerBuilder().sign(client,% n) d; B4 P( m7 y1 u% d$ L
    basicSigned,"");1 Y5 @) o  G% P2 n' R9 d/ W
    logger.info("resultraw_transaction:"+result.toJson());: J/ c* E9 j3 h2 M& d
    //successtosubmittransaction% h( U2 D3 z. W1 o- e$ C3 F
    }
9 o9 j. v: a& E1 ]0 M" N. _
' c$ }# Q/ \* b" F1 [
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

yuan081608 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2