Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

比原链Java版本离线签名

yuan081608
165 0 0
    tx_signer! v$ a, f! ~. B( f: ?
    Javaimplementationofsigningtransactionofflinetobytomd.
0 G1 q# d7 x3 z+ ]$ P% D    Pre
! A  J0 b% `% v/ e, ?5 ?5 m: `  }7 {    Getthesourcecode
: m2 M% R% I: |  [6 T! F  }5 H    $gitclonehttps://github.com/Bytom/bytom.git$GOPATH/src/github.com/bytom1 ]! ]9 K0 _/ [0 j2 G* t
    gitcheckout
& c6 Z9 i" K; A) ?    $gitcheckoutdev  I1 l$ y+ ]* V$ [8 }
    Whyneeddevbranch?Becauseyoucouldcalldecodetransactionapifromdevbranchandobtaintx_idandsomeinputsids.
) K0 w0 q6 w' L0 \5 E2 A1 R$ C7 \    Build( c5 h! u1 [% l3 Y& s* W
    $cd$GOPATH/src/github.com/bytom
" i: T: K. P$ V$ J    $makebytomd#buildbytomd
- r* L5 F; R5 U! i    $makebytomcli#buildbytomcli
. V, t# S/ A" y! t% B' E    Whensuccessfullybuildingtheproject,thebytomandbytomclibinaryshouldbepresentincmd/bytomdandcmd/bytomclidirectory,respectively.9 B( W- q6 r# b( C; r
    Initialize
6 ?1 V: C- _$ S: H0 p$ q    Firstofall,initializethenode:
$ H8 u! a  N  s4 v* b6 ?+ r3 A' @, ?& s    $cd./cmd/bytomd
) d1 A( l$ s" u( Q9 p, E    $./bytomdinit--chain_idsolonet! s5 ^  U7 ~& J# E% O/ n8 n
    launch
# y8 v) C1 Z  [    $./bytomdnode--mining/ W* p! E6 ]. j4 H$ {7 v( z
    Usage: }4 g* A2 ]  [: K; j
    Buildjar
! ~. k$ ?( m7 u5 [2 O) W7 O: @' Z  o& a' B' v) E9 F
    firstgetsourcecode- f1 ~: f$ {0 E3 |7 z# a2 A
    gitclonehttps://github.com/successli/tx_signer.git
/ n  l% V& p8 Q9 d& N! f3 Q    getjarpackage
( k- a/ z8 ^7 V. {1 j1 R    $mvnassembly:assembly-Dmaven.test.skip=true' {$ H, N% d- [2 ~
    Youcangetajarwithdependencies,andyoucanuseitinyourproject.
4 k! g4 O" z) n  K% V7 `+ G
4 c% X2 T2 Z6 Z. C/ b) M; U) E    Testcases6 Y2 J" l7 W  e$ Z7 U! H. D
    Need3Parameters:" A- L4 b6 Z! r/ W
    PrivateKeysArray( E$ A5 P) C& }, n: p
    TemplateObject( i# B! t* M) q! s5 z' M( }
    AftercallbuildtransactionapireturnaTemplatejsonobject.buildtransactionapi
$ k1 a" n. B: P. x9 L    usebytomjavasdkreturnaTemplateobject.
6 ^) Y* Z8 X4 e( {) P. t- m    RawTransaction$ t9 ?7 v( D# w0 Y7 p
    calldecoderaw-transactionapifromdevbranch.decoderaw-transactionapi
* ?4 N5 }6 G; c    Callmethod:
, j. n% n; A3 U. v    //returnaTemplateobjectsignedofflinebasically.3 p, K9 Q3 Y2 u9 I
    Templateresult=signatures.generateSignatures(privates,template,rawTransaction);/ {" c3 @* T  I$ a+ x" ~5 B5 M) q
    //useresult'sraw_transactioncallsigntransactionapitobuildanotherdatabutnotneedpasswordorprivatekey.8 Y' n' Z, {6 ?3 o& `: G& q; K; L
    Single-keyExample:$ |/ |* c  @: Z; z: {6 I
    @Test
. x; u( \. J4 I) z    //使用SDK来构造Template对象参数,单签
! U" }5 [& m) I) v  d    publicvoidtestSignSingleKey()throwsBytomException{& @& v8 P, S6 Y4 g1 K$ _
    Clientclient=Client.generateClient();
# r, V- Z7 @6 I' h" L6 w    Stringasset_id="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
, \( H: n3 n0 S  T    Stringaddress="sm1qvyus3s5d7jv782syuqe3qrh65fx23lgpzf33em";
% J/ u9 b! V) G6 C3 F2 h    //buildtransactionobtainaTemplateobject
) A* h- Z; {' T3 i! k    Templatetemplate=newTransaction.Builder()# ~$ n, V6 @2 {+ x3 X
    .addAction(* Z8 v% L7 Q9 a! D7 j
    newTransaction.Action.SpendFromAccount()7 a$ h6 x0 t" X
    .setAccountId("0G0NLBNU00A02")% g4 [" l( e1 Y# B" y/ Z- v! j
    .setAssetId(asset_id)% |; ]. f, ^2 a. H3 C
    .setAmount(40000000)
9 e. I+ |7 v- q, ]2 z3 M& t4 s    )
( K3 b/ C  z) e    .addAction(, I2 {8 A! `& P( B# P, `9 L7 Q
    newTransaction.Action.SpendFromAccount()5 Y! H7 _. A! I3 ]8 J0 b6 H
    .setAccountId("0G0NLBNU00A02")% @. [; ]$ u) p# S2 K4 H7 @5 B
    .setAssetId(asset_id)
- y# C( w6 E. W* T3 x    .setAmount(300000000)* c+ p. Y4 ^. ]3 K! i, R4 }
    )
( k- l# F9 w+ O# _6 w7 J    .addAction(5 ^1 u1 b# e8 C' q
    newTransaction.Action.ControlWithAddress()
& E# x  ~! D$ s% y/ l, t5 x    .setAddress(address)
, l( L3 x- m  N1 j4 u    .setAssetId(asset_id)
4 e; y% k0 ?: e$ Z    .setAmount(30000000). n, `. {/ `: k+ z2 p
    ).build(client);% r3 F+ w& c- L, n8 D6 ]
    logger.info("template:"+template.toJson());9 I8 h( M* a6 n  R# X
    //useTemplateobject'sraw_transactionidtodecoderaw_transactionobtainaRawTransactionobject6 I% q: A) |$ c! o
    RawTransactiondecodedTx=RawTransaction.decode(client,template.rawTransaction);# ^8 Y" W, O$ ^# o# ^* Y
    logger.info("decodeTx:"+decodedTx.toJson());) H4 m* X9 N" M* p3 y2 P7 |$ K4 Y
    //needaprivatekeyarray8 b$ J3 r3 @1 ]) B8 X
    String[]privateKeys=newString[]{"10fdbc41a4d3b8e5a0f50dd3905c1660e7476d4db3dbd9454fa4347500a633531c487e8174ffc0cfa76c3be6833111a9b8cd94446e37a76ee18bb21a7d6ea66b"};' v) F4 ?# {% \* ~; z$ Q- V
    logger.info("privatekey:"+privateKeys[0]);
/ Y/ W4 T# N  B' U    //callofflinesignmethodtoobtainabasicofflinesignedtemplate
4 `' y6 E  N2 U% q; Y0 ^  {    Signaturessignatures=newSignaturesImpl();
3 N& {6 g! ~+ `+ W* ?* Y    TemplatebasicSigned=signatures.generateSignatures(privateKeys,template,decodedTx);
. U/ S; s: P/ M( N5 D" O+ \8 K" T& V+ G    logger.info("basicsignedraw:"+basicSigned.toJson());
" G% d- |( m/ z+ S% c: |) C5 F    //callsigntransactionapitocalculatewholeraw_transactionid
/ O3 h, q& p& b1 h' E8 B    //signpasswordisNoneoranotherrandomString
5 n* W7 _1 R3 a2 _3 B5 s    Templateresult=newTransaction.SignerBuilder().sign(client,: H% h  P2 b& M
    basicSigned,"");1 t& Y9 G" @: b/ T
    logger.info("resultraw_transaction:"+result.toJson());. y* {% F+ |0 D: i2 z1 d6 `
    //successtosubmittransaction7 w. ~, {4 S) I
    }
4 M# G" J8 P4 g/ S. ?0 x2 M/ s- ~    Multi-keysExample:
7 a) X# h3 g! [" }4 Q7 [8 D) z6 [( q    Needanaccounthastwoormorekeys.
2 G1 Y% W9 I! y9 N8 l4 o* g    @Test
3 H. D& o: I0 m) }* F6 J  e/ n; V    //使用SDK来构造Template对象参数,多签; C4 N/ ~/ r" s' M5 N
    publicvoidtestSignMultiKeys()throwsBytomException{" v( j: \0 t: V4 O% Y+ w; i: T
    Clientclient=Client.generateClient();
% }. I$ ^. r7 S1 _0 U4 B& s    Stringasset_id="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
! ?9 T; N2 G; n  m    Stringaddress="sm1qvyus3s5d7jv782syuqe3qrh65fx23lgpzf33em";5 G3 f4 j5 [8 c; [* c
    //buildtransactionobtainaTemplateobject
0 ?& X* M" B4 {: E- ~+ l    //account0G1RPP6OG0A06hastwokeys
! X5 {/ E% M% Y$ t' n    Templatetemplate=newTransaction.Builder()
0 [) K8 e7 q. w) ~* I! ?    .setTtl(10)
% `- T; ]" H8 R) O- D    .addAction(. [8 s& X3 Q% O0 t& C8 p
    newTransaction.Action.SpendFromAccount()
8 D3 i# y' A& B    .setAccountId("0G1RPP6OG0A06")
, _5 D2 \9 T6 l: T    .setAssetId(asset_id)
  R8 S  z% T7 `9 Q    .setAmount(40000000)
. J4 C5 r* n+ L" x0 I; L' ]* ~    )9 d0 U' C; i0 x, P$ q) y6 N) I
    .addAction(
3 u; ~7 r# t6 v3 j: x1 L# Y8 {    newTransaction.Action.SpendFromAccount()' J1 H$ Z3 e$ N* c, f  g
    .setAccountId("0G1RPP6OG0A06")
; `; d. `# i: k7 q0 V    .setAssetId(asset_id)
  T( ]9 [' G& Y/ c/ A, L( r    .setAmount(300000000), b4 {& @& \, `( n$ E- ^% k
    )* l- X; g# m! x- Y8 n. I
    .addAction(# H4 i7 N' l( H3 ~' Y! [0 N
    newTransaction.Action.ControlWithAddress()7 ~! o% J3 d" G# g8 I9 v1 c
    .setAddress(address)
0 \4 f: }: z0 [- ?, l0 M8 m$ F    .setAssetId(asset_id)2 G. B# q7 B0 x7 d7 f, A" a
    .setAmount(30000000)
6 B3 \" h* w1 W2 ^    ).build(client);8 n4 i# {7 x- w9 j3 k$ x% a5 l5 z
    logger.info("template:"+template.toJson());) F1 @$ R) i" `% }3 ?
    //useTemplateobject'sraw_transactionidtodecoderaw_transactionobtainaRawTransactionobject) D- X- p, ]/ G+ {  h1 d" t: N& {
    RawTransactiondecodedTx=RawTransaction.decode(client,template.rawTransaction);
. P: i) g* W4 o8 x$ Z    logger.info("decodeTx:"+decodedTx.toJson());2 X, {' P8 X4 V1 q2 \
    //needaprivatekeyarray$ Y; L# T5 `. ~0 t
    String[]privateKeys=newString[]{"08bdbd6c22856c5747c930f64d0e5d58ded17c4473910c6c0c3f94e485833a436247976253c8e29e961041ad8dfad9309744255364323163837cbef2483b4f67",
" Z9 Q7 k! N6 c# P6 `    "40c821f736f60805ad59b1fea158762fa6355e258601dfb49dda6f672092ae5adf072d5cab2ceaaa0d68dd3fe7fa04869d95afed8c20069f446a338576901e1b"};4 x9 J/ T7 ?) e# o" K; c
    logger.info("privatekey1:"+privateKeys[0]);
5 \! l' S0 U) u" U( {6 d    logger.info("privatekey2:"+privateKeys[1]);
! s) L+ d: Z( T* E    //callofflinesignmethodtoobtainabasicofflinesignedtemplate! Y9 d: F- S* k
    Signaturessignatures=newSignaturesImpl();
' C6 s/ I2 U. {0 S3 k8 [7 [    TemplatebasicSigned=signatures.generateSignatures(privateKeys,template,decodedTx);
& X6 K. }$ O( y/ Q% f    logger.info("basicsignedraw:"+basicSigned.toJson());; N( X. s2 ?1 \+ u, g7 Y, G: {. R
    //callsigntransactionapitocalculatewholeraw_transactionid/ v/ }4 ]5 `3 c' r8 V
    //signpasswordisNoneoranotherrandomString
4 Q1 c7 d& {  I/ r* K) D    Templateresult=newTransaction.SignerBuilder().sign(client,
% r' V7 V8 ^8 _3 ?! d+ s: f    basicSigned,"");  ?+ m& I; _9 Y; C0 ~% b: b
    logger.info("resultraw_transaction:"+result.toJson());! x, d) S1 `6 D- K4 T3 l5 J' r, M2 `
    //successtosubmittransaction& m) f& @2 e% p0 T* t8 ?
    }" G$ v% N1 Y5 M, U( ]
    Multi-keysandMulti-inputsExample:
: `# ]' ~" [8 y+ A9 `/ N4 ]/ P    @Test
. x6 m: _$ P& Y( A/ B. k; W. w. ~    //使用SDK来构造Template对象参数,多签,多输入3 ?" V5 m3 u) d' b& z
    publicvoidtestSignMultiKeysMultiInputs()throwsBytomException{" E( T  a) I' k6 E( r1 h
    Clientclient=Client.generateClient();* m7 \' o* b, @/ }% d! q! e
    Stringasset_id="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";5 [4 E/ l  n3 _! p7 E+ O3 ~, S6 @
    Stringaddress="sm1qvyus3s5d7jv782syuqe3qrh65fx23lgpzf33em";
. g" v, |0 h) V4 j8 }    //buildtransactionobtainaTemplateobject
4 G! b7 t6 ^9 Q% w3 T    Templatetemplate=newTransaction.Builder()
( o% t5 h2 k5 W7 b, s, g  e    .setTtl(10)
# R( }; P8 S0 Q0 D    //1input
' ~6 U' R" C4 P+ U5 s8 x+ L9 F- @    .addAction(
6 d) V" ^# _! c  W* O    newTransaction.Action.SpendFromAccount()% I" N& @* ~& p; G
    .setAccountId("0G1RPP6OG0A06")//Multi-keysaccount2 ?& x2 z5 w- R; ^0 c* ~
    .setAssetId(asset_id)/ M  |: x6 q/ l( ]/ g' c
    .setAmount(40000000)4 y8 v/ _" A# `1 ?+ L4 O
    )/ F) }6 g" b+ x6 w+ f5 S
    .addAction(
) g4 f7 P& F. F* k5 ^3 e    newTransaction.Action.SpendFromAccount()
8 ~, U* E2 D/ @3 F' M5 H( p    .setAccountId("0G1RPP6OG0A06")/ J( u& f2 P6 u0 Q8 A
    .setAssetId(asset_id)
: g. ^- z* \4 @  t0 ]4 O/ ^  L    .setAmount(300000000)
" Y% L8 y; m$ q$ B& @- L# s3 K    )//2input$ k: D3 H% U5 b, ~- m& g. g
    .addAction(
- @, _% u* H4 \; `9 E) A    newTransaction.Action.SpendFromAccount()" ~2 Y0 a9 ~# X- v: V
    .setAccountId("0G1Q6V1P00A02")//Multi-keysaccount; A. [1 B) Y6 w& a/ r! T
    .setAssetId(asset_id)
9 `% W' D" I" @    .setAmount(40000000)% [. l9 F0 n1 {2 R9 T7 @* ]
    )2 ~( L  t0 ]& t. q2 j2 e5 F8 h
    .addAction(1 z# e% N  `3 A$ c1 W3 q4 C' ^
    newTransaction.Action.SpendFromAccount()
  e, ~: i2 P4 o6 F0 E' u8 u# P    .setAccountId("0G1Q6V1P00A02")
" J$ N! T8 k+ ]    .setAssetId(asset_id)- O, H3 j) H9 F3 L. Q) J
    .setAmount(300000000)
0 P3 p( a4 t# a2 Q    )
( S! M" O( X. B    .addAction(0 B8 Q6 T# v* V9 C
    newTransaction.Action.ControlWithAddress()( c2 f- j" z/ B6 T' o# z* c
    .setAddress(address)# S% O2 u3 _1 s( a% `9 X% X& `  Y6 v
    .setAssetId(asset_id)
3 F+ l! c$ t% M' G% `/ @    .setAmount(60000000)
+ r8 t, ~/ }, @+ C0 t  z    ).build(client);
/ W& m2 `" W; J$ C. l$ b6 u  I    logger.info("template:"+template.toJson());
! d! D& {0 W  I! j- H* Q! t5 g4 L" j    //useTemplateobject'sraw_transactionidtodecoderaw_transactionobtainaRawTransactionobject, e) X8 J* B5 J3 J
    RawTransactiondecodedTx=RawTransaction.decode(client,template.rawTransaction);- \: u/ A. C; p- c
    logger.info("decodeTx:"+decodedTx.toJson());# w# T+ O4 `; a+ [
    //needaprivatekeyarray
) l6 Z* r- C% h3 W) m    String[]privateKeys=newString[]{"08bdbd6c22856c5747c930f64d0e5d58ded17c4473910c6c0c3f94e485833a436247976253c8e29e961041ad8dfad9309744255364323163837cbef2483b4f67",
* ?2 x- \( m; \+ a. O; M7 }    "40c821f736f60805ad59b1fea158762fa6355e258601dfb49dda6f672092ae5adf072d5cab2ceaaa0d68dd3fe7fa04869d95afed8c20069f446a338576901e1b",) C) N) k3 d; e. A7 L3 d0 R
    "08bdbd6c22856c5747c930f64d0e5d58ded17c4473910c6c0c3f94e485833a436247976253c8e29e961041ad8dfad9309744255364323163837cbef2483b4f67"};( ~+ {: o, ?& }; W
    logger.info("privatekey1:"+privateKeys[0]);
: v6 w+ x# m4 V4 O5 l& ~    logger.info("privatekey2:"+privateKeys[1]);8 z( s& L1 Z- O+ W( |1 e
    //callofflinesignmethodtoobtainabasicofflinesignedtemplate& [: c' C% N8 O& U. D  m
    Signaturessignatures=newSignaturesImpl();
! P+ J8 H) I+ {) d    TemplatebasicSigned=signatures.generateSignatures(privateKeys,template,decodedTx);
2 [0 }0 c; H( ~: N% F. D    logger.info("basicsignedraw:"+basicSigned.toJson());
5 W9 }; I5 w0 ]8 n    //callsigntransactionapitocalculatewholeraw_transactionid
( ?2 P1 e, T( d/ y    //signpasswordisNoneoranotherrandomString8 E3 B& o  s) ~4 N, j8 ^
    Templateresult=newTransaction.SignerBuilder().sign(client,
" Y! o! p! |# ^# O8 i5 l; `; ~, n) {    basicSigned,"");
& g5 G: L  S# a; n% O1 t    logger.info("resultraw_transaction:"+result.toJson());0 }( @& T4 q1 @5 R
    //successtosubmittransaction5 z* Y) h  F4 G7 M
    }
" r. f# T+ y8 ]. S  I. C
' U# i, }/ {& p% E+ b1 f
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

yuan081608 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2