比原链Java版本离线签名
yuan081608
发表于 2022-11-13 23:54:55
111
0
0
Javaimplementationofsigningtransactionofflinetobytomd.* B& ]3 q, Q h3 S7 W% [7 S
Pre0 e h4 y D# G2 z$ l/ K9 E l
Getthesourcecode
$gitclonehttps://github.com/Bytom/bytom.git$GOPATH/src/github.com/bytom
gitcheckout
$gitcheckoutdev
Whyneeddevbranch?Becauseyoucouldcalldecodetransactionapifromdevbranchandobtaintx_idandsomeinputsids.$ }, a: r: g% o/ j: Z4 n
Build# r2 l9 X' e+ y7 E( ^* d
$cd$GOPATH/src/github.com/bytom
$makebytomd#buildbytomd. s' O: b* \1 H4 D6 z4 H2 C
$makebytomcli#buildbytomcli0 _- g" R/ _ F4 X
Whensuccessfullybuildingtheproject,thebytomandbytomclibinaryshouldbepresentincmd/bytomdandcmd/bytomclidirectory,respectively.
Initialize9 e5 F9 C# } d
Firstofall,initializethenode:; h+ U2 i* [; v$ p
$cd./cmd/bytomd1 X4 W: J5 M( J. f& ]( A% Y
$./bytomdinit--chain_idsolonet
launch
$./bytomdnode--mining
Usage! H9 x" H' k; L$ ?+ E, C# n) q
Buildjar' ]4 i, n! M1 ]* {8 D
firstgetsourcecode
gitclonehttps://github.com/successli/tx_signer.git
getjarpackage ]4 V& A6 ~& g5 ?! S: x9 ^0 j
$mvnassembly:assembly-Dmaven.test.skip=true2 P' K' ~$ l7 C8 E3 L& W" k5 g
Youcangetajarwithdependencies,andyoucanuseitinyourproject.5 \5 d$ c4 n; C
Testcases: ^3 A8 Z; h! A
Need3Parameters:" m) f; H5 E/ O
PrivateKeysArray
TemplateObject* \2 i) y& E* ^$ Y: p* ^7 p) L
AftercallbuildtransactionapireturnaTemplatejsonobject.buildtransactionapi
usebytomjavasdkreturnaTemplateobject.
RawTransaction
calldecoderaw-transactionapifromdevbranch.decoderaw-transactionapi
Callmethod: P& O8 r1 i. f* z3 q
//returnaTemplateobjectsignedofflinebasically.: W; U8 s: Q) W8 ^
Templateresult=signatures.generateSignatures(privates,template,rawTransaction);
//useresult'sraw_transactioncallsigntransactionapitobuildanotherdatabutnotneedpasswordorprivatekey.
Single-keyExample:6 n2 r- {/ ?' y( F% v, ]9 w; x }) b
@Test
//使用SDK来构造Template对象参数,单签
publicvoidtestSignSingleKey()throwsBytomException{2 Z) B; v3 q; I
Clientclient=Client.generateClient();
Stringasset_id="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
Stringaddress="sm1qvyus3s5d7jv782syuqe3qrh65fx23lgpzf33em";, [) B# y2 s, b' v/ p& l
//buildtransactionobtainaTemplateobject1 o/ B, T3 x# ~: C! n# R+ P* k
Templatetemplate=newTransaction.Builder()% n# v9 T$ d0 O T
.addAction(
newTransaction.Action.SpendFromAccount()
.setAccountId("0G0NLBNU00A02"). B9 y3 V4 W y5 t+ j1 P3 w' l: |; N
.setAssetId(asset_id)% g5 g& w$ I( Q, r. z' h8 ~
.setAmount(40000000); j# u8 }. f4 X1 w; ~: K7 @9 W# s. V. T
)
.addAction(5 c; T" g8 L8 ~) M, e* X+ o3 d
newTransaction.Action.SpendFromAccount()
.setAccountId("0G0NLBNU00A02")
.setAssetId(asset_id)9 p3 S' R0 G. u1 v8 ^
.setAmount(300000000)
)
.addAction(
newTransaction.Action.ControlWithAddress()
.setAddress(address)
.setAssetId(asset_id)
.setAmount(30000000)$ F% a1 u2 ?- b
).build(client);/ d- @) T1 _' l8 |! p! E1 Z
logger.info("template:"+template.toJson());+ m- _& ~1 b7 u6 ^- a/ A- {# R
//useTemplateobject'sraw_transactionidtodecoderaw_transactionobtainaRawTransactionobject
RawTransactiondecodedTx=RawTransaction.decode(client,template.rawTransaction);
logger.info("decodeTx:"+decodedTx.toJson());
//needaprivatekeyarray. w4 N' m& ` R2 Z% @
String[]privateKeys=newString[]{"10fdbc41a4d3b8e5a0f50dd3905c1660e7476d4db3dbd9454fa4347500a633531c487e8174ffc0cfa76c3be6833111a9b8cd94446e37a76ee18bb21a7d6ea66b"};/ g9 G8 Q' Y; d) }" }
logger.info("privatekey:"+privateKeys[0]);
//callofflinesignmethodtoobtainabasicofflinesignedtemplate
Signaturessignatures=newSignaturesImpl();
TemplatebasicSigned=signatures.generateSignatures(privateKeys,template,decodedTx);3 T% N/ `9 z# A9 k! \; i1 g
logger.info("basicsignedraw:"+basicSigned.toJson());! j8 m" v# \3 T. W. ~
//callsigntransactionapitocalculatewholeraw_transactionid
//signpasswordisNoneoranotherrandomString
Templateresult=newTransaction.SignerBuilder().sign(client,
basicSigned,"");( B, H, h1 N% a. A9 h/ f
logger.info("resultraw_transaction:"+result.toJson());
//successtosubmittransaction+ i [4 F9 S* } w1 Z- F4 @4 \
}+ u5 m7 p" ^4 f+ a
Multi-keysExample:
Needanaccounthastwoormorekeys.
@Test
//使用SDK来构造Template对象参数,多签
publicvoidtestSignMultiKeys()throwsBytomException{
Clientclient=Client.generateClient();
Stringasset_id="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
Stringaddress="sm1qvyus3s5d7jv782syuqe3qrh65fx23lgpzf33em";
//buildtransactionobtainaTemplateobject/ W3 r1 z i' M# o( q+ M$ e
//account0G1RPP6OG0A06hastwokeys3 t& n3 f; L+ Y2 D* Z6 X1 P& e
Templatetemplate=newTransaction.Builder()
.setTtl(10)7 p, N/ I t6 L% y% g; m
.addAction(
newTransaction.Action.SpendFromAccount()
.setAccountId("0G1RPP6OG0A06")* @* w6 C1 H! }* \3 j. I% C) X
.setAssetId(asset_id)
.setAmount(40000000)
)
.addAction(
newTransaction.Action.SpendFromAccount()' P0 B5 P- r1 e6 \+ `6 e5 J0 C) ]
.setAccountId("0G1RPP6OG0A06")
.setAssetId(asset_id), s$ a& C3 }) S/ a2 A
.setAmount(300000000)& ~5 B( P1 t- l/ h3 k x
)
.addAction(# f' Z* u' w0 U0 d9 ^
newTransaction.Action.ControlWithAddress()
.setAddress(address)
.setAssetId(asset_id)8 P5 n' ~# q, K9 S6 z) N, _5 J
.setAmount(30000000)
).build(client);
logger.info("template:"+template.toJson());9 c2 ~/ o8 X1 R: U
//useTemplateobject'sraw_transactionidtodecoderaw_transactionobtainaRawTransactionobject c# ^3 t0 L) V5 m0 S
RawTransactiondecodedTx=RawTransaction.decode(client,template.rawTransaction); f8 A0 @1 w: y$ ?3 v) D& N; F" L
logger.info("decodeTx:"+decodedTx.toJson());7 v3 f! T% e* C; j3 w. Z2 a
//needaprivatekeyarray
String[]privateKeys=newString[]{"08bdbd6c22856c5747c930f64d0e5d58ded17c4473910c6c0c3f94e485833a436247976253c8e29e961041ad8dfad9309744255364323163837cbef2483b4f67",: Q' O8 ]6 K1 g. m
"40c821f736f60805ad59b1fea158762fa6355e258601dfb49dda6f672092ae5adf072d5cab2ceaaa0d68dd3fe7fa04869d95afed8c20069f446a338576901e1b"};# I# l6 J8 i: r! p- J7 D3 p" E+ i
logger.info("privatekey1:"+privateKeys[0]);
logger.info("privatekey2:"+privateKeys[1]);
//callofflinesignmethodtoobtainabasicofflinesignedtemplate
Signaturessignatures=newSignaturesImpl();
TemplatebasicSigned=signatures.generateSignatures(privateKeys,template,decodedTx);
logger.info("basicsignedraw:"+basicSigned.toJson());$ Z* f' j9 [: [! K# H: b5 a
//callsigntransactionapitocalculatewholeraw_transactionid
//signpasswordisNoneoranotherrandomString% A& \+ [# @. Y9 _1 X0 _
Templateresult=newTransaction.SignerBuilder().sign(client,3 T& R3 W5 J6 \& D4 y( V V
basicSigned,"");
logger.info("resultraw_transaction:"+result.toJson());6 x Y# X5 j& o5 n0 t
//successtosubmittransaction, ^% C0 {9 X; q- }( \9 F
}* l+ ^% c- M; U
Multi-keysandMulti-inputsExample:
@Test
//使用SDK来构造Template对象参数,多签,多输入
publicvoidtestSignMultiKeysMultiInputs()throwsBytomException{
Clientclient=Client.generateClient();% D7 [( ?: Y/ r$ I+ ^3 N2 j
Stringasset_id="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";9 U: a6 I3 @! R8 |9 O, C
Stringaddress="sm1qvyus3s5d7jv782syuqe3qrh65fx23lgpzf33em";) O5 [0 s+ n2 t/ |
//buildtransactionobtainaTemplateobject
Templatetemplate=newTransaction.Builder()
.setTtl(10)
//1input
.addAction(
newTransaction.Action.SpendFromAccount()
.setAccountId("0G1RPP6OG0A06")//Multi-keysaccount7 p$ [- e% p: V3 N5 B1 P
.setAssetId(asset_id)4 B6 j" f0 _2 S: d
.setAmount(40000000)
)7 o1 R: l+ u# t# l8 w
.addAction(
newTransaction.Action.SpendFromAccount()2 m) C1 z. S& [7 U
.setAccountId("0G1RPP6OG0A06")
.setAssetId(asset_id)
.setAmount(300000000)
)//2input H! D- E3 g7 o+ j1 Y0 r# Y
.addAction(
newTransaction.Action.SpendFromAccount()
.setAccountId("0G1Q6V1P00A02")//Multi-keysaccount. M. y; B' ~; r* L" F( R
.setAssetId(asset_id)
.setAmount(40000000)4 u6 Z$ D1 n7 h, x/ A
)' y5 T& p' p Y( v. g& N4 _
.addAction(4 a( t x! p$ A$ M3 V, @
newTransaction.Action.SpendFromAccount()' E0 X, \/ ?2 x' v$ _
.setAccountId("0G1Q6V1P00A02")
.setAssetId(asset_id), o8 d- |. p' F
.setAmount(300000000): I x- D) f8 ]/ c/ w) `9 _
)
.addAction(8 d. q0 `. K: \4 K1 w
newTransaction.Action.ControlWithAddress()* N2 G$ U N# k7 K6 D
.setAddress(address)
.setAssetId(asset_id)8 o9 F+ k' H4 T/ \9 V
.setAmount(60000000)
).build(client);1 D- _, h+ O) c/ W$ k
logger.info("template:"+template.toJson());- n O% k9 y+ l ?' @2 O
//useTemplateobject'sraw_transactionidtodecoderaw_transactionobtainaRawTransactionobject4 v7 W) S0 ~- H* V" l5 V' h
RawTransactiondecodedTx=RawTransaction.decode(client,template.rawTransaction);
logger.info("decodeTx:"+decodedTx.toJson());
//needaprivatekeyarray% o) g3 \9 t8 J; h
String[]privateKeys=newString[]{"08bdbd6c22856c5747c930f64d0e5d58ded17c4473910c6c0c3f94e485833a436247976253c8e29e961041ad8dfad9309744255364323163837cbef2483b4f67",+ b/ R( \6 R+ o$ l8 h3 `8 n2 r
"40c821f736f60805ad59b1fea158762fa6355e258601dfb49dda6f672092ae5adf072d5cab2ceaaa0d68dd3fe7fa04869d95afed8c20069f446a338576901e1b",5 t) @" Z8 ?( i# K: T
"08bdbd6c22856c5747c930f64d0e5d58ded17c4473910c6c0c3f94e485833a436247976253c8e29e961041ad8dfad9309744255364323163837cbef2483b4f67"};
logger.info("privatekey1:"+privateKeys[0]);$ ?7 g" ~. o7 N3 }2 T
logger.info("privatekey2:"+privateKeys[1]);
//callofflinesignmethodtoobtainabasicofflinesignedtemplate% S, I# c% o. {4 ]
Signaturessignatures=newSignaturesImpl();
TemplatebasicSigned=signatures.generateSignatures(privateKeys,template,decodedTx);
logger.info("basicsignedraw:"+basicSigned.toJson());
//callsigntransactionapitocalculatewholeraw_transactionid
//signpasswordisNoneoranotherrandomString) P5 a* W: j; q7 G
Templateresult=newTransaction.SignerBuilder().sign(client,
basicSigned,"");; ]* }5 g5 R+ I& y
logger.info("resultraw_transaction:"+result.toJson());
//successtosubmittransaction
}
成为第一个吐槽的人