Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

比原链Java版本离线签名

yuan081608
119 0 0
    tx_signer
  {. b& f7 }  h    Javaimplementationofsigningtransactionofflinetobytomd.0 ?& M" Z% @4 X, x
    Pre
; [3 o) N- }1 W; U( [9 _' x7 O% V    Getthesourcecode8 T/ p3 c5 |0 `/ {0 G3 E3 @
    $gitclonehttps://github.com/Bytom/bytom.git$GOPATH/src/github.com/bytom
3 N, W% B; H3 ?- W' f4 e: Y) @    gitcheckout+ x1 a7 {! w) Q% h% v5 P
    $gitcheckoutdev
* {3 k. i! c7 z( f" h0 E. V    Whyneeddevbranch?Becauseyoucouldcalldecodetransactionapifromdevbranchandobtaintx_idandsomeinputsids.
2 |( _( b  `8 G* P. H    Build+ g' O+ p6 S) o3 U
    $cd$GOPATH/src/github.com/bytom1 }) G) b4 C, r4 P+ C
    $makebytomd#buildbytomd
- M1 s; F0 F6 r5 n; q    $makebytomcli#buildbytomcli
: N# L0 y$ F+ }9 f    Whensuccessfullybuildingtheproject,thebytomandbytomclibinaryshouldbepresentincmd/bytomdandcmd/bytomclidirectory,respectively.
3 J8 {# [  l/ F; g3 V9 w    Initialize
9 Y) ~' t2 A# F    Firstofall,initializethenode:
2 M6 U7 f. k8 k1 a: q# W- a    $cd./cmd/bytomd
, e/ j: ?# w5 c+ [: E" a! t    $./bytomdinit--chain_idsolonet) L& K3 ^( ~1 D! m7 V6 c
    launch* W! p) P( a4 e+ p# p, v
    $./bytomdnode--mining
4 \) O7 U& @# x4 n& f    Usage9 a$ W! B2 Y7 P# t- i6 ~- ~4 t
    Buildjar% e. J) a, J+ \
  ^: [* U# r9 M  x% v# Z6 T
    firstgetsourcecode; l. z5 `2 i# D2 @
    gitclonehttps://github.com/successli/tx_signer.git
" c( b/ z1 E. p1 K    getjarpackage+ ~0 d  p/ `) `4 I
    $mvnassembly:assembly-Dmaven.test.skip=true- [/ s# T* u; r# J5 V: g3 k' o
    Youcangetajarwithdependencies,andyoucanuseitinyourproject.
$ o. n/ t% a* }2 a4 t% O. [" F' w3 Z+ ?0 P7 e: A
    Testcases
7 R9 I2 q7 |/ N" x7 \    Need3Parameters:' `, ]& t& J* \( ~# I% o% x
    PrivateKeysArray: |& n# s0 d( A1 b; n" p( j! T
    TemplateObject
- E0 b9 }& A9 q) [* J+ C2 {    AftercallbuildtransactionapireturnaTemplatejsonobject.buildtransactionapi
" M% N1 E  f3 l) A    usebytomjavasdkreturnaTemplateobject.  M$ f9 Z2 ]9 ~; m  C  L
    RawTransaction8 l0 W) b9 {$ L
    calldecoderaw-transactionapifromdevbranch.decoderaw-transactionapi9 j' `( u; Z; s5 u+ M# P+ ?( `
    Callmethod:
! I) N5 |; ?+ J. Z    //returnaTemplateobjectsignedofflinebasically.
& W. J! n2 @1 F, O' A    Templateresult=signatures.generateSignatures(privates,template,rawTransaction);; @- a! J. c5 q& Y. s" S8 k
    //useresult'sraw_transactioncallsigntransactionapitobuildanotherdatabutnotneedpasswordorprivatekey.
9 y5 g2 K( h: I$ P    Single-keyExample:
+ Q# t/ U+ i) Q: U- b    @Test
- f+ Q( j) E! m4 }( m6 i    //使用SDK来构造Template对象参数,单签
! U+ J- K2 Y6 R. G, d    publicvoidtestSignSingleKey()throwsBytomException{& D$ Y% e$ ~+ S7 v( E# s! B
    Clientclient=Client.generateClient();, A8 ]0 [' C4 w- C: ~
    Stringasset_id="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
' K/ G. @! G1 [$ y9 ?. o9 P    Stringaddress="sm1qvyus3s5d7jv782syuqe3qrh65fx23lgpzf33em";0 P% E: D. U, i; a
    //buildtransactionobtainaTemplateobject0 c3 f; g) U' k' U0 r$ g
    Templatetemplate=newTransaction.Builder()" C3 i, W1 x3 ?' j5 j
    .addAction(
2 ?( P/ P# I1 i$ |    newTransaction.Action.SpendFromAccount()8 Y# A) d1 m& Z# K+ G2 K2 P
    .setAccountId("0G0NLBNU00A02")
9 V. [6 n4 k- d! N    .setAssetId(asset_id)
" K/ J* D* J# y% A0 s2 i    .setAmount(40000000)
3 C" y! T; }0 P6 b& f9 V: q7 Q    )
! v6 ]9 S" M2 e  ^. G9 E    .addAction(
! K0 Y1 e! \, D; D! A& x  c    newTransaction.Action.SpendFromAccount()% t* i% N4 \4 _/ u1 [7 N
    .setAccountId("0G0NLBNU00A02")$ U; n6 O# f- ?; F7 I1 U+ Z# _# s) T
    .setAssetId(asset_id), ]( I+ k: e0 }: d& W# x
    .setAmount(300000000)
1 K1 Y) f; H; n- V    )5 `9 `' t$ Y: L/ y3 `
    .addAction(
5 W# U: z! s$ ~3 U0 i$ I! D    newTransaction.Action.ControlWithAddress()/ F+ l% f6 T9 r6 _2 h5 z( |; t
    .setAddress(address)
3 W2 @6 }/ }# E5 o! ~9 G. q5 h5 r    .setAssetId(asset_id)
% l* H- P! f; g    .setAmount(30000000): j; F/ }% U, c: {: q: Y- Y2 [. Q3 i- _
    ).build(client);
$ a/ H2 F, ]) J    logger.info("template:"+template.toJson());
# u8 q6 q9 S7 Q6 Z    //useTemplateobject'sraw_transactionidtodecoderaw_transactionobtainaRawTransactionobject
# {5 h0 x: c) G. W2 l$ I    RawTransactiondecodedTx=RawTransaction.decode(client,template.rawTransaction);* j9 t9 U& d# B2 u2 R/ S
    logger.info("decodeTx:"+decodedTx.toJson());0 G% K5 S+ o( H( I8 d
    //needaprivatekeyarray9 U7 P, a+ Q$ B) x2 R( a
    String[]privateKeys=newString[]{"10fdbc41a4d3b8e5a0f50dd3905c1660e7476d4db3dbd9454fa4347500a633531c487e8174ffc0cfa76c3be6833111a9b8cd94446e37a76ee18bb21a7d6ea66b"};* N9 ?$ m6 U. I- ^% @1 A) v1 f: b& {
    logger.info("privatekey:"+privateKeys[0]);6 ^1 S8 z% g5 k9 \) [. j8 Q  k, k) N
    //callofflinesignmethodtoobtainabasicofflinesignedtemplate+ q+ J2 g0 ]/ A' E$ }  W! \
    Signaturessignatures=newSignaturesImpl();
# F7 k% G3 k! P0 n    TemplatebasicSigned=signatures.generateSignatures(privateKeys,template,decodedTx);2 ~; ~( T& ]0 B& S+ h0 @
    logger.info("basicsignedraw:"+basicSigned.toJson());
0 I% K% U3 ]1 }    //callsigntransactionapitocalculatewholeraw_transactionid
4 s& k8 b0 N! q5 ]+ V% B% X% q    //signpasswordisNoneoranotherrandomString
* {! n; a, ~. X# }3 u' c    Templateresult=newTransaction.SignerBuilder().sign(client,
% k/ j8 ~  K9 g! M; B6 u    basicSigned,"");
8 r7 Z) h+ y! S0 X/ q, m    logger.info("resultraw_transaction:"+result.toJson());
- r& k9 O! }9 h! [    //successtosubmittransaction
& T6 L; d1 H$ R* b) {. |' F* p    }
( u1 Q6 B9 {8 P) x. a* U8 Z8 L    Multi-keysExample:& U7 {- ?* Y* m8 `+ T# g9 E5 ~- U
    Needanaccounthastwoormorekeys.5 W8 T- `( a% I' F, Q
    @Test
: F/ |2 t6 C' |7 ?/ m) h/ j    //使用SDK来构造Template对象参数,多签
: ?2 ~* g$ E/ U3 C- `( h6 P    publicvoidtestSignMultiKeys()throwsBytomException{6 W  i0 c. B9 P# b- m3 E
    Clientclient=Client.generateClient();  T- S8 s6 C# d$ l8 {& i
    Stringasset_id="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
$ h% R8 e0 D" t    Stringaddress="sm1qvyus3s5d7jv782syuqe3qrh65fx23lgpzf33em";3 R& _5 y" H- A; ^. l
    //buildtransactionobtainaTemplateobject6 r: U: V- m& t
    //account0G1RPP6OG0A06hastwokeys
3 R+ i/ `% T) g% ]: b3 }    Templatetemplate=newTransaction.Builder()$ c8 J3 V4 \& f8 U3 f$ d  [1 ?. L
    .setTtl(10)# o9 b7 y( C& _' ]  X6 t+ S: Y
    .addAction($ f! t" ^. l! j$ {; {# j
    newTransaction.Action.SpendFromAccount()* t+ m9 }' p7 R: J: u0 n$ T& K
    .setAccountId("0G1RPP6OG0A06")
" s, `  J1 D6 b( `    .setAssetId(asset_id)/ c% Z' i3 y2 h, V% @
    .setAmount(40000000)
  ~6 `8 m# t; J6 Y. ]8 c    )3 [+ d" \- i  @
    .addAction(' {7 ~( E; f' E# N
    newTransaction.Action.SpendFromAccount()
- K7 q  Q- C  ?  ^0 p6 Q    .setAccountId("0G1RPP6OG0A06")+ i- L) I: u; Q( C$ o# c5 b& L
    .setAssetId(asset_id)
  t4 F% n( k3 w; L5 @+ e    .setAmount(300000000)
9 @# n/ T" B% j    )
- Z& _3 ]) Z) w    .addAction(
: E6 @8 `- Y/ {4 \    newTransaction.Action.ControlWithAddress()
/ l' i! w- E2 M% }1 {" k2 H    .setAddress(address)
8 I4 x* M% C& ?    .setAssetId(asset_id)' W0 r" \9 c( D, M
    .setAmount(30000000). D4 F7 W, C+ [; U/ ~
    ).build(client);
+ W4 j" x+ k9 Q    logger.info("template:"+template.toJson());
) r" |% E3 I0 ?5 W% S: z6 U  S  v    //useTemplateobject'sraw_transactionidtodecoderaw_transactionobtainaRawTransactionobject
& F8 |: C8 n: t    RawTransactiondecodedTx=RawTransaction.decode(client,template.rawTransaction);
+ T- ^' N9 f7 K! `6 q9 T# b' N    logger.info("decodeTx:"+decodedTx.toJson());
. A; f% v% s% G) H    //needaprivatekeyarray4 w# _" _6 u2 S( n2 i
    String[]privateKeys=newString[]{"08bdbd6c22856c5747c930f64d0e5d58ded17c4473910c6c0c3f94e485833a436247976253c8e29e961041ad8dfad9309744255364323163837cbef2483b4f67",+ P3 g! _- L% j
    "40c821f736f60805ad59b1fea158762fa6355e258601dfb49dda6f672092ae5adf072d5cab2ceaaa0d68dd3fe7fa04869d95afed8c20069f446a338576901e1b"};
" ~) y" H0 N! a3 {$ ~    logger.info("privatekey1:"+privateKeys[0]);
$ X) e) p" Z6 O) d: w    logger.info("privatekey2:"+privateKeys[1]);
& A/ S+ `( j4 m3 I    //callofflinesignmethodtoobtainabasicofflinesignedtemplate" H5 k+ g# E8 ?
    Signaturessignatures=newSignaturesImpl();4 I% W0 s7 H. [0 Q8 s3 X
    TemplatebasicSigned=signatures.generateSignatures(privateKeys,template,decodedTx);" G3 V. q/ ^# M0 S0 `+ n: ^
    logger.info("basicsignedraw:"+basicSigned.toJson());! q5 X  e! A: U8 Q
    //callsigntransactionapitocalculatewholeraw_transactionid! g' i/ L4 ?4 l- b
    //signpasswordisNoneoranotherrandomString8 z" w( {* s& M4 I0 \6 a+ J
    Templateresult=newTransaction.SignerBuilder().sign(client,& y7 U: w! ~/ U2 B
    basicSigned,"");
- I4 }# ~' ]( }( D. W$ @    logger.info("resultraw_transaction:"+result.toJson());
) T+ j3 v- E3 Y1 N) m. K/ E# D$ }    //successtosubmittransaction
' m% p& v0 P2 S/ V" Q# `    }
- A; g" F  b8 ^; v2 q& ^    Multi-keysandMulti-inputsExample:
* X5 i* Q$ t: h! E  w7 c; K    @Test1 u! Z$ A% x1 A# H. y
    //使用SDK来构造Template对象参数,多签,多输入
3 H3 r4 E, l; U. |2 K, w    publicvoidtestSignMultiKeysMultiInputs()throwsBytomException{
* S- b6 @9 A3 v7 @( J5 R    Clientclient=Client.generateClient();
5 a5 _  \( K5 h# j3 T    Stringasset_id="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";9 @! V& l- J: g, {/ m0 B$ F1 }
    Stringaddress="sm1qvyus3s5d7jv782syuqe3qrh65fx23lgpzf33em";
' k6 m/ m+ v7 t$ a0 S    //buildtransactionobtainaTemplateobject
* c$ @$ K. B$ l7 b& @; W# A    Templatetemplate=newTransaction.Builder()5 X! G) y3 d" m6 @
    .setTtl(10)
. ?* T8 y5 b! b! n' y8 Z    //1input
: |1 v7 R! K$ u/ e    .addAction(
3 o/ R! t6 L: D& \6 x) b+ q) P    newTransaction.Action.SpendFromAccount()
% L5 [3 x! g4 d* q3 V- q' Q2 I8 B' o    .setAccountId("0G1RPP6OG0A06")//Multi-keysaccount
7 V/ p- [( `  e/ u9 y4 I% M    .setAssetId(asset_id)* d# \) \9 m6 ?/ X
    .setAmount(40000000): {5 ^7 V, t; Q
    )
5 P! ~9 Z5 t  f2 Q    .addAction(6 F, I. X2 W# w8 C; b8 H# Q
    newTransaction.Action.SpendFromAccount()* ~9 G9 k, p8 O0 v- K2 Y' s
    .setAccountId("0G1RPP6OG0A06")' G0 @) l, f$ }
    .setAssetId(asset_id)
8 k' b% c5 ^0 j, u    .setAmount(300000000)
4 G5 }4 f4 X+ e/ g7 T- K! A    )//2input
2 R. n4 R) U, ]( `% ?" P1 J    .addAction(* d. {' ~  u$ X; s! W4 }
    newTransaction.Action.SpendFromAccount()
  w( D5 t2 g+ q& D1 v    .setAccountId("0G1Q6V1P00A02")//Multi-keysaccount; e# J1 E% }+ o2 }' i- b
    .setAssetId(asset_id)
% \' Y7 e0 Q0 \. P    .setAmount(40000000); l( L( d4 F( @5 Z; g- X  M  y
    )& G& z; _& E  b
    .addAction(; L! P. K0 W( v- j) D- R
    newTransaction.Action.SpendFromAccount()
# {$ S9 n1 Q+ X4 T    .setAccountId("0G1Q6V1P00A02")9 h% _) J6 S% I" C0 P; ^9 Q7 d  w
    .setAssetId(asset_id)% h6 o# B' A% ~( D4 y1 W# |& u
    .setAmount(300000000)
. v+ [, q9 C% z: ?( G    )% ]& |1 z% t$ j% P4 S
    .addAction(
: M" ]6 K5 {: q% @' c    newTransaction.Action.ControlWithAddress()+ j$ [; Z4 ~2 P8 m- Y
    .setAddress(address)
0 Q4 E/ P" b2 {; r1 S    .setAssetId(asset_id)3 O: P4 E, I( |+ h1 z
    .setAmount(60000000)3 Z( m* h: P! a; X4 T" R/ }
    ).build(client);
5 l& _$ q9 R7 F. b$ G6 S9 o    logger.info("template:"+template.toJson());
+ K' j+ M. X* L4 S    //useTemplateobject'sraw_transactionidtodecoderaw_transactionobtainaRawTransactionobject
; Y% B, j& b$ Q/ b, U) U# v( g3 x    RawTransactiondecodedTx=RawTransaction.decode(client,template.rawTransaction);8 q9 y2 U0 P4 E
    logger.info("decodeTx:"+decodedTx.toJson());
/ |9 [0 D' d1 M! ?- G2 M5 B    //needaprivatekeyarray# D1 ]7 g- }2 Z! a4 Y1 }
    String[]privateKeys=newString[]{"08bdbd6c22856c5747c930f64d0e5d58ded17c4473910c6c0c3f94e485833a436247976253c8e29e961041ad8dfad9309744255364323163837cbef2483b4f67",# g; V9 d  C" s! o5 N
    "40c821f736f60805ad59b1fea158762fa6355e258601dfb49dda6f672092ae5adf072d5cab2ceaaa0d68dd3fe7fa04869d95afed8c20069f446a338576901e1b",
0 \, `. U) [8 l, \+ s) ]    "08bdbd6c22856c5747c930f64d0e5d58ded17c4473910c6c0c3f94e485833a436247976253c8e29e961041ad8dfad9309744255364323163837cbef2483b4f67"};( M( t0 ~9 }7 W4 l9 G( z* N9 @6 _
    logger.info("privatekey1:"+privateKeys[0]);" c+ X4 A9 q& h5 j5 J% m5 }
    logger.info("privatekey2:"+privateKeys[1]);
* j/ p" P1 K4 h' d    //callofflinesignmethodtoobtainabasicofflinesignedtemplate
& G, ]1 S+ g' I8 N6 W    Signaturessignatures=newSignaturesImpl();$ o. {& e* v5 J& L% r$ Q
    TemplatebasicSigned=signatures.generateSignatures(privateKeys,template,decodedTx);
3 R7 a9 E0 u, L% M) d8 J    logger.info("basicsignedraw:"+basicSigned.toJson());: [& L0 G, e& c- t
    //callsigntransactionapitocalculatewholeraw_transactionid3 y: H' Q1 R  N) ]7 ~
    //signpasswordisNoneoranotherrandomString4 ]8 _8 |  e4 }1 x. ~
    Templateresult=newTransaction.SignerBuilder().sign(client,
$ `9 W1 O0 |2 k4 Q! g/ [: M    basicSigned,"");% y4 _& M- R! s  q, k# Y$ h
    logger.info("resultraw_transaction:"+result.toJson());& X/ s1 q9 e' d* s( d: ?8 B: S
    //successtosubmittransaction
" s( V1 L- D1 q9 ~    }2 {' p, E6 O2 A4 B6 W( H9 t/ o

# v- f! |/ P0 k8 o- r3 F
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

yuan081608 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2