Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

比原链Java版本离线签名

yuan081608
110 0 0
    tx_signer
3 u: n5 X4 h7 O8 I# q    Javaimplementationofsigningtransactionofflinetobytomd.
* x7 p: \: A% b, N! I    Pre
6 [+ d4 K  M! i    Getthesourcecode" Q* @- t# w# @4 t6 L2 b- G
    $gitclonehttps://github.com/Bytom/bytom.git$GOPATH/src/github.com/bytom
) }2 l. U% `( J    gitcheckout
* h/ f" u1 T' d" p( u! n    $gitcheckoutdev* H8 F' R$ E5 |- e8 p7 T
    Whyneeddevbranch?Becauseyoucouldcalldecodetransactionapifromdevbranchandobtaintx_idandsomeinputsids.
8 x* O; [' q. u% |; b    Build1 b5 F6 {* W0 o) p" L
    $cd$GOPATH/src/github.com/bytom
) P. u" e# h; U    $makebytomd#buildbytomd9 N& _) ]* T* N
    $makebytomcli#buildbytomcli
# \/ o' q3 u/ p$ h& H' A9 H' E    Whensuccessfullybuildingtheproject,thebytomandbytomclibinaryshouldbepresentincmd/bytomdandcmd/bytomclidirectory,respectively.
% ]( w& d( C3 Y  u    Initialize
. x3 ^6 u4 t: J* i# `) i    Firstofall,initializethenode:8 v# G5 f; T) Y: ~! }5 g7 ^
    $cd./cmd/bytomd
7 }2 \- I( Q# p    $./bytomdinit--chain_idsolonet
' u% E: J4 G" q8 q    launch
) W% I) B2 a. p  |; A* q* K. D    $./bytomdnode--mining
$ v# z0 b( {: |1 f; T) M3 W    Usage
; s4 \- O' l3 c/ A    Buildjar
) A7 v9 Y7 b1 g/ \+ z9 I/ g- m- M) v+ h& Q% Q
    firstgetsourcecode/ F( Y  `# G# u4 D
    gitclonehttps://github.com/successli/tx_signer.git
6 b( V# e* [' Q8 S4 i9 x! y    getjarpackage
  R" ^* |. L; y* o+ j7 Z0 C& I    $mvnassembly:assembly-Dmaven.test.skip=true
& ^% w/ y# r) \8 _    Youcangetajarwithdependencies,andyoucanuseitinyourproject.
# u9 W; C* `; \' d, Q# c6 d. p6 D! W* N% I! s
    Testcases6 h6 Z* f5 Q' d, Y# A# c2 l8 [( p+ U
    Need3Parameters:
+ l; \. B0 d1 C$ N* ^, ]7 e4 y    PrivateKeysArray' N! d5 u" G1 ^
    TemplateObject2 P7 @2 R- Q) [8 k
    AftercallbuildtransactionapireturnaTemplatejsonobject.buildtransactionapi3 G$ r$ \! X' x7 y) E
    usebytomjavasdkreturnaTemplateobject.7 E7 s! k8 h/ w( ]; s1 [
    RawTransaction
9 v! X1 j8 O( s/ q' W4 ~" A! ]' c8 |    calldecoderaw-transactionapifromdevbranch.decoderaw-transactionapi
+ N+ H8 A4 u& o5 `& @& [    Callmethod:' m  L. w2 R1 M# D: {  B2 D
    //returnaTemplateobjectsignedofflinebasically." F5 D7 E# ~3 j4 ~9 e2 f
    Templateresult=signatures.generateSignatures(privates,template,rawTransaction);
. ~, N$ T6 c& P2 P    //useresult'sraw_transactioncallsigntransactionapitobuildanotherdatabutnotneedpasswordorprivatekey.; U# ]4 [  w% S
    Single-keyExample:
1 Y! h& `+ ^- v2 }2 m) o    @Test4 Z. g+ D6 V+ ~, [2 t) i7 U
    //使用SDK来构造Template对象参数,单签
# E5 q9 ]  G8 \9 t: i2 f/ Y    publicvoidtestSignSingleKey()throwsBytomException{
7 w* i+ o5 h& P) q7 p) c* v! i    Clientclient=Client.generateClient();
7 N2 t  k1 T. h" J. E3 S7 ^1 z$ K    Stringasset_id="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";2 F8 x5 a5 N% F, L, E. A
    Stringaddress="sm1qvyus3s5d7jv782syuqe3qrh65fx23lgpzf33em";
; @1 j1 V+ h6 I    //buildtransactionobtainaTemplateobject3 W2 b( j4 ]# e. w# O; Y1 ^
    Templatetemplate=newTransaction.Builder()& w$ m' V% P# w+ f! j& M/ R
    .addAction(; Q; [+ Y% C* |$ u3 \
    newTransaction.Action.SpendFromAccount()
) I5 s" }# f7 T, a+ H: p. W2 [    .setAccountId("0G0NLBNU00A02")
# o. r3 u4 B* w$ e! L    .setAssetId(asset_id)- [. _" E6 }  F# h
    .setAmount(40000000)
4 \; p) P" I' [& r4 A7 J    )5 ?9 u; ?9 f, O0 N( u
    .addAction(! ]- `- `3 E9 g
    newTransaction.Action.SpendFromAccount()
$ I4 V$ u5 S) K4 _    .setAccountId("0G0NLBNU00A02")
  P; ~; F4 C9 K. o7 S5 [5 M    .setAssetId(asset_id)
7 j7 U( g+ [( ^8 k6 l) t) m/ P7 z    .setAmount(300000000)# F( L/ y8 q( }) j% s% I
    )7 g8 b! e2 l/ z. w4 ]8 p7 s' n3 E
    .addAction(! a2 y7 q& O' `0 u/ |1 P
    newTransaction.Action.ControlWithAddress()# I7 ]! c2 {; _* D$ l
    .setAddress(address)
* \' ], I2 v, f1 i    .setAssetId(asset_id)5 c( n. V3 z; |, g$ b& i) Z
    .setAmount(30000000)
3 J" w( e6 U. }3 m/ ~- c/ }" p    ).build(client);2 G' S: j$ K+ @* Z" z
    logger.info("template:"+template.toJson());3 m0 u$ ?( R% f1 ~
    //useTemplateobject'sraw_transactionidtodecoderaw_transactionobtainaRawTransactionobject
1 j, M+ f- b0 v: {! Z( A8 R    RawTransactiondecodedTx=RawTransaction.decode(client,template.rawTransaction);" i+ R4 e0 E  H( p# V% N2 e
    logger.info("decodeTx:"+decodedTx.toJson());2 s% b3 k. |% b4 N6 G
    //needaprivatekeyarray% n. @/ q3 L; i7 y8 {
    String[]privateKeys=newString[]{"10fdbc41a4d3b8e5a0f50dd3905c1660e7476d4db3dbd9454fa4347500a633531c487e8174ffc0cfa76c3be6833111a9b8cd94446e37a76ee18bb21a7d6ea66b"};
' x2 R" e. ]% V! s+ T    logger.info("privatekey:"+privateKeys[0]);9 _/ p: K, M# g8 U
    //callofflinesignmethodtoobtainabasicofflinesignedtemplate% l! n; z7 y: |: y4 e
    Signaturessignatures=newSignaturesImpl();+ c; _* _! Y# b( p1 t8 d3 S
    TemplatebasicSigned=signatures.generateSignatures(privateKeys,template,decodedTx);( n! L5 P7 P" a$ k: A
    logger.info("basicsignedraw:"+basicSigned.toJson());
; |2 a# s  d- j4 s" e    //callsigntransactionapitocalculatewholeraw_transactionid
8 }0 l3 h7 x4 c    //signpasswordisNoneoranotherrandomString
1 Z+ E  N3 u: U# k, d    Templateresult=newTransaction.SignerBuilder().sign(client,
& p+ L* r! Y6 e6 |- D7 z5 J    basicSigned,"");+ U# D/ e3 k) T, L" b2 G( a
    logger.info("resultraw_transaction:"+result.toJson());* @; Y% `' y5 I4 C- P
    //successtosubmittransaction/ D; j2 x  X  P* F2 D. S
    }6 C+ t/ |+ E  V2 v, I
    Multi-keysExample:. U$ K- Y- U5 o: p! ?- T
    Needanaccounthastwoormorekeys.. x# J! D8 I6 ~( e) ]
    @Test) D/ V' C5 g  V
    //使用SDK来构造Template对象参数,多签" @1 s6 j& K! u8 t0 n
    publicvoidtestSignMultiKeys()throwsBytomException{7 n% N/ _) T, \9 u' p. H' [1 Z2 k
    Clientclient=Client.generateClient();
, ^! c9 j, i3 V$ Q    Stringasset_id="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";% i+ a9 k: H* C* r& @6 @7 _
    Stringaddress="sm1qvyus3s5d7jv782syuqe3qrh65fx23lgpzf33em";  E" c* s9 V1 h7 F( x$ v1 ~2 u* [
    //buildtransactionobtainaTemplateobject+ H; Z8 H2 z$ Q2 j$ ]4 `
    //account0G1RPP6OG0A06hastwokeys
  j# r* d3 V. Z5 z3 {    Templatetemplate=newTransaction.Builder()6 w' }2 I  [7 i$ o& o8 v6 P6 [7 U
    .setTtl(10)
; g, C! x. h- X- P7 w    .addAction(
2 p1 ?6 I2 [. M" Q+ k% w  h    newTransaction.Action.SpendFromAccount()4 J3 w  I0 J& l
    .setAccountId("0G1RPP6OG0A06")2 {3 E$ X: \$ j( i. C
    .setAssetId(asset_id)
' D' ?" j! g9 t' ]+ D5 T7 I    .setAmount(40000000)( Y* M7 ]5 o# L5 E
    )4 [1 M. [) H) d7 ]8 H$ }4 L; i
    .addAction(
& G) @6 X8 Y6 I% c+ O* W% ~    newTransaction.Action.SpendFromAccount()* l0 b$ K, b8 _0 _# b' ?
    .setAccountId("0G1RPP6OG0A06")) x& G  ~  L* a- n1 Z- v
    .setAssetId(asset_id)
3 v" n: \$ _" o5 w. F' Y    .setAmount(300000000)/ G) O+ @5 M, a" N  h2 j; R
    )
3 C" W$ z! O! x; l! S4 ^    .addAction(
- S1 ^8 T; m% }. V2 D    newTransaction.Action.ControlWithAddress()
% ~1 Z6 k+ F( {+ g8 T    .setAddress(address)' o$ e2 J) ~/ o% Y9 d* @9 A
    .setAssetId(asset_id)/ k) @! Y- D- x7 t1 R* I5 a$ f
    .setAmount(30000000), O4 E3 F- k  S: L1 j, |+ G
    ).build(client);
" t% f! l3 |7 y9 Q0 R    logger.info("template:"+template.toJson());6 ]! g( V$ G" K# {$ Z
    //useTemplateobject'sraw_transactionidtodecoderaw_transactionobtainaRawTransactionobject6 I% j' D, u7 A9 R2 ?/ ]) \
    RawTransactiondecodedTx=RawTransaction.decode(client,template.rawTransaction);
3 F6 X. z* [: ~- O7 J& Q    logger.info("decodeTx:"+decodedTx.toJson());
. |. k% w; F; F  b. O6 ^  B& V    //needaprivatekeyarray0 _; Q# U: D! O. `; Z: P
    String[]privateKeys=newString[]{"08bdbd6c22856c5747c930f64d0e5d58ded17c4473910c6c0c3f94e485833a436247976253c8e29e961041ad8dfad9309744255364323163837cbef2483b4f67",
3 n3 l( `5 J& T2 _7 b    "40c821f736f60805ad59b1fea158762fa6355e258601dfb49dda6f672092ae5adf072d5cab2ceaaa0d68dd3fe7fa04869d95afed8c20069f446a338576901e1b"};: z8 M6 C* H/ Y* x. O+ a- B- w
    logger.info("privatekey1:"+privateKeys[0]);
9 L* q. x4 b" Z& i8 I; \    logger.info("privatekey2:"+privateKeys[1]);8 R# ?+ F) l: F0 R* l5 \% G+ [6 t
    //callofflinesignmethodtoobtainabasicofflinesignedtemplate
; `( o* R- O" x/ Z" s  Z& g    Signaturessignatures=newSignaturesImpl();" C6 X, P% g/ y
    TemplatebasicSigned=signatures.generateSignatures(privateKeys,template,decodedTx);/ F" y* h$ t) I
    logger.info("basicsignedraw:"+basicSigned.toJson());$ ^* B) F0 v2 c7 e
    //callsigntransactionapitocalculatewholeraw_transactionid
  S. D7 M! L2 r0 D# t; g- a    //signpasswordisNoneoranotherrandomString
1 y) U( D' [3 @    Templateresult=newTransaction.SignerBuilder().sign(client,
; {/ F$ O) B+ X$ f0 q* w/ K9 X6 d    basicSigned,"");
: s" W/ b, B; b! I1 C    logger.info("resultraw_transaction:"+result.toJson());
2 H/ S& i8 k, h4 ?- I, Q" B    //successtosubmittransaction
+ f. b" b# n& U' \    }& N4 ^* o! G. x3 ]
    Multi-keysandMulti-inputsExample:
. u( b# T  I+ s' X: M; v    @Test  Y4 M. X; L" y# J
    //使用SDK来构造Template对象参数,多签,多输入) |: L, c+ @+ E% F; o
    publicvoidtestSignMultiKeysMultiInputs()throwsBytomException{/ s9 q1 \6 @; s) f7 g5 @
    Clientclient=Client.generateClient();" m- h( o6 t& `7 W# g
    Stringasset_id="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";) f/ s8 A5 d' |9 l# @/ Z  R
    Stringaddress="sm1qvyus3s5d7jv782syuqe3qrh65fx23lgpzf33em";
1 M0 l' f# ]3 k0 ]+ G9 h    //buildtransactionobtainaTemplateobject
( y; i2 \, Q) U6 W" j    Templatetemplate=newTransaction.Builder()
1 @  z( F# P8 g/ Z& @9 N    .setTtl(10): L8 [, H# ]) B9 W% s
    //1input
2 _4 p8 v: k* ]: c    .addAction(
/ N' \1 O8 u5 C2 O    newTransaction.Action.SpendFromAccount()+ U$ }: d+ u+ z7 v3 o
    .setAccountId("0G1RPP6OG0A06")//Multi-keysaccount& c! X% C: [. c/ V7 T5 B. z
    .setAssetId(asset_id)
( i4 D3 V8 Q6 q# q  O' t4 ^& Y    .setAmount(40000000)
( B4 V. ^. h( [    )  |% m1 P& H! X( H+ D
    .addAction(
6 p* c4 _" v& x    newTransaction.Action.SpendFromAccount()
( j6 q1 Y; \& }: D6 n: K+ X    .setAccountId("0G1RPP6OG0A06")
; B. J7 x6 ?2 y7 w6 g7 G3 V    .setAssetId(asset_id)& W+ ]/ e+ J9 l. F  [  G8 m1 j
    .setAmount(300000000)
- i) O2 l* {( ^+ E+ Q1 I! v    )//2input
$ z) u$ y9 p, V3 h6 O    .addAction(
; |+ [" O/ `4 Y  j4 z    newTransaction.Action.SpendFromAccount()
# r3 {5 u4 \9 H: G7 D0 J1 ]2 [, V    .setAccountId("0G1Q6V1P00A02")//Multi-keysaccount! y: p2 u- Y$ d9 @, G
    .setAssetId(asset_id)1 n3 n( J2 O1 s
    .setAmount(40000000)! Y; b, ~$ s8 k# X& G7 o
    )0 G& m5 X, C( `! j+ Q
    .addAction(" ]3 L" u. Q$ N& H" `1 J
    newTransaction.Action.SpendFromAccount(). x/ {/ G4 s  r: `$ t
    .setAccountId("0G1Q6V1P00A02")
$ ]% {% Z/ \: Y! z3 ^0 O/ ?; E) }    .setAssetId(asset_id): E+ M9 w) Z3 E2 k
    .setAmount(300000000)
4 Q. |4 L7 r: W8 W7 t! y1 {    )
9 O2 S. X/ E5 g, \& N% _( S( Q    .addAction(
, Y9 g/ X2 i  [7 P    newTransaction.Action.ControlWithAddress()
+ `) j/ Y5 M$ o. ^& v5 l& P8 Y    .setAddress(address)$ K6 \! C7 y) h, ]$ _9 ~  k
    .setAssetId(asset_id)7 q. I5 Y: w( j3 Q/ d: Q) r
    .setAmount(60000000)
7 Q3 k5 I+ B; c% G$ z% }5 H    ).build(client);' w6 U# v, o! V. z" m" J6 A
    logger.info("template:"+template.toJson());
% Y! B- M1 W* r) k, p$ J    //useTemplateobject'sraw_transactionidtodecoderaw_transactionobtainaRawTransactionobject! z/ b1 a1 X- Z8 A4 b, \+ D
    RawTransactiondecodedTx=RawTransaction.decode(client,template.rawTransaction);% L9 [% z4 \- A0 N: x3 K* n
    logger.info("decodeTx:"+decodedTx.toJson());
/ z( |1 _" g! ?( l& T# u% r1 K    //needaprivatekeyarray
% c$ d# J. ^0 O' b# Z0 T" v8 ^    String[]privateKeys=newString[]{"08bdbd6c22856c5747c930f64d0e5d58ded17c4473910c6c0c3f94e485833a436247976253c8e29e961041ad8dfad9309744255364323163837cbef2483b4f67",' A+ M9 z0 u! X) n/ h+ e7 v
    "40c821f736f60805ad59b1fea158762fa6355e258601dfb49dda6f672092ae5adf072d5cab2ceaaa0d68dd3fe7fa04869d95afed8c20069f446a338576901e1b",$ T4 a& ?& i  {/ F8 }# p+ ]* }
    "08bdbd6c22856c5747c930f64d0e5d58ded17c4473910c6c0c3f94e485833a436247976253c8e29e961041ad8dfad9309744255364323163837cbef2483b4f67"};
- w; r7 l2 B0 `  I" P+ O: S    logger.info("privatekey1:"+privateKeys[0]);. ]2 x/ q7 a* T$ R
    logger.info("privatekey2:"+privateKeys[1]);; U- i' n' Q2 O: |6 |+ s
    //callofflinesignmethodtoobtainabasicofflinesignedtemplate) U& O3 m5 q9 M( L7 h
    Signaturessignatures=newSignaturesImpl();& O& l) ^" [  L% o+ x% L. R% R6 ?: v. C
    TemplatebasicSigned=signatures.generateSignatures(privateKeys,template,decodedTx);
5 g2 E  R0 k6 g5 a    logger.info("basicsignedraw:"+basicSigned.toJson());
6 R. Z3 Z: r  d/ F7 o6 g    //callsigntransactionapitocalculatewholeraw_transactionid% d. W# V" z4 f- j
    //signpasswordisNoneoranotherrandomString
$ F( ^" m9 S2 `9 B    Templateresult=newTransaction.SignerBuilder().sign(client,
! v# ~: B! E5 k1 W0 r    basicSigned,"");
" r+ h3 y. z+ I* N& x    logger.info("resultraw_transaction:"+result.toJson());
! U' [9 A1 z3 n& }/ h# Z, |    //successtosubmittransaction
' X9 ?7 v% B3 Q: o, s# H+ ?& g4 J' W! o    }9 n, p7 v3 `3 p# F' Y+ ]  L
  \; q4 r8 b7 k8 v* \2 ]1 z
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

yuan081608 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2