Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

比原链Java版本离线签名

yuan081608
166 0 0
    tx_signer% d! s0 g( A& @$ o& ^, i
    Javaimplementationofsigningtransactionofflinetobytomd.
. H, [2 r3 z1 ]* u5 o7 Z    Pre
, ^! [) o: W0 s" Q    Getthesourcecode
0 m1 ^/ f' Y( G/ h. o/ a    $gitclonehttps://github.com/Bytom/bytom.git$GOPATH/src/github.com/bytom% z- {8 C$ }& K: e2 G
    gitcheckout
8 S6 l) j  o% P/ r% X8 G+ B    $gitcheckoutdev& w7 {' O/ N8 I; i
    Whyneeddevbranch?Becauseyoucouldcalldecodetransactionapifromdevbranchandobtaintx_idandsomeinputsids.
3 M4 ~8 \- P1 N8 B% F6 y    Build) u. {/ {. L+ B( j) A
    $cd$GOPATH/src/github.com/bytom+ J; P' I! ]) r( o; F9 F# Y
    $makebytomd#buildbytomd
6 t+ c- g6 N0 v, E2 V# R: G    $makebytomcli#buildbytomcli
% d; N4 j7 o+ S) L    Whensuccessfullybuildingtheproject,thebytomandbytomclibinaryshouldbepresentincmd/bytomdandcmd/bytomclidirectory,respectively.
6 k0 W0 v5 J% C    Initialize
: n- Y9 |! V; \9 {    Firstofall,initializethenode:
9 `; p  ~, ^! R- f0 M8 b9 [    $cd./cmd/bytomd  v$ F5 n: P# f; h/ V1 ]7 B; e
    $./bytomdinit--chain_idsolonet
1 z; d  b: B7 j  C8 k6 w# ~5 l    launch
- g" W' A. \( F1 v% L9 C    $./bytomdnode--mining
) i/ v/ k* `6 G+ C! ^" v* ^1 H    Usage
9 f& M, g# c9 J  g% j0 r, y& g4 D    Buildjar8 a+ `9 ?# Z1 L, L( S

8 z0 ]' ]: T6 W# ~0 L, a8 {% e    firstgetsourcecode
3 s' N* k" M, X    gitclonehttps://github.com/successli/tx_signer.git
+ D4 x+ B% T7 K" S8 C    getjarpackage9 L, n5 t5 t6 P% e% }
    $mvnassembly:assembly-Dmaven.test.skip=true
: L. N9 Z+ Y( C/ K* t& S' H    Youcangetajarwithdependencies,andyoucanuseitinyourproject.
, R9 }; M5 M  {+ ]2 f! A' ]8 \. k" @- _2 W
    Testcases9 J1 [& g( H2 K
    Need3Parameters:
; \' D) P+ I! \1 O! c8 @$ m+ X    PrivateKeysArray9 ?: O" w9 E1 p3 o% t# a, P' U
    TemplateObject9 p, N$ V4 ]) x
    AftercallbuildtransactionapireturnaTemplatejsonobject.buildtransactionapi, L% k, b6 m  a7 [9 a0 s* {
    usebytomjavasdkreturnaTemplateobject.
9 r% [2 L4 |4 ^+ X4 E    RawTransaction" J3 h! W3 n0 c5 z: {+ l
    calldecoderaw-transactionapifromdevbranch.decoderaw-transactionapi
( i$ Z& O" R9 z( t% m, R    Callmethod:
4 r0 ~' h7 D* M    //returnaTemplateobjectsignedofflinebasically.
2 ?: c8 P% R! }( R' ~) b% R) w    Templateresult=signatures.generateSignatures(privates,template,rawTransaction);
8 ~3 o& v6 N1 K  c; \% v3 N4 A6 o    //useresult'sraw_transactioncallsigntransactionapitobuildanotherdatabutnotneedpasswordorprivatekey.
9 C. c9 B, {7 S1 Y    Single-keyExample:8 {1 G/ }# M0 f( n% ]) e3 x4 N
    @Test
/ d* k* F/ H1 c    //使用SDK来构造Template对象参数,单签1 x) t' K7 f" e, w) t( N  A
    publicvoidtestSignSingleKey()throwsBytomException{) f# {& W, }% j; U: N
    Clientclient=Client.generateClient();
9 h7 Q8 I- S9 J  j. i) _    Stringasset_id="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
' J" {' _) ]- E/ Z    Stringaddress="sm1qvyus3s5d7jv782syuqe3qrh65fx23lgpzf33em";9 U! B8 H* y. Q8 c% U+ o/ X: }; `
    //buildtransactionobtainaTemplateobject
$ d  A; D! N+ h% ]6 ?; p    Templatetemplate=newTransaction.Builder()
4 y3 B; E5 g+ v1 Q    .addAction(, C/ B7 P, N, n$ S
    newTransaction.Action.SpendFromAccount()
4 ^3 ?8 H5 L. O    .setAccountId("0G0NLBNU00A02")/ N, |# A1 i% B8 d% K2 s
    .setAssetId(asset_id)# q/ t  X# e  [
    .setAmount(40000000)$ z; m' }5 x+ q* m5 r2 V
    )9 B2 f9 c% B7 m2 p1 U" ^
    .addAction(6 s3 D4 s; E& r' d* x
    newTransaction.Action.SpendFromAccount()
0 e+ K1 D% k# S' ]  t, g    .setAccountId("0G0NLBNU00A02")
! ?3 r" X0 a6 ]8 r    .setAssetId(asset_id)
7 d* w) I2 C2 Y6 m: u9 h  P    .setAmount(300000000)2 V8 y5 l* E1 a
    )
$ [2 a  `9 v* v% N4 H6 K" {! [    .addAction(: T2 O2 @; \. i+ I0 T
    newTransaction.Action.ControlWithAddress(); Z; E$ p5 \: u' ^
    .setAddress(address)1 c: |5 L5 k, Y+ _' u
    .setAssetId(asset_id)
! o% w+ }3 ^" f9 k    .setAmount(30000000)
. |( y3 A4 U* L) V# H! A: B, g    ).build(client);
6 L: [0 h3 ^6 [( g& g5 D    logger.info("template:"+template.toJson());
& L  u6 J" v  c+ b+ q( ]; z5 L5 ?    //useTemplateobject'sraw_transactionidtodecoderaw_transactionobtainaRawTransactionobject
8 o& L5 j$ n) d" _. Y    RawTransactiondecodedTx=RawTransaction.decode(client,template.rawTransaction);  a( ?3 a' E+ o8 j2 t+ l0 C
    logger.info("decodeTx:"+decodedTx.toJson());
9 F* u! S3 f% [, b( R. m6 V    //needaprivatekeyarray; A: f8 ~& ]% D$ ~' K
    String[]privateKeys=newString[]{"10fdbc41a4d3b8e5a0f50dd3905c1660e7476d4db3dbd9454fa4347500a633531c487e8174ffc0cfa76c3be6833111a9b8cd94446e37a76ee18bb21a7d6ea66b"};
3 u" U+ I' K$ E+ r6 b    logger.info("privatekey:"+privateKeys[0]);7 i3 w, |1 e" V. b9 a
    //callofflinesignmethodtoobtainabasicofflinesignedtemplate' b+ V( U& b( f5 v) i
    Signaturessignatures=newSignaturesImpl();4 b) j, L. {' _4 m4 `/ ?$ k
    TemplatebasicSigned=signatures.generateSignatures(privateKeys,template,decodedTx);
; A# g1 l7 G# Q: Z1 ?    logger.info("basicsignedraw:"+basicSigned.toJson());
6 ?0 [) \" f" R    //callsigntransactionapitocalculatewholeraw_transactionid
4 z* \+ f, }2 z8 @    //signpasswordisNoneoranotherrandomString$ s1 `" H( Y# [' S7 s
    Templateresult=newTransaction.SignerBuilder().sign(client,+ j4 h) \& I/ w+ }/ H  k
    basicSigned,"");& y; ~8 `# v' W2 x# b( }, K. _# H
    logger.info("resultraw_transaction:"+result.toJson());; f! [; y" A+ @. u: q
    //successtosubmittransaction  B5 i! ?$ D$ ~/ b# i1 x
    }* H# W# l" _  m$ Z
    Multi-keysExample:) W" m& i2 a, `+ {; R
    Needanaccounthastwoormorekeys.' e" ?5 m1 h# I
    @Test
4 O6 O9 h& Q  Z    //使用SDK来构造Template对象参数,多签
8 D* d. m; ?9 u; \    publicvoidtestSignMultiKeys()throwsBytomException{; G9 y) U# {7 E) M: D
    Clientclient=Client.generateClient();5 D2 e/ M' \7 x
    Stringasset_id="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";1 v9 G5 I2 v  i8 x  u3 M
    Stringaddress="sm1qvyus3s5d7jv782syuqe3qrh65fx23lgpzf33em";
! g7 Q' J! w7 B    //buildtransactionobtainaTemplateobject& e( c% g, G* J( b5 k5 P" M
    //account0G1RPP6OG0A06hastwokeys
' p  ]2 i& [+ F( i" j7 h    Templatetemplate=newTransaction.Builder()
8 p7 B! i9 n$ k$ j" _; E3 O    .setTtl(10)& x' M2 Q! \5 m, E; g7 Y
    .addAction(
5 o6 U1 X4 Z" F8 V  k    newTransaction.Action.SpendFromAccount()5 h4 f% r/ l3 t) K& M8 z
    .setAccountId("0G1RPP6OG0A06")8 O. z+ m4 _. P9 d+ x* B1 x- Y
    .setAssetId(asset_id)
( y) N$ s, y: S; t    .setAmount(40000000)' Y, G, S# ^. m4 G$ m: H. V
    )+ T+ O( W9 C* S7 Y' |0 I
    .addAction(! H% ^& W( m8 m8 ^
    newTransaction.Action.SpendFromAccount(), |1 f; }: B  i. g
    .setAccountId("0G1RPP6OG0A06")
* @2 j8 e# e6 {! l    .setAssetId(asset_id)
8 s# Y; X6 v( |& d8 q' `) t9 F& D/ p    .setAmount(300000000)
4 G9 I6 W* e" y3 _    )
- H; X( j9 T4 N3 z- ]+ x. {) C( b    .addAction(
6 U8 Q$ ~3 j* ~6 r7 X! K2 ?. z    newTransaction.Action.ControlWithAddress()
. r6 \( ~, g; I4 v( l! [    .setAddress(address)  d3 d8 x2 r" v
    .setAssetId(asset_id)( T( ^- c: e& [+ t5 a0 y" ?
    .setAmount(30000000)
! H4 C6 y, y/ f; v! x3 w) x    ).build(client);
' W- ?$ s* l, U! |4 p1 s1 ]    logger.info("template:"+template.toJson());1 S; w& h, x3 A) ?
    //useTemplateobject'sraw_transactionidtodecoderaw_transactionobtainaRawTransactionobject  E' U! ?7 s, n- S
    RawTransactiondecodedTx=RawTransaction.decode(client,template.rawTransaction);
* I; s) _' N1 t: M, @; f9 N: g8 w6 r    logger.info("decodeTx:"+decodedTx.toJson());
$ o, S6 q# S  l4 w* q- e0 t    //needaprivatekeyarray
; i2 q+ h. ~8 F5 d' g1 q    String[]privateKeys=newString[]{"08bdbd6c22856c5747c930f64d0e5d58ded17c4473910c6c0c3f94e485833a436247976253c8e29e961041ad8dfad9309744255364323163837cbef2483b4f67",* ?! Q7 t6 W4 S6 i6 ~3 X( P
    "40c821f736f60805ad59b1fea158762fa6355e258601dfb49dda6f672092ae5adf072d5cab2ceaaa0d68dd3fe7fa04869d95afed8c20069f446a338576901e1b"};
0 w' ^8 K: ]* `  _3 L6 v    logger.info("privatekey1:"+privateKeys[0]);4 d% [. x1 i4 N$ k
    logger.info("privatekey2:"+privateKeys[1]);! E% P. J" U( N0 `2 `) B9 [
    //callofflinesignmethodtoobtainabasicofflinesignedtemplate
. V2 a! Y% i" `$ m+ @    Signaturessignatures=newSignaturesImpl();
0 U1 _- _) h0 ~2 L, k7 C8 j. l    TemplatebasicSigned=signatures.generateSignatures(privateKeys,template,decodedTx);6 ?9 s5 Q  n2 M+ w. `  k
    logger.info("basicsignedraw:"+basicSigned.toJson());
' u% U6 B9 D0 W. {4 Q    //callsigntransactionapitocalculatewholeraw_transactionid
; {( b! A2 q" i1 N    //signpasswordisNoneoranotherrandomString
8 a3 ?- k8 C5 m- j    Templateresult=newTransaction.SignerBuilder().sign(client,
7 I/ V3 G9 L  B7 O, P1 p: ]; b2 w    basicSigned,"");
& E6 X% [7 g9 c! G. v; }: `$ V    logger.info("resultraw_transaction:"+result.toJson());- v. f4 ^' k% ?6 r- S# p
    //successtosubmittransaction
9 J7 s. u% u" }! D) g' r    }  ^$ {* r. g8 d8 T1 l
    Multi-keysandMulti-inputsExample:
- M0 U0 _  P5 Z9 t; f( D$ G+ m    @Test
& S7 B0 W$ {% ~/ T$ G% W. Z    //使用SDK来构造Template对象参数,多签,多输入
- J& j; \. I+ e) e1 \0 `. b    publicvoidtestSignMultiKeysMultiInputs()throwsBytomException{
3 G+ K" I; G6 W3 j; g/ K    Clientclient=Client.generateClient();
, o2 k, e% d% E1 `  r    Stringasset_id="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
- U8 ?$ y3 s; A8 c; {9 ~' r    Stringaddress="sm1qvyus3s5d7jv782syuqe3qrh65fx23lgpzf33em";
7 j5 V. n) x: V/ T) R    //buildtransactionobtainaTemplateobject
* U& N; d- a" N, H1 I: V    Templatetemplate=newTransaction.Builder()! J" ?3 j. Y6 E8 |0 x5 B
    .setTtl(10)+ P6 n8 r# P0 @/ I9 k! Q+ Q
    //1input1 y' u/ e/ L5 t. u) A0 h
    .addAction(
; l, g6 y0 s9 i    newTransaction.Action.SpendFromAccount()
( D8 X2 p2 W9 j- v- {* t    .setAccountId("0G1RPP6OG0A06")//Multi-keysaccount$ O3 ]* U! b/ ^5 O3 I( v! B% z
    .setAssetId(asset_id)% b1 R& G. T8 l
    .setAmount(40000000)$ m# a6 b9 O2 V, k+ e. ?2 A' r
    )' R, C: l$ M( |
    .addAction(* R" q1 Y! C$ I2 e
    newTransaction.Action.SpendFromAccount()
/ @" z; U5 c! F- g) c    .setAccountId("0G1RPP6OG0A06")
- p$ b6 O" q: ]  V    .setAssetId(asset_id)" w( d* v3 a( q: m
    .setAmount(300000000)) n7 `: Y8 M7 a* Y$ M! |. T. O
    )//2input
( C# K9 \( i; y6 J( q    .addAction(! \# W' {& w2 i4 r
    newTransaction.Action.SpendFromAccount()
: V  |5 I; }# J) `    .setAccountId("0G1Q6V1P00A02")//Multi-keysaccount/ j; L' H8 A( L' Y
    .setAssetId(asset_id). o, l& N2 R8 a9 g7 Z- t1 p
    .setAmount(40000000)
, R# _% a' z8 C% ]- s- ~2 E) W    )4 y; {; h, P6 h6 D- u) s
    .addAction(0 j# C5 t. V' \
    newTransaction.Action.SpendFromAccount()" u% j. I' a/ Z+ Z
    .setAccountId("0G1Q6V1P00A02")3 ~% Y' X2 h% A# e
    .setAssetId(asset_id)
* P$ ?( i) T$ A2 c! n2 }    .setAmount(300000000)
! X- q# L7 k# h- \/ o. V5 [    )$ ?% k2 M& B2 o, |
    .addAction(
" J1 D" f& Z7 g    newTransaction.Action.ControlWithAddress()
5 D  t( X7 Y% q! k+ Y    .setAddress(address)
- [! I6 V% d* y. ?( O6 ?5 B& b6 a    .setAssetId(asset_id)! u* K  {2 O0 {$ U! q. J$ c
    .setAmount(60000000)
+ i$ C; ^1 v' \/ Q; Q; K6 X7 d; ]    ).build(client);
+ r! z# k' e. n/ \5 u6 a- a& O+ `    logger.info("template:"+template.toJson());
# L, C  f2 \4 ~: Z2 H- d) ]/ F    //useTemplateobject'sraw_transactionidtodecoderaw_transactionobtainaRawTransactionobject
" n  W( \1 ~! y9 t2 Y    RawTransactiondecodedTx=RawTransaction.decode(client,template.rawTransaction);$ {# r, J& z* R
    logger.info("decodeTx:"+decodedTx.toJson());
# k% m: N" |- p  i( `; H    //needaprivatekeyarray
4 O8 T0 F! N3 o    String[]privateKeys=newString[]{"08bdbd6c22856c5747c930f64d0e5d58ded17c4473910c6c0c3f94e485833a436247976253c8e29e961041ad8dfad9309744255364323163837cbef2483b4f67",
; r8 n% d& M7 x8 r    "40c821f736f60805ad59b1fea158762fa6355e258601dfb49dda6f672092ae5adf072d5cab2ceaaa0d68dd3fe7fa04869d95afed8c20069f446a338576901e1b",0 z- W* R; q+ Z1 X- I
    "08bdbd6c22856c5747c930f64d0e5d58ded17c4473910c6c0c3f94e485833a436247976253c8e29e961041ad8dfad9309744255364323163837cbef2483b4f67"};/ K$ b/ b: Y. M5 l
    logger.info("privatekey1:"+privateKeys[0]);
9 `& d* `9 L' Z+ k: }% E    logger.info("privatekey2:"+privateKeys[1]);- s2 q; U- s+ n
    //callofflinesignmethodtoobtainabasicofflinesignedtemplate
9 D+ e. J- i, _+ }    Signaturessignatures=newSignaturesImpl();+ R* @- Z- _) j  H* x
    TemplatebasicSigned=signatures.generateSignatures(privateKeys,template,decodedTx);
+ R% q" h, c5 S# Z    logger.info("basicsignedraw:"+basicSigned.toJson());
7 f$ [  n. h. H8 p( t    //callsigntransactionapitocalculatewholeraw_transactionid
1 y8 x' e. z3 N* [    //signpasswordisNoneoranotherrandomString0 [+ c9 Y4 a5 s, N& |* P: s, H
    Templateresult=newTransaction.SignerBuilder().sign(client,& j0 ~6 A# V& C. D: C0 x% j/ Y) H
    basicSigned,"");: I9 g9 N* X* `5 |  n" M
    logger.info("resultraw_transaction:"+result.toJson());- p; W" p3 D4 i( d
    //successtosubmittransaction
) A- j% {* a+ E# u1 H+ @    }1 \4 ~( Z. R% ^1 n/ e
- ~4 w; F; f2 Q4 d  b9 I
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

yuan081608 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2