Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

比原链Java版本离线签名

yuan081608
108 0 0
    tx_signer
! R. z  Z, F7 @3 Y! F6 |2 _    Javaimplementationofsigningtransactionofflinetobytomd.
3 E( i9 A" Y/ O! r% `0 g    Pre
* |- U9 v% {' ?# [1 x, o9 f1 l4 J    Getthesourcecode
. ~3 y: ^. [5 S0 S: z& D& r! I$ a    $gitclonehttps://github.com/Bytom/bytom.git$GOPATH/src/github.com/bytom9 ^4 S3 K* {" ^' g  M: d
    gitcheckout
6 h: {. N6 o* V, G    $gitcheckoutdev$ m9 G* I" r5 i% y& s. @
    Whyneeddevbranch?Becauseyoucouldcalldecodetransactionapifromdevbranchandobtaintx_idandsomeinputsids.
3 V( Y$ w" B5 V' l+ U3 i6 T    Build
- L% s3 s# e" j9 j8 }9 N' y1 U. B    $cd$GOPATH/src/github.com/bytom
) v# l2 r+ F! u" y% s1 f; w3 I4 [- J3 W    $makebytomd#buildbytomd# {# J& y8 s( `- }, u
    $makebytomcli#buildbytomcli
# L5 P5 Y4 X( N  {9 E3 U$ [    Whensuccessfullybuildingtheproject,thebytomandbytomclibinaryshouldbepresentincmd/bytomdandcmd/bytomclidirectory,respectively.
- [" P! A7 S2 a. ^' T" c    Initialize  O; t' K* ?: ?8 s& m
    Firstofall,initializethenode:
9 Y* Q8 C" M; L& u3 P8 w    $cd./cmd/bytomd
) d8 T9 H4 ]0 Z  q% [- S    $./bytomdinit--chain_idsolonet
; S9 a2 X1 f2 ~( Y$ I    launch
7 `) g" o/ Z2 |6 F; p9 y9 r4 k: Z    $./bytomdnode--mining5 X& w! {4 N, e4 u6 ^
    Usage
1 S  c5 ~) B$ w, x; s$ P) v    Buildjar
- N9 M! N9 ^. o6 D3 b
; V3 l/ y3 e, A4 y5 }6 y5 S8 {    firstgetsourcecode5 G" y" R( j2 T7 h" c. p1 r
    gitclonehttps://github.com/successli/tx_signer.git9 ?2 [% L/ J9 r
    getjarpackage- J8 u0 E; A) u$ ?3 Z
    $mvnassembly:assembly-Dmaven.test.skip=true( B1 x" p1 ~2 Y% W7 w9 Q& y; _2 l  Y
    Youcangetajarwithdependencies,andyoucanuseitinyourproject.
- C3 R) h( U! ], S! f0 N- P
* X: _, v0 ^6 m5 P& _    Testcases
8 E5 f: h& s; h    Need3Parameters:, N+ Z/ l7 m8 Q  G+ B0 R/ s
    PrivateKeysArray
0 p' A6 ?9 k. A, z. e    TemplateObject7 W, r+ m: `, r2 F
    AftercallbuildtransactionapireturnaTemplatejsonobject.buildtransactionapi3 z+ {5 A8 w- Z( O; s. p% d
    usebytomjavasdkreturnaTemplateobject.2 ^# A; {# v' z4 X( M& o
    RawTransaction- s, z1 u9 a$ ^
    calldecoderaw-transactionapifromdevbranch.decoderaw-transactionapi6 i; h  \+ e) a  ?
    Callmethod:* B& J, _$ E* a
    //returnaTemplateobjectsignedofflinebasically.
# d5 W; c, g, W' H$ i3 R    Templateresult=signatures.generateSignatures(privates,template,rawTransaction);9 c' j( n( ~, U) o# K+ `' R: d
    //useresult'sraw_transactioncallsigntransactionapitobuildanotherdatabutnotneedpasswordorprivatekey.: K! y% r$ q2 }
    Single-keyExample:3 J, ?& i; K1 {' n% ]1 E1 K
    @Test6 ^$ F" @9 `% s" {2 t
    //使用SDK来构造Template对象参数,单签
. W6 a; }( ?6 n9 _9 Y5 m    publicvoidtestSignSingleKey()throwsBytomException{; m; P& \3 }$ ~0 i% F# H8 `
    Clientclient=Client.generateClient();
" d) d4 r9 s# }4 R% M    Stringasset_id="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";1 `2 l' U6 j/ @) _3 q' t4 @4 {6 {
    Stringaddress="sm1qvyus3s5d7jv782syuqe3qrh65fx23lgpzf33em";5 L! b, f7 Q3 \# B0 d# [
    //buildtransactionobtainaTemplateobject3 Z( }1 L0 w' x$ U# z
    Templatetemplate=newTransaction.Builder()0 e8 u6 h( V5 p+ f' M9 z
    .addAction(
2 X& Q) O7 O5 c! Y+ |* x# T& _    newTransaction.Action.SpendFromAccount()
/ `& ?+ ^& s8 B    .setAccountId("0G0NLBNU00A02"): @. h  T; l2 w" ~& N
    .setAssetId(asset_id)
# K) r, r: ?5 N" g% _    .setAmount(40000000)- V$ k  h3 o7 h" f. E# `
    )
/ t. j3 p, K4 l, Y" v- ?    .addAction(: S) ?# ~0 V% I( f. l# D7 w
    newTransaction.Action.SpendFromAccount()
' F  W3 V6 E5 k/ J+ V8 S& M    .setAccountId("0G0NLBNU00A02")
( Z$ a* {& _8 Q! L- G; @3 e& I    .setAssetId(asset_id)8 z5 `- ]2 G% z6 ?; Z8 J
    .setAmount(300000000)# z, N$ a5 l0 K3 C
    )6 j' E* A4 p, ^% Q% u
    .addAction(
6 ~7 s0 O0 ^' a" ~9 |; f! S    newTransaction.Action.ControlWithAddress()3 \! l, q0 S( {1 u- O" M! C
    .setAddress(address)& j. `7 H3 M, H% l  I0 X
    .setAssetId(asset_id): z  F9 f) K' {8 C6 O8 Z
    .setAmount(30000000)
# S- u8 u) v& D/ x* O    ).build(client);
* \; }( I' p8 |5 w6 {: v    logger.info("template:"+template.toJson());
# L7 D  Q& h$ F    //useTemplateobject'sraw_transactionidtodecoderaw_transactionobtainaRawTransactionobject
* W2 z& u4 [! g7 }- o0 A    RawTransactiondecodedTx=RawTransaction.decode(client,template.rawTransaction);
" \9 M1 J. c  [* |* Z1 ^9 c    logger.info("decodeTx:"+decodedTx.toJson());8 w; H* C$ Q0 G
    //needaprivatekeyarray
2 d8 }* R8 x4 I4 g9 O; Q    String[]privateKeys=newString[]{"10fdbc41a4d3b8e5a0f50dd3905c1660e7476d4db3dbd9454fa4347500a633531c487e8174ffc0cfa76c3be6833111a9b8cd94446e37a76ee18bb21a7d6ea66b"};" o: a  ]/ {, f$ Q5 a- L$ _  V/ n
    logger.info("privatekey:"+privateKeys[0]);5 [- L, t- N  U/ p. k8 N
    //callofflinesignmethodtoobtainabasicofflinesignedtemplate
+ b. D5 y) _  f8 C/ c4 w; z    Signaturessignatures=newSignaturesImpl();
8 L3 a8 Q1 G( i4 m$ e$ p    TemplatebasicSigned=signatures.generateSignatures(privateKeys,template,decodedTx);
3 l  C  n; A# z7 _% c    logger.info("basicsignedraw:"+basicSigned.toJson());# q* _. m2 O* e- s! B( F
    //callsigntransactionapitocalculatewholeraw_transactionid) c1 H* _7 c$ z
    //signpasswordisNoneoranotherrandomString. p# P+ t$ p: F( F$ ]0 A' i
    Templateresult=newTransaction.SignerBuilder().sign(client,
; E- Q) o5 `% f7 e    basicSigned,"");
% P+ g" t3 C& z8 g    logger.info("resultraw_transaction:"+result.toJson());
% Z8 k, l3 d1 I/ p% p- W, d( B    //successtosubmittransaction0 p9 T: @+ c, E; Y' u* C+ G* c
    }
+ J: q1 J- k" ?- ^    Multi-keysExample:! M7 }) F2 z' Z
    Needanaccounthastwoormorekeys.
' w: ]3 i! ?+ f2 `9 u2 ?3 D    @Test
3 N7 R% A: ~) _% l/ J2 s    //使用SDK来构造Template对象参数,多签9 ?. o4 T3 y) ~- [- s" ]$ P
    publicvoidtestSignMultiKeys()throwsBytomException{. a5 d: D  K. o) w3 O
    Clientclient=Client.generateClient();
. A2 D- r3 y6 \6 X3 ?    Stringasset_id="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";5 E5 [1 O* l/ D* F2 [3 I
    Stringaddress="sm1qvyus3s5d7jv782syuqe3qrh65fx23lgpzf33em";
7 l! |) w1 ]1 F    //buildtransactionobtainaTemplateobject  W* o/ R6 H( p
    //account0G1RPP6OG0A06hastwokeys
' E! v5 G! n9 @8 [2 ~) j1 ?    Templatetemplate=newTransaction.Builder()/ h1 G6 c5 N) Q' W" ]' I8 m) J6 b
    .setTtl(10)
4 [& Y  [! N( w/ U& V    .addAction(
% p4 l# v5 @9 k3 w. b, a& ]    newTransaction.Action.SpendFromAccount()
6 Z4 X* _/ ?6 y/ T! x7 g& s# a+ @    .setAccountId("0G1RPP6OG0A06")
/ W$ G% I; B. U: s: F    .setAssetId(asset_id)* o4 A  D( d! D5 p
    .setAmount(40000000)$ f- `; |! R9 E% `# T: r& f7 c1 e
    )
3 _' Q- K) [& N, y# ?# ^0 b1 \    .addAction(, j$ f( Q% I; b; s
    newTransaction.Action.SpendFromAccount()
5 g. |4 `" g' p9 ~' `9 s    .setAccountId("0G1RPP6OG0A06")
$ S. k) g6 t, T: n9 h    .setAssetId(asset_id)+ Q( M! `9 S$ i& S, G2 e; h
    .setAmount(300000000)
& h- g6 c- s) a4 W+ Y# C& D5 A  s3 |    )
- U7 @) t, u8 f; o$ _5 X& z    .addAction(
; z" [% F4 T% |8 h9 A/ C    newTransaction.Action.ControlWithAddress()
# h' i, i6 z4 t" f& }4 }    .setAddress(address)
2 h6 \8 A: P( C% S/ M" Y' p, `  P! x    .setAssetId(asset_id): l5 k5 Q# I. {9 |) t3 b0 @" N
    .setAmount(30000000)" ?! H$ V; `, e* c$ ]
    ).build(client);/ m/ E7 u, K0 ^) ]! F2 q* N
    logger.info("template:"+template.toJson());7 F! w; |% V3 c7 x+ ^. [9 k
    //useTemplateobject'sraw_transactionidtodecoderaw_transactionobtainaRawTransactionobject5 q3 X4 U$ r  h% v
    RawTransactiondecodedTx=RawTransaction.decode(client,template.rawTransaction);
3 S' X7 w2 ~! d( ^; P    logger.info("decodeTx:"+decodedTx.toJson());  x# G4 T9 Y& P7 j0 i" p) j, i
    //needaprivatekeyarray$ n2 x2 k1 ?% d! |* A9 Q
    String[]privateKeys=newString[]{"08bdbd6c22856c5747c930f64d0e5d58ded17c4473910c6c0c3f94e485833a436247976253c8e29e961041ad8dfad9309744255364323163837cbef2483b4f67",
4 Q9 u) P$ N% Q  i) m2 R' a    "40c821f736f60805ad59b1fea158762fa6355e258601dfb49dda6f672092ae5adf072d5cab2ceaaa0d68dd3fe7fa04869d95afed8c20069f446a338576901e1b"};
  M6 N# ]. W3 t2 K! j2 j    logger.info("privatekey1:"+privateKeys[0]);8 P. K2 l9 Q. G5 Z
    logger.info("privatekey2:"+privateKeys[1]);
* a2 p3 L0 s2 K/ R8 q    //callofflinesignmethodtoobtainabasicofflinesignedtemplate
6 q' f& ^* S' E- N# a( w    Signaturessignatures=newSignaturesImpl();
, a* M8 H0 j0 f7 h) n1 H    TemplatebasicSigned=signatures.generateSignatures(privateKeys,template,decodedTx);
2 c- N  {. `) H$ N  E% ~9 N    logger.info("basicsignedraw:"+basicSigned.toJson());/ Z% D8 N3 b' v  S
    //callsigntransactionapitocalculatewholeraw_transactionid
/ \3 E% K4 q' Z* s9 P: Y9 p    //signpasswordisNoneoranotherrandomString& @7 Z8 \0 f% M: m7 y/ @! a
    Templateresult=newTransaction.SignerBuilder().sign(client,; [8 K8 z7 N$ `
    basicSigned,"");9 {. X: @2 L9 b  U2 G
    logger.info("resultraw_transaction:"+result.toJson());
& ~$ L; ?" b: C' x    //successtosubmittransaction
& t2 x+ m: P2 z    }- @1 t' O/ X, M5 M) Y  ^
    Multi-keysandMulti-inputsExample:
: u. n0 z' C$ c1 P    @Test$ n* O5 [) i0 c
    //使用SDK来构造Template对象参数,多签,多输入
, `6 b* P2 P3 e( G; x0 L7 `    publicvoidtestSignMultiKeysMultiInputs()throwsBytomException{7 I9 [, H3 T" `4 g3 t' ~3 m$ c- e
    Clientclient=Client.generateClient();
4 t& i" _2 D5 u" ?    Stringasset_id="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
9 y0 X; }8 O' i7 _7 _! [    Stringaddress="sm1qvyus3s5d7jv782syuqe3qrh65fx23lgpzf33em";
1 }2 H) T$ {2 \( R    //buildtransactionobtainaTemplateobject! Y" l1 t  p+ z6 t/ Y# s" X3 Z; H
    Templatetemplate=newTransaction.Builder()/ `. Y( y4 O+ p& b4 d3 r
    .setTtl(10)) Y" `7 `( j" |6 @  m: f
    //1input4 A' X/ r0 v- y, Z. ]. P
    .addAction(/ h: {$ t3 Y5 W# `' D! P' \0 G- p
    newTransaction.Action.SpendFromAccount()1 T- @( u) J& t+ f
    .setAccountId("0G1RPP6OG0A06")//Multi-keysaccount
4 X. g, c. e' }0 R7 Y    .setAssetId(asset_id)7 H* m3 y4 N2 J) F5 _
    .setAmount(40000000)  @' V6 g4 U1 w  Y
    )  g) Z2 t; Y9 @* }3 S* q" @
    .addAction(
# Z$ q  }. l0 N2 K    newTransaction.Action.SpendFromAccount()8 {! b3 S( g9 v1 y0 f- g: E
    .setAccountId("0G1RPP6OG0A06")
4 D# D. ~' }( b$ f    .setAssetId(asset_id)+ o- S( m: h& h! }0 n- K
    .setAmount(300000000)
) F/ c- G1 t% ^    )//2input% D* ]6 u% I( Q3 g, t
    .addAction(
* i2 {; v, c2 o/ u  r    newTransaction.Action.SpendFromAccount()
3 c$ E7 q0 s8 v    .setAccountId("0G1Q6V1P00A02")//Multi-keysaccount* f" ]) K+ P% h7 }  {
    .setAssetId(asset_id)7 M, n9 D. P, Z% F7 |
    .setAmount(40000000)
; s# v+ k5 d& h6 @    )
, E- K7 E" f8 z! a6 E    .addAction(0 I. o. Q8 i* O* P5 Z8 _
    newTransaction.Action.SpendFromAccount(); p7 ]  u* z3 P# {
    .setAccountId("0G1Q6V1P00A02")8 z1 z2 E& g0 A0 W
    .setAssetId(asset_id)4 g% ~/ I1 A1 h4 s$ [- u" @
    .setAmount(300000000)4 m4 W5 h3 c* _, C! S6 J
    )
) |; @; A3 x8 U" A7 x! l    .addAction(
' y' i( a& t6 D0 C5 `& D# `: `    newTransaction.Action.ControlWithAddress()1 Q% ]% V" x/ R/ Y
    .setAddress(address)
' p& h* z: `5 e    .setAssetId(asset_id)7 }+ _: V6 q4 P+ J+ H: Z4 \) ?7 |+ v
    .setAmount(60000000)9 |/ h) b! C' `
    ).build(client);' b# k5 C9 c5 W! X- r) ~
    logger.info("template:"+template.toJson());! t! Q: x6 K, H$ J3 i! L
    //useTemplateobject'sraw_transactionidtodecoderaw_transactionobtainaRawTransactionobject
) h5 A9 _. A% p0 l, G8 ?; T- k    RawTransactiondecodedTx=RawTransaction.decode(client,template.rawTransaction);1 n1 [5 q0 y/ U2 C/ r
    logger.info("decodeTx:"+decodedTx.toJson());  v) y: ]8 h0 B+ O/ b3 ?! ]& [$ P
    //needaprivatekeyarray* c" z) C  x* W
    String[]privateKeys=newString[]{"08bdbd6c22856c5747c930f64d0e5d58ded17c4473910c6c0c3f94e485833a436247976253c8e29e961041ad8dfad9309744255364323163837cbef2483b4f67",& E, D" ~" r8 o6 b$ U
    "40c821f736f60805ad59b1fea158762fa6355e258601dfb49dda6f672092ae5adf072d5cab2ceaaa0d68dd3fe7fa04869d95afed8c20069f446a338576901e1b",
* B1 G* g+ M9 p+ k& m- |    "08bdbd6c22856c5747c930f64d0e5d58ded17c4473910c6c0c3f94e485833a436247976253c8e29e961041ad8dfad9309744255364323163837cbef2483b4f67"};) c# c! |( @) K1 T/ A- J
    logger.info("privatekey1:"+privateKeys[0]);. u" A* h% }: v" Y
    logger.info("privatekey2:"+privateKeys[1]);
; g, i) j$ H- I    //callofflinesignmethodtoobtainabasicofflinesignedtemplate) s6 H# Q5 h9 C, J  J% J, [
    Signaturessignatures=newSignaturesImpl();
8 w4 x! h# o* u0 I8 a% i4 P    TemplatebasicSigned=signatures.generateSignatures(privateKeys,template,decodedTx);
/ ]0 M- O0 J$ E) h6 a  q, D    logger.info("basicsignedraw:"+basicSigned.toJson());
# \! T0 G" L2 g( x. @% P    //callsigntransactionapitocalculatewholeraw_transactionid
5 e7 j$ O/ q9 n. g1 J$ |1 F    //signpasswordisNoneoranotherrandomString
% c1 X! u  i1 p+ i9 a" x. K    Templateresult=newTransaction.SignerBuilder().sign(client,) B7 r& v2 u/ K, E  x
    basicSigned,"");- K3 `! W0 _% K" R% H, k0 x
    logger.info("resultraw_transaction:"+result.toJson());
7 J( y. X. T( T) t; R: {    //successtosubmittransaction/ }5 @) ~1 D2 b& ]2 \7 G
    }
+ W+ @: W" w, }% H" I
$ y. f% S; E& R# b
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

yuan081608 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2