Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Bytom交易说明(账户管理模式)

V刘晨曦
115 0 0
比原项目仓库:
! y7 y7 k1 u$ jGithub地址:https://github.com/Bytom/bytom: `/ d) U  \2 H( n: G
Gitee地址:https://gitee.com/BytomBlockchain/bytom# F1 \5 Z% q+ }' n: ~
该部分主要针对用户使用bytom自带的账户模式发送交易& x+ Y- ]# e& o/ P* K+ r
1、构建交易6 p' p( Y; T5 B- Z
API接口 build-transaction,代码api/transact.go#L120
$ b0 ^$ b  x9 u7 i& H以标准的非BTM资产转账交易为例,资产ID为全F表示BTM资产,在该示例中BTM资产仅作为手续费,该交易表示花费99个特定的资产到指定地址中。其中构建交易的输入请求json格式如下:
2 l$ @( {9 ^& {# x& d/ J{
8 h8 l" Z4 V8 F7 R' e  "base_transaction": null,4 h) j" S- Y# _, B0 @+ m
  "actions": [/ R6 M( H( l2 O  `+ i( X
    {9 N, L* @/ T" v& G8 d9 a+ R4 y
      "account_id": "0ER7MEFGG0A02",0 x- t  E% I+ ~6 P4 D
      "amount": 20000000,
: T% Q; R  g. x& L" O* n      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1 {8 _2 }. l: P6 b# c: f0 F3 o8 m      "type": "spend_account"
+ A* \- e2 M% I. y. p& J    },8 o6 }) u3 E, s+ H; X9 d6 [
    {
, X6 V( m' t6 v. j& p      "account_id": "0ER7MEFGG0A02",, q3 Z- I! e) K0 `+ a* R% E7 d) o. r; o
      "amount": 99,  B7 s& F# B0 O, Q# Y6 Y( v2 S$ E
      "asset_id": "42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f",
5 ?& c# A1 j9 k      "type": "spend_account"
& Z. O  n1 S- x4 {: P7 X, @    },: r/ i* p3 `1 @% t) I) P( I9 M
    {: t1 J5 t1 f! ]- {4 T1 n0 X
      "amount": 99,; p  j) z2 T, D+ @7 c+ C# T, i
      "asset_id": "42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f",
) ~5 g. P. o: n+ q& o      "address": "sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me",& A7 ^: y& D' H' g+ B
      "type": "control_address"
) N3 y. ~" y# ?    }. [! f" A# \# a) Y' l! n
  ],
: @7 R$ s5 U5 m$ V0 R2 _5 ?1 {  "ttl": 0,
' p6 w5 z; N, _9 g* Q+ }  D" R  "time_range": 02 [4 V' m# K# N. B$ }
}5 z: d: u0 W' ]8 X) u  O
对应源代码的请求对象如下:
- C, m" e# r3 j. y2 }// BuildRequest is main struct when building transactions
- O; F5 h2 G/ ~) Htype BuildRequest struct {0 Y. z  L6 Y* @# j5 L' U' ?
        Tx        *types.TxData            `json:"base_transaction"`2 _" M9 a- m7 U' R/ T0 Q' q) _$ |; `5 H6 K
        Actions   []map[string]interface{} `json:"actions"`1 {0 R$ L, ~- M* @
        TTL       json.Duration            `json:"ttl"`
9 W  b$ v- k; n) b9 a" V        TimeRange uint64                   `json:"time_range"`
2 G# j' C. z2 j}
9 p/ r: X4 M9 V# K结构字段说明如下:
: ^1 X5 A& P9 J- D) a8 \Tx 交易的TxData部分,该字段为预留字段,为空即可
  f& u$ u. j. t" P* h. MTTL 构建交易的生存时间(单位为毫秒),意味着在该时间范围内,已经缓存的utxo不能用于再一次build交易,除非剩余的utxo足以构建一笔新的交易,否则会报错。当ttl为0时会被默认设置为600s,即5分钟9 N. a, e6 x1 X  {; h
TimeRange 时间戳,意味着该交易将在该时间戳(区块高度)之后不会被提交上链,为了防止交易在网络中传输延迟而等待太久时间,如果交易没有在特定的时间范围内被打包,该交易便会自动失效
3 b$ n0 e  n) }8 `9 \0 K+ fActions 交易的actions结构,所有的交易都是由action构成的,map类型的interface{}保证了action类型的可扩展性。其中action中必须包含type字段,用于区分不同的action类型,action主要包含input和output两种类型,其详细介绍如下:. E- c4 b& {! `
input action 类型:2 r5 N. o  }+ B4 z/ O
issue 发行资产6 H7 m5 v3 E) m5 t: h
spend_account 以账户的模式花费utxo
4 G0 L& m) D5 b  Dspend_account_unspent_output 直接花费指定的utxo
0 s: G4 i% W! }: s' w& R, Y5 ]4 coutput action 类型:
! Z- i! s+ Z+ x' o3 j1 Acontrol_address 接收方式为地址模式5 m* l" m; x, v- |9 k0 P6 \
control_program 接收方式为(program)合约模式
- I( |- S3 F0 x# E+ yretire 销毁资产, j  i+ L( N5 X1 {1 J- l- \
- x" ^) }' ?  j8 d6 {2 j
8 \4 D7 v7 X$ s2 A, f; H4 p  J
! R# k1 m4 t) J( d: a) E! H
注意事项:  i* h6 z; E8 f) s2 q8 i- |' V: F
一个交易必须至少包含一个input和output(coinbase交易除外,因为coinbase交易是由系统产生,故不在此加以描述),否则交易将会报错。
1 L. `& x4 f" ~# t除了BTM资产(所有交易都是以BTM资产作为手续费)之外,其他资产在构建input和output时,所有输入和输出的资产总和必须相等,否则交易会报出输入输出不平衡的错误信息。
  ]3 p- ?. x& p5 u0 x: L$ H& A& [交易的手续费: 所有inputs的BTM资产数量 - 所有outputs的BTM资产数量
9 f; g2 l! ~/ X, a交易中的资产amount都是neu为单位的,BTM的单位换算如下:1 BTM = 1000 mBTM = 100000000 neu# y3 L/ u5 j$ i# L

7 q! F, ?' f' y9 [0 Y0 D+ ]action简介6 y* s* T7 y, c- N
下面对构建交易时用到的各种action类型进行详细说明:
& |# c$ p/ P( c0 ?. `6 hissue$ A, V  S8 g! Z5 C  }9 w2 x+ b
issueAction结构体源代码如下:8 C0 J& O6 m; y6 ~5 n- C& ]
type issueAction struct {' X0 a8 y& U* I% Y4 X' f* D% r+ M
        assets *Registry0 h; @3 g4 _! o6 H# ?+ c7 D, J6 j
        bc.AssetAmount
7 g1 z6 J0 n$ Z- t}
1 N! ^( O7 @& X/ v% ktype AssetAmount struct {
3 c  P9 m+ u( ?/ Y7 P% M! d" p: j        AssetId *AssetID `protobuf:"bytes,1,opt,name=asset_id,json=assetId" json:"asset_id,omitempty"`) P9 g5 s% Q, s  D2 d
        Amount  uint64   `protobuf:"varint,2,opt,name=amount" json:"amount,omitempty"`
' T7 W& F; V/ _/ Q2 p  J}
* l/ x) [' D( P+ [结构字段说明如下:
: N% p- ~- |' Zassets 主要用于资产的管理,无需用户设置参数7 ~" b4 Q+ Q( w" M1 u5 Z
AssetAmount 表示用户需要发行的资产ID和对应的资产数目,这里的AssetID需要通过create-asset创建,并且这里不能使用BTM的资产ID
$ F# ^, i' N9 Y; ?6 z6 S/ V9 Z
! q8 A0 i: L6 _! |+ ]6 C' wissueAction的json格式为:
3 z% a8 `& Q, P* h{/ ^- K9 F' M, p- D# c1 }8 k
  "amount": 100000000,
! ^" v2 ]0 `/ `# U/ U) ~" N  "asset_id": "3152a15da72be51b330e1c0f8e1c0db669269809da4f16443ff266e07cc43680",
* b* i- w7 F2 {6 }. Z9 ~% w  "type": "issue"
+ t9 ~; t+ x3 m0 u$ D8 }4 S6 S}
# t, w% {* v! b1 Z4 w6 t0 w( j例如发行一笔资产的交易示例如下:
( E' Y2 m( A7 G' a(该交易表示发行数量为900000000个assetID的42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f的资产到接收地址sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me中, 其中手续费为20000000neu的BTM资产)
9 _' J! R0 i- b, u- j{
, P  D  G+ ~9 T6 T5 l  "base_transaction": null,
0 b3 C6 N: t. i, g# F  "actions": [; B9 N8 a+ r+ x. v
    {) f- }2 D+ ^7 ]
      "account_id": "0ER7MEFGG0A02",
% b" B3 o7 K0 C1 ~$ j6 S6 C; Y  C      "amount": 20000000,
! P: g3 a  \; v/ R* b      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
5 y% }! l7 N! Z      "type": "spend_account"
, S. L8 y; a* W4 A  Q1 z! }0 i# s' G    },
# j; U: B( C/ z3 b" _! @    {* B2 m" u( {7 |; S6 c% ~% K
      "amount": 900000000,) N. S' j/ d2 X5 r  S5 V  y
      "asset_id": "42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f",# ]8 ?& F  v; p8 c! E8 v: @9 Z: h; Q5 x
      "type": "issue"
' r8 e+ z* N3 A4 r" A    },( A+ ?0 _: b3 H; h# S) e
    {
% W, L# g- L' h1 |) l1 u      "amount": 900000000,9 q0 {- |  R; @4 ?! [, G
      "asset_id": "42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f"," l. I5 q$ y* W  ]) A8 S
      "address": "sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me",
6 t/ n- L0 m( E* t8 e      "type": "control_address"
2 q1 J5 F; @: l) @' E' o% I    }
+ ^. j3 W2 F9 D! R' N* U$ b+ S  ],; t4 M2 {- P( R9 N! D3 z  }
  "ttl": 0,. k, Y! v) C7 l3 f4 n
  "time_range": 0: S5 _8 V. H  Z9 _& i( _# V
}
; O) J2 V# ~# e/ _. U$ e5 \  J& N2 u0 h( W  N
spend_account
* h/ ~0 U( w9 e4 ~spendAction结构体源代码如下:
0 G7 b( h9 @) u7 r% Ntype spendAction struct {7 t3 C& s2 }; c- E4 }  `3 ^
        accounts *Manager
  X; Y  ?4 c- g: h; n        bc.AssetAmount
, O' w+ Q6 H8 b4 K2 |4 g9 }, P        AccountID   string  `json:"account_id"`
2 o% _# e% n. s* T7 j        ClientToken *string `json:"client_token"`
! \1 m$ s( Y" `8 ?}
, k% T& }5 v' Q6 @6 C! R6 P; itype AssetAmount struct {/ F$ n2 g% U% P# ~4 \
        AssetId *AssetID `protobuf:"bytes,1,opt,name=asset_id,json=assetId" json:"asset_id,omitempty"`
& s* e* ]; Q& U9 {2 p. K8 C2 a  ]        Amount  uint64   `protobuf:"varint,2,opt,name=amount" json:"amount,omitempty"`
& \6 j1 ^0 ], t5 S) t5 b6 M8 n}
3 g: W7 c. }7 q) f8 f, y! Q! X) t3 M' G: v结构字段说明如下:+ k9 M+ n% K& T5 E" U0 \# q9 O
accounts 主要用于账户的管理,无需用户设置参数
: \' V. P3 e4 b' i: mAccountID 表示需要花费资产的账户ID
$ N. t" ^$ v0 R0 iAssetAmount 表示花费的资产ID和对应的资产数目1 |9 r& ?2 e* J$ ?6 w5 |/ H
ClientToken 表示Reserve用户UTXO的限制条件,目前不填或为空即可
' Y" A" y& i: e9 f
% _2 f# r- B6 V2 @$ D5 M2 l! XspendAction的json格式为:
6 }/ {  o+ x' ?{3 O! c% @" ~! U' z  Y
  "account_id": "0BF63M2U00A04",
2 U+ L/ ~1 e6 d5 G! ]  "amount": 2000000000,
: f; E) b0 F" j5 h6 {  "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1 M6 x3 s3 }3 b  y# M8 y  "type": "spend_account"* x1 R0 s8 Y" u; Q$ F3 ~' y% g! _9 Z" \
}
3 r1 y$ Q- a# Z2 {例如转账一笔资产的交易示例如下:
: ~% H% e+ O: z(该交易表示通过账户的方式转账100000000neu的BTM资产到地址sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me中, 其中手续费20000000neu = 输入BTM资产数量 - 输出BTM资产数量)
. x4 Z& x, m  U{9 y* L# X  S* R+ |. i$ f( _
  "base_transaction": null,
& f  \& z: C) B. c% A  "actions": [
: N! L2 `) d+ a# m8 i5 @; Y; [3 [* E    {$ r+ u& Z  l: `& o( h/ ^; n
      "account_id": "0ER7MEFGG0A02",
3 p: ]' I3 d5 @      "amount": 120000000,
0 O/ i/ u% P* g* Q' R; r% j      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",6 {, ^7 I( P! Z' g5 S1 T8 a3 W
      "type": "spend_account"5 o* k2 y3 K( W. O
    },
- ?$ k7 U$ o$ U& P0 b+ ~7 s    {. n1 u/ L2 x/ y  ^3 p' U
      "amount": 100000000,0 _. X( P8 J8 W* _2 f
      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
4 I" d( |! i( V; w      "address": "sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me",; }7 v; y- D' Z. {) H
      "type": "control_address"
9 Z/ p( c" [% Q7 N& Q* L  \    }# G+ k1 _; A2 |* `0 z  v  [6 e
  ],
1 V# A& G- T; u$ z  "ttl": 0,) T* ~  d  m: K) r
  "time_range": 00 h8 k6 Q- m% k: F& J4 [6 [
}
& X& q. t: J2 F5 v9 C- Z' O. [! ~3 ?& _' M% b( k: P
spend_account_unspent_output% t# t3 G& }9 k- v& X% `
spendUTXOAction结构体源代码如下:
" P* }. v! k4 S8 ^4 N$ @type spendUTXOAction struct {
% `2 G% D; Z% s7 o+ G8 [" Y6 c        accounts *Manager/ |3 ^' Y7 s1 s$ n
        OutputID *bc.Hash `json:"output_id"`
3 q; D+ k  A& I0 x        ClientToken *string `json:"client_token"`
1 ^% H% I) Z  l! L  ]) Q0 z8 N}6 K3 c2 {' A3 y8 d; \
结构字段说明如下:3 o% {$ l( X+ G, B* N4 Q, r
accounts 主要用于账户的管理,无需用户设置参数
7 V7 i! C, J% [; E2 R% ?4 rOutputID 表示需要花费的UTXO的ID,可以根据list-unspent-outputs查询可用的UTXO,其中OutputID对应该API返回结果的id字段+ W- }9 X4 [& E* S4 }
ClientToken 表示Reserve用户UTXO的限制条件,目前不填或为空即可3 {# T+ f$ C2 A
7 o! J  X0 w& P5 b  V
spendUTXOAction的json格式为:
1 h" o6 d* a$ s) S* B{
; @/ y' ?8 V- p  "type": "spend_account_unspent_output",- l+ y( b2 U) g! M: }6 S0 F  C
  "output_id": "58f29f0f85f7bd2a91088bcbe536dee41cd0642dfb1480d3a88589bdbfd642d9"
# w& J  w$ e# T}" `) a# p  I8 e: N) v6 S3 D( E
例如通过花费UTXO的方式转账一笔资产的交易示例如下:
5 ~! q" @: M4 W6 Z; P# |(该交易表示通过直接花费UTXO的方式转账100000000neu的BTM资产到地址sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me中, 其中手续费 = 输入BTM资产的UTXO值 - 输出BTM资产数量)" K$ T3 t$ u: z0 L) s
{
: P* M* d: R( n. n! Z  "base_transaction": null,$ Z( s* m: x& O
  "actions": [
4 o  p8 ]( c) g8 a5 t    {
9 g: o& `! C. D% r- L1 p4 w; J      "output_id": "58f29f0f85f7bd2a91088bcbe536dee41cd0642dfb1480d3a88589bdbfd642d9",3 _/ \7 H. G' f' N5 Z! _  a
      "type": "spend_account_unspent_output"' \* a; r0 E. _4 G4 K
    },
9 N( V# d6 S% e% ^6 |2 I! q$ J! C    {2 Z( g8 }9 e) l7 ^  z
      "amount": 100000000,  K/ H4 w5 M# W  P, a
      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",4 K7 I% {. H: [
      "address": "sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me",
& y; b5 G1 B1 R) O; V      "type": "control_address"
% `8 W, m- i! K$ M    }
* x/ p" U- y+ V  ],
6 W% Q1 t5 E' w  {% r  "ttl": 0,
+ e/ C) Z" G. E: G& T* N- x  "time_range": 06 v: I! t' J4 b* \- z" ^
}
2 e) m  y3 K8 [6 o
6 i  W, ~" y& O/ Scontrol_address
0 F2 g. ~: ]; P& T( ~- j2 ^controlAddressAction结构体源代码如下:, j2 Z8 N. ?/ r$ ~
type controlAddressAction struct {
2 |3 B/ {9 g" \& A        bc.AssetAmount; d) t  l* J" n, b
        Address string `json:"address"`
& ^7 _3 h: O9 c}: c$ u$ P! j3 I" z2 ?# c. o
type AssetAmount struct {
$ G! G+ h' a7 y' K        AssetId *AssetID `protobuf:"bytes,1,opt,name=asset_id,json=assetId" json:"asset_id,omitempty"`$ y' s$ t* E( P
        Amount  uint64   `protobuf:"varint,2,opt,name=amount" json:"amount,omitempty"`8 T$ X9 s7 |' I; k4 W1 z0 J
}% Y/ a1 [5 B, j: v0 x
结构字段说明如下:* j+ f2 s9 H/ x( ]- g' D3 z" Q3 U
Address 表示接收资产的地址,可以根据 create-account-receiver API接口创建地址
0 b8 P4 `) c& E6 T. oAssetAmount 表示接收的资产ID和对应的资产数目% R; W0 U# Q- P! `7 Z% a' i
3 |" K* m; b; t9 t9 D
controlAddressAction的json格式为:6 x% o& V! J4 ?- m5 ]% J/ o
{
' i( d. y, M% Y& Z8 L+ E0 l" n  "amount": 100000000,6 @- c4 P  _( k4 y+ Z% V! O1 A- D
  "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",% j6 @' k! A7 y7 X5 a; n8 c
  "address": "bm1q50u3z8empm5ke0g3ngl2t3sqtr6sd7cepd3z68",7 }" `' X7 {; l6 i5 ?
  "type": "control_address"
6 u3 |' J. B# x3 B) q}# u. U( u) I0 ^& ]4 P
例如转账一笔资产的交易示例如下:
) [7 Z  _/ N# {# [7 \% N3 l(该交易表示通过账户的方式转账100000000neu的BTM资产到地址sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me中, 其中control_address类型表示以地址作为接收方式)8 {. b& p6 A: W9 _; Q' l0 X$ E
{5 T- K) J* X. q! Y" i3 P* z+ D) I
  "base_transaction": null,6 k1 F# O1 l0 |. f
  "actions": [
* S! ^2 _3 W3 |8 x    {8 i  L! E3 d( J
      "account_id": "0ER7MEFGG0A02",
4 r8 Q2 ~' n0 [( [* Z5 N      "amount": 120000000,
% ]$ L* t$ @9 O  I! ~9 F1 Q      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
/ j  z) o& [6 k; ?+ M- g- E5 S5 V; ~      "type": "spend_account"
0 C& u3 s' n9 j! m    },
2 z- l2 }, c" b# C+ l7 @; V1 L    {0 Y8 t, S% H% s+ f
      "amount": 100000000,4 O7 Q0 h) |$ v8 O" i
      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ s6 f2 F$ X" W( j! P, p      "address": "sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me",5 w2 h6 h; P: r6 z3 Q
      "type": "control_address": e$ C" I7 k" x8 V8 o  L' j6 E
    }
* b9 B9 K4 d9 n9 y  ],- A8 v% }1 S, \, ~6 y+ X
  "ttl": 0,
! A7 m# F) C: p/ t' r  "time_range": 03 B* o" Y' x( C! J
}" m/ v  v2 `' o% t' I8 S
( `7 i! h" \* |& {( {
control_program
9 h! C& L, {. H9 V8 _$ [) H+ J9 w- m3 A% _controlProgramAction结构体源代码如下:
& N# y8 e2 C5 m" q/ R" ctype controlProgramAction struct {# s+ c' x# a9 w6 Z
        bc.AssetAmount7 |* _# ~2 [: Y# s& S) y/ d
        Program json.HexBytes `json:"control_program"`/ B4 f$ k9 M& T; ^0 C6 I
}
2 l8 t* r4 F2 T1 g0 y" Gtype AssetAmount struct {
8 a$ `4 Z0 s' U6 _7 b2 N( {        AssetId *AssetID `protobuf:"bytes,1,opt,name=asset_id,json=assetId" json:"asset_id,omitempty"`
, r2 A* G' q9 M2 u" G0 a  }        Amount  uint64   `protobuf:"varint,2,opt,name=amount" json:"amount,omitempty"`' c& A" y! A# C: d# a3 O
}
; k; o- I8 R! x; O+ l: [2 r结构字段说明如下:
) ~# G2 c0 l4 O( c) F9 kProgram 表示接收资产的合约脚本,可以根据 create-account-receiver API接口创建接收program(返回结果的 program 和 address 是一一对应的)
* C5 K$ e6 ^- t3 _5 B9 {; A& uAssetAmount 表示接收的资产ID和对应的资产数目
) K& g5 R+ P' j
& v7 C/ g) p* l8 i: N& V& ~+ LcontrolProgramAction的json格式为:7 P) q- r. R+ ?  ^+ o& R% P! \2 K' |
{3 @! l* q4 L9 M- p
  "amount": 100000000,
: I; r& q$ O9 ?5 @6 T( F  "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
, v+ N9 C/ ~4 _! }% `  l  "control_program":"0014a3f9111f3b0ee96cbd119a3ea5c60058f506fb19",
6 Y2 p7 L: ~0 p  |  "type": "control_program"
2 ]+ c& l, u3 O( t0 ~6 _5 U}
$ O0 k2 S5 p( ~* Z2 B! Z  h1 L例如转账一笔资产的交易示例如下:
  o+ c$ Y/ ~- F(该交易表示通过账户的方式转账100000000neu的BTM资产到接收program(跟address是一一对应的)0014a3f9111f3b0ee96cbd119a3ea5c60058f506fb19中, 其中control_program类型表示以program作为接收方式)
. J1 w8 Q: j6 t2 S+ ]# B4 H. |* a{
! }+ E1 f+ B4 K. m$ T  "base_transaction": null,# S* [( W3 \. }1 I* W
  "actions": [  |' }% B1 w* J# j
    {
9 J, h7 \8 {: ^; r6 n& p      "account_id": "0ER7MEFGG0A02",' z+ A1 ~% g; E0 N2 J* f) u# w
      "amount": 120000000,
% c% r/ e8 D( W6 ]! V      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",' M. P! J( Y  B$ x0 V/ m
      "type": "spend_account"
* Q) w) S5 Q, @* }    },
4 l* t, u: q0 T5 M0 I8 A    {0 B  s1 c5 |9 F7 ~
      "amount": 100000000,
% s/ P, I- J) I6 z  F9 H% f: R2 `      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ N! {; S3 Y+ c: F( r, B      "control_program": "0014a3f9111f3b0ee96cbd119a3ea5c60058f506fb19",3 n* v$ ?8 C6 A3 O# ?5 X9 u
      "type": "control_program"
0 t- C! P7 f" ]    }
9 `. M/ O' e3 R4 p  ],
8 c( d1 L  c9 Q  "ttl": 0,
3 h) B3 j/ H" K- y3 M  "time_range": 0
7 w, b8 ]0 t. g6 ^) H}) v, }0 [& ^9 Y! @. `

/ n  A0 ?) K7 e3 Iretire
1 @( M1 u4 K5 o# j6 VretireAction结构体源代码如下:
9 P. X% g! H, V3 J( P/ _* gtype retireAction struct {
1 U) U. \  \8 T- ~! p, o: C. p7 \        bc.AssetAmount
6 ?9 ^1 I% W: q}4 Q6 b# F# j) z4 X; p: s% t' }3 d0 g
type AssetAmount struct {
8 a8 V4 y+ ?7 z5 ~2 j2 l6 C        AssetId *AssetID `protobuf:"bytes,1,opt,name=asset_id,json=assetId" json:"asset_id,omitempty"`
/ D6 r" x2 u7 Q2 f        Amount  uint64   `protobuf:"varint,2,opt,name=amount" json:"amount,omitempty"`, q0 _& ]5 i/ s# w3 {; X
}, ~' b9 N- l& q# d, f
结构字段说明如下:5 ~0 T$ L' i" l$ M/ [) s
AssetAmount 表示销毁的资产ID和对应的资产数目6 o4 B, X0 G$ u$ }& U
: m$ X9 a0 g- B: t
retireAction的json格式为:, N; f2 y2 Y9 r
{
0 M5 W, \+ I) i* ]$ U  "amount": 900000000,# ^5 N% A, l" X# g
  "asset_id": "3152a15da72be51b330e1c0f8e1c0db669269809da4f16443ff266e07cc43680",# ^/ {) V( |, R$ N6 D7 T! q9 w
  "type": "retire"* w* Z6 l1 [' R. e4 s+ R. X. K6 T
}
( f$ J( f3 H: [例如销毁一笔资产的交易示例如下:
. \- p) `" {$ s+ Z8 C( f7 @7 c(该交易表示通过账户的方式将100000000neu的BTM资产销毁, retire表示销毁指定数量的资产)
0 ~4 f  j8 ^- K: a, q{7 n5 ~. I: s$ ]( X, e. ]7 i, X
  "base_transaction": null,
- `7 w( s4 `4 D3 A) p  "actions": [
% I3 r2 B" k' B; V6 g( y+ b$ i    {
5 u3 v, }6 S! J3 {& Y: G      "account_id": "0ER7MEFGG0A02",9 J4 o, x# K* A( ~9 b9 N: H  [
      "amount": 120000000,0 q. S1 z3 }& u
      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
; M4 R+ X# G. L& Z4 A* {+ O( O      "type": "spend_account"2 u8 s. _0 U7 s/ c; O. u' T$ M# f
    },3 I2 [' A5 @8 Z4 h
    {% s8 ^0 x: z( N+ m3 g3 A
      "amount": 100000000,% J* S+ n( N! p6 l
      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",1 `# a% M0 @6 ?0 V
      "type": "retire": ^; B' p5 n$ B0 b+ [& S1 ~
    }  y1 `; Z- J4 k/ K8 |1 ~0 g+ S
  ],6 [7 V- e4 h& k
  "ttl": 0,
% `3 u7 S, m# R4 i* y0 q  "time_range": 0
% |% G+ H) @8 k}
7 b0 K) x  N% D( G) Y+ P5 v5 o3 N. a! W
build-transaction的输入构造完成之后,便可以通过http的调用方式进行发送交易,构建交易请求成功之后返回的json结果如下:& A( D* ?; x7 l- K* _( s+ u
{1 _* Y2 Q9 |+ P. R3 g2 {
  "allow_additional_actions": false,' I* Z% B  ?  I3 ]0 X. _# V1 S( n' O
  "raw_transaction": "070100020161015f1190c60818b4aff485c865113c802942f29ce09088cae1b117fc4c8db2292212ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8099c4d599010001160014a86c83ee12e6d790fb388345cc2e2b87056a077301000161015fb018097c4040c8dd86d95611a13c24f90d4c9d9d06b25f5c9ed0556ac8abd73442275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f80a094a58d1d0101160014068840e56af74038571f223b1c99f1b60caaf456010003013effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80bfffcb9901011600140b946646626c55a52a325c8bb48de792284d9b7200013e42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f9d9f94a58d1d01160014c8b4391bab4923a83b955170d24ee4ca5b6ec3fb00013942275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f6301160014366b275ed9b2266b645cf1b8be51009cc3b260e100",
8 N. ]$ E8 Z; G* A  "signing_instructions": [
5 D( S  U2 k! ~6 ]/ U: T    {2 X+ t: t0 A) i6 ^, v9 O) F3 k
      "position": 0,! ^  U: P6 L3 p% J
      "witness_components": [
3 i& D# N2 }, A$ f/ h. c3 v        {$ E$ }/ s' o) g6 [
          "keys": [
" n2 c, C' `. K; z% [            {
+ p" U- Q( `/ p" K8 K% [+ K              "derivation_path": [
. J! A( [: W5 G0 t                "010100000000000000",( C$ s( X/ ]* C& ?
                "0100000000000000"
, K& `/ a& @9 F1 K0 ~              ],/ h5 c! Q& v5 h5 b, f
              "xpub": "de0db655c091b2838ccb6cddb675779b0a9a4204b122e61699b339867dd10eb0dbdc926882ff6dd75c099c181c60d63eab0033a4b0a4d0a8c78079e39d7ad1d8"
# \, \$ o6 _8 u6 m            }
' J) C. }) u! H! Y          ],
  u' U6 Y$ U1 ^6 f          "quorum": 1,
! @/ [5 Q7 l/ p+ S( T. A          "signatures": null,8 g6 }, x* @3 n) q, n" u7 }
          "type": "raw_tx_signature"* P2 d0 @7 S6 A( L1 M9 T9 N
        },6 Q3 X$ h9 G" ?$ X/ P4 [
        {' v. f5 {2 {! @4 z( p9 o
          "type": "data",) ^2 x- v" R8 t. h1 C- D
          "value": "d174db6506e35f2decb5be148c2984bfd0f6c67f043365bf642d1af387c04fd5"4 @: i* o- a6 a9 @
        }$ R% N4 a/ G0 D% B% T3 [& M# j
      ]( {  L) Q- j; E  T8 S8 T
    },8 E0 u' G: R9 L% M
    {) M. n6 d# _0 l7 n
      "position": 1,% h) T0 G" b( F& B/ W- ~  x
      "witness_components": [
- G9 d0 F, {* [        {
' z6 S% V' ?3 T          "keys": [3 z$ z5 j  g, \. i  N% S
            {8 k( A" x8 Z7 }/ j6 }: z
              "derivation_path": [
% O8 q" ^4 O/ h3 I4 \4 s, [7 E                "010100000000000000",( E% u7 N& V4 T2 i! o6 i% w/ P
                "0800000000000000"
3 n5 Q9 A. ]5 H9 E              ],% S0 s% X5 w, ^( \, r7 C/ N6 k
              "xpub": "de0db655c091b2838ccb6cddb675779b0a9a4204b122e61699b339867dd10eb0dbdc926882ff6dd75c099c181c60d63eab0033a4b0a4d0a8c78079e39d7ad1d8"
! J6 D7 l7 G0 q            }4 O2 J2 C4 v& o
          ],6 j5 \: Q) e) o2 E5 F2 k0 b' o
          "quorum": 1,
/ _+ I, h" P) w, e4 I! Z          "signatures": null,
. ?3 U5 d. p( b6 y/ V4 t7 ~          "type": "raw_tx_signature", k0 x9 |8 A- Y9 h) |& n
        },
' T# ]  T: I( V' w        {6 X( M7 i$ T0 i( M$ k2 F+ g
          "type": "data",  H" A; I! W+ G* V
          "value": "05cdbcc705f07ad87521835bbba226ad7b430cc24e5e3f008edbe61540535419", [. p# ~% A1 M8 t
        }: w  O5 `) S. E! A2 V- b* Q! |
      ]& O/ T+ C" c/ A& D
    }
" H# A9 {* [, ?1 u* A  ]
: W0 x  }$ P, F- o. @, S$ Q}
2 O  u( _, }. e+ N$ K对应响应对象的源代码如下:
" z# U6 J5 |) A1 @8 l7 S/ v// Template represents a partially- or fully-signed transaction.$ P& _1 T9 J( O1 a/ ~' ^! j
type Template struct {  M7 c$ A2 t' d7 E5 \: ?% c
        Transaction         *types.Tx             `json:"raw_transaction"`
' l7 f( o/ S" A6 n        SigningInstructions []*SigningInstruction `json:"signing_instructions"`( o# O, n) L# ^/ y, f& m
        // AllowAdditional affects whether Sign commits to the tx sighash or# `0 j* Q! X" b! j* {
        // to individual details of the tx so far. When true, signatures
5 i  H& i- s! `        // commit to tx details, and new details may be added but existing5 d3 I9 ~  Q* I2 H* F" r
        // ones cannot be changed. When false, signatures commit to the tx
+ ^2 D, E- B- i' ]: ]        // as a whole, and any change to the tx invalidates the signature.
; k& x" w" f" d6 s4 l        AllowAdditional bool `json:"allow_additional_actions"`4 `8 f8 k* y; F; w% l9 i( Y8 q2 X
}
4 g; x, n9 m+ b3 g. I9 z结构字段说明如下:
8 ^# p( g5 v5 l" y7 z+ h" a  MTransaction 交易相关信息,该字段包含TxData和bc.Tx两个部分:
6 S7 [/ ^/ J6 z0 @TxData 表示给用户展示的交易数据部分,该部分对用户可见
0 }0 b5 |* X8 F( d4 r0 FVersion 交易版本
( j. F8 G0 [8 C8 A6 \' dSerializedSize 交易序列化之后的size, g7 H" z4 [5 a. N. G9 [4 N' l+ @
TimeRange 交易提交上链的最大时间戳(区块高度)(主链区块高度到达该时间戳(区块高度)之后,如果交易没有被提交上链,该交易便会失效)
: T6 Y% w6 T+ B, [- L0 W- k7 KInputs 交易输入
. y8 ]2 m3 L) d' g0 x8 G. q1 IOutputs 交易输出0 d! l. `3 h6 j! d: I5 w
bc.Tx 表示系统中处理交易用到的转换结构,该部分对用户不可见,故不做详细描述2 }0 k3 `8 `: T7 _
SigningInstructions 交易的签名信息; o) O# i2 N. q7 v) L
Position 对input action签名的位置7 T1 A4 q/ W1 J+ q7 C
WitnessComponents 对input action签名需要的数据信息,其中build交易的signatures为null,表示没有签名; 如果交易签名成功,则该字段会存在签名信息。该字段是一个interface接口,主要包含3种不同的类型:- u2 g; n7 y1 c
SignatureWitness 对交易模板Template中交易input action位置的合约program进行哈希,然后对hash值进行签名
) Q9 P. G/ X  k( w" M- xsignatures (数组类型)交易的签名,sign-transaction执行完成之后才会有值存在( j4 }  Q* v# W8 K) v3 F9 @" _- N2 n, G% V
keys (数组类型)包含主公钥xpub和派生路径derivation_path,通过它们可以在签名阶段找到对应的派生私钥child_xprv,然后使用派生私钥进行签名% d1 y; H% v& I! l: |7 m$ y
quorum 账户key 的个数,必须和上面的keys的长度相等。如果quorum 等于1,则表示单签账户,否则为多签账户
- |0 y& G6 v" p- k" K( a$ E  L! e+ xprogram 签名的数据部分,program的hash值作为签名数据。如果program为空,则会根据当前交易ID和对应action位置的InputID两部分生成一个hash,然后把它们作为指令数据自动构造一个program5 F* o0 @9 j' M! o5 U
RawTxSigWitness 对交易模板Template的交易ID和对应input action位置的InputID(该字段位于bc.Tx中)进行哈希,然后对hash值进行签名# N4 u7 p* {+ A9 _; A- G7 L
signatures (数组类型)交易的签名,sign-transaction执行完成之后才会有值存在
$ C+ k% V+ B4 o' Vkeys (数组类型)包含主公钥xpub和派生路径derivation_path,通过它们可以在签名阶段找到对应的派生私钥child_xprv,然后使用派生私钥进行签名
/ @) X# a6 E" v9 O# ^quorum 账户key的个数,必须和上面的keys 的长度相等。如果quorum 等于1,则表示单签账户,否则为多签账户8 R& z/ N4 ?% ?8 ]- Z
DataWitness 该类型无需签名,验证合约program的附加数据
$ {7 J# |* X8 h7 d1 L& o' Q$ t9 O" S5 ^" Y9 S$ s) H" s
AllowAdditional 是否允许交易的附加数据,如果为true,则交易的附加数据会添加到交易中,但是不会影响交易的执行的program脚本,对签名结果不会造成影响; 如果为false,则整个交易作为一个整体进行签名,任何数据的改变将影响整个交易的签名  ~7 u& w: y$ q* C( o1 Y/ a4 K

6 [! S) _, t* y4 _3 v: j估算手续费
: k) w) U! U- K5 R# g估算手续费接口estimate-transaction-gas是对build-transaction的结果进行手续费的预估,估算的结果需要重新加到build-transaction的结果中,然后对交易进行签名和提交。其主要流程如下:  q8 _6 i: ?4 ~( \' _8 T6 ~1 \
  build - estimate - build - sign - submit
9 ?: b8 t  }* F3 b" v估算手续费的输入请求json格式如下:
, p3 C! E1 C" Q  }& L: I. j- U( ^{
4 h$ G& X0 s1 X7 J2 k: `  "transaction_template": {5 }! P0 g. ^( l8 e- i
    "allow_additional_actions": false,
8 ?- m, G& d& h- o! p    "raw_transaction": "070100020161015f1190c60818b4aff485c865113c802942f29ce09088cae1b117fc4c8db2292212ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8099c4d599010001160014a86c83ee12e6d790fb388345cc2e2b87056a077301000161015fb018097c4040c8dd86d95611a13c24f90d4c9d9d06b25f5c9ed0556ac8abd73442275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f80a094a58d1d0101160014068840e56af74038571f223b1c99f1b60caaf456010003013effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80bfffcb9901011600140b946646626c55a52a325c8bb48de792284d9b7200013e42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f9d9f94a58d1d01160014c8b4391bab4923a83b955170d24ee4ca5b6ec3fb00013942275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f6301160014366b275ed9b2266b645cf1b8be51009cc3b260e100",1 C; s3 \6 ?  G
    "signing_instructions": [6 G9 x$ A2 H" b9 A7 W
      {' z9 ]) H  k+ `" R( M% e
        "position": 0,) U/ P& S4 e  [6 h9 V+ ~9 p
        "witness_components": [
, ~9 L9 |& {% @3 D. O1 C6 ?          {: p9 m  s. ~9 q& l& ]& n3 T2 q
            "keys": [' G3 E& P2 U7 d9 n2 V. b6 Q5 E
              {
6 z* Y, h5 @4 D                "derivation_path": [8 x5 k0 n6 f+ @! a
                  "010100000000000000",( t  s( w. V" [6 W& o
                  "0100000000000000"
6 N, J2 q+ N$ Y/ t5 P# z                ],/ _4 v- q, w! Y6 R
                "xpub": "de0db655c091b2838ccb6cddb675779b0a9a4204b122e61699b339867dd10eb0dbdc926882ff6dd75c099c181c60d63eab0033a4b0a4d0a8c78079e39d7ad1d8"
" @& Q& U5 R# {; y; Z              }
# V  B+ y1 X5 x2 f            ],
! {% Q% ?, N3 n. `+ ?8 ~- B1 d            "quorum": 1,
/ N1 @5 g) v# v1 l0 q            "signatures": null,$ n, V$ ~# ?4 ^3 X
            "type": "raw_tx_signature"
0 Y+ w1 s- C" G; c          },8 ~; h  e# O3 N5 [$ V( K
          {
4 I5 m! z& q$ `+ L: w( }: ^            "type": "data",5 F( N- a; `1 O+ o
            "value": "d174db6506e35f2decb5be148c2984bfd0f6c67f043365bf642d1af387c04fd5"6 K; I$ K4 b& q, J
          }
7 C, k& q1 e% v1 `# ?5 p        ]& l8 J: L, T0 L' _! u
      },
% [! ^* `7 u/ g# \( a& k      {' M& l5 i5 |6 r. F, t* s
        "position": 1,: E" R! L; j" P1 t9 s7 d2 t
        "witness_components": [% T8 p" m# o4 {
          {5 o' \4 T( d$ Z6 F) V" h
            "keys": [2 F7 F" k: T0 i7 M* _- Z$ y) y
              {
7 u0 D; k- v- A! s* i                "derivation_path": [2 P' M8 u3 q  [% N7 n
                  "010100000000000000",+ `  E2 j+ g; E# p' f
                  "0800000000000000"
3 \) z' j  v$ g9 Z1 W( P1 Y                ],# l+ D& \0 S  z7 N+ k. C$ r0 x& X
                "xpub": "de0db655c091b2838ccb6cddb675779b0a9a4204b122e61699b339867dd10eb0dbdc926882ff6dd75c099c181c60d63eab0033a4b0a4d0a8c78079e39d7ad1d8"
, D. y8 @8 c) K0 e- y              }
( U/ K* c' G8 g" x2 x+ C+ ^7 w            ],
  `( a0 m3 |2 B6 F) q, ~( ]            "quorum": 1,
: A' q) _& H8 o, k1 ?6 k0 D            "signatures": null,
6 o0 y# M+ |; m            "type": "raw_tx_signature"
0 m( W9 Z! c% F" J. v! J' U, G- q          },9 a& M  `: w& [& \+ m
          {
* o& g0 s3 C3 T: l& u            "type": "data",5 O# q3 ^' }7 u
            "value": "05cdbcc705f07ad87521835bbba226ad7b430cc24e5e3f008edbe61540535419"
, G0 e: @8 W  \, _$ ]! r          }% v6 l1 h8 Y4 L! e. F  h
        ]" X& D/ }) I! T6 O  N
      }; u) ~2 d, D" [/ I
    ]
6 \& V; R9 I6 d  }
3 N' X6 q$ p) b; y' A& |# T0 `2 r+ o# F}
5 s  _/ d% c' Y2 x5 g: P对应响应对象的源代码如下:2 Y, _# j+ e" z8 S3 X+ k* C
type request struct{; }% ]3 w& H$ }6 r3 W
        TxTemplate txbuilder.Template `json:"transaction_template"`
, v: ]$ m1 v, {0 k, L  ~$ u}- L6 a+ W9 p& ~0 K$ q! |
// Template represents a partially- or fully-signed transaction.
; m, ^5 O- f6 k4 ftype Template struct {( R* ?- _8 R) b
        Transaction         *types.Tx             `json:"raw_transaction"`
' x2 F! Y$ X  S- }; N) p3 H1 S( z        SigningInstructions []*SigningInstruction `json:"signing_instructions"`
* ?1 Q7 r! K! q        // AllowAdditional affects whether Sign commits to the tx sighash or+ d7 }+ N- t2 W5 `
        // to individual details of the tx so far. When true, signatures5 {5 v6 y5 ]* J/ ^. F7 `
        // commit to tx details, and new details may be added but existing( t  ~7 w  x+ z
        // ones cannot be changed. When false, signatures commit to the tx
6 {/ ]1 d  e" M% e+ l$ V" [        // as a whole, and any change to the tx invalidates the signature.
% f/ V5 P6 A: R/ P        AllowAdditional bool `json:"allow_additional_actions"`% T/ A' b5 H6 c9 K0 T+ m7 h% x
}5 R6 X# l5 x9 x& I
其中TxTemplate相关字段的说明见build-transaction的结果描述
$ F# e8 j9 j8 y& |( o调用estimate-transaction-gas接口成功之后返回的json结果如下:7 @/ \# F8 w1 Y/ `6 ?& {" }- x* C
{
5 d9 N7 f' Y. n# Q2 p# o$ ?2 G  "total_neu": 5000000,
* D- h  W* i* ]9 k9 b  I( {  "storage_neu": 3840000,4 d( p" o9 ~. M9 V6 o# s& b
  "vm_neu": 1419000
0 u9 }$ g6 `4 P6 y5 p4 }5 o}- y- W  W' j6 q& D/ ^0 l- M& ?: ^7 I
对应响应对象的源代码如下:
6 @. B( u. F5 w2 U. T4 D: [/ l// EstimateTxGasResp estimate transaction consumed gas5 e( S* I& ^. g9 H* O/ H4 O
type EstimateTxGasResp struct {
# K- H, Q" u$ g) v- `2 f; ^$ j        TotalNeu   int64 `json:"total_neu"`1 T; f. u& ~3 B0 s2 T( _
        StorageNeu int64 `json:"storage_neu"`" ~' R0 j8 F% N" P% e6 _
        VMNeu      int64 `json:"vm_neu"`
& C5 K2 t: h9 }1 Z+ ]}
5 M" t* j) q6 g& ]; z4 ?0 m结构字段说明如下:
' f" I3 ]5 {6 h" F/ Z4 Y3 uTotalNeu 预估的总手续费(单位为neu),该值直接加到build-transaction的BTM资产输入action中即可
9 ?2 V6 m* l4 r$ wStorageNeu 存储交易的手续费
  ~, L% i$ A+ d+ TVMNeu 运行虚拟机的手续费
% o; N$ s4 a+ D1 q# k( R+ q
" r/ i/ L  J- P( D9 x. |( D2、签名交易% v* I, y5 G$ a' _5 p
API接口 sign-transaction,代码api/hsm.go#L53/ Q* l* x: `5 t4 y
签名交易的输入请求json格式如下:6 a& p* C  g2 u! M
{, O$ B/ i: y8 `% H+ U. A2 Z
  "password": "123456",+ O* U7 F' n: ]5 x8 u! x& }( Y
  "transaction": {
/ {9 o& @) e: l* M: c/ w    "allow_additional_actions": false,4 L- \% y: w8 u( s6 b
    "raw_transaction": "070100020161015f1190c60818b4aff485c865113c802942f29ce09088cae1b117fc4c8db2292212ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8099c4d599010001160014a86c83ee12e6d790fb388345cc2e2b87056a077301000161015fb018097c4040c8dd86d95611a13c24f90d4c9d9d06b25f5c9ed0556ac8abd73442275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f80a094a58d1d0101160014068840e56af74038571f223b1c99f1b60caaf456010003013effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80bfffcb9901011600140b946646626c55a52a325c8bb48de792284d9b7200013e42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f9d9f94a58d1d01160014c8b4391bab4923a83b955170d24ee4ca5b6ec3fb00013942275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f6301160014366b275ed9b2266b645cf1b8be51009cc3b260e100",  A1 h0 E5 r1 V7 f* g
    "signing_instructions": [2 D# m. W9 j: S7 v3 ?3 V6 _# [
      {
' l: Y% p. n2 C2 i/ f        "position": 0,/ _, h3 A6 q- }  w) f9 r
        "witness_components": [! @' D3 t. f6 T3 o0 N$ O
          {
+ N" D/ t7 d4 P- ^            "keys": [2 Q. n; T1 @" q6 E
              {6 h+ I5 |' Q( u5 g, `& b: M+ O! @1 ~
                "derivation_path": [
2 x1 a- I$ @' s- u/ p6 T* D                  "010100000000000000",
3 A/ J8 R# W/ u2 f0 ]                  "0100000000000000"1 `" U6 P* I4 n, T! E0 U9 {
                ],/ K6 {' @2 T# k0 a. M* Q4 t
                "xpub": "de0db655c091b2838ccb6cddb675779b0a9a4204b122e61699b339867dd10eb0dbdc926882ff6dd75c099c181c60d63eab0033a4b0a4d0a8c78079e39d7ad1d8"
- S9 D& \  V4 O' W; z! U# P" A) f/ x              }
6 r9 Z! n5 V, {( g$ `            ],0 V& y0 a5 r- F! d/ o9 p5 n' a! |1 W2 t
            "quorum": 1,
9 |" T; E$ R! y            "signatures": null,8 h! C/ P6 |: w/ v' I
            "type": "raw_tx_signature"5 ]1 d9 k; A4 g% Z
          },
" H6 o# F4 V( O5 S# y, B" ]          {
5 O4 I' ^& q2 u! Z            "type": "data",9 ^" M1 K* }8 O0 v1 y( o( C
            "value": "d174db6506e35f2decb5be148c2984bfd0f6c67f043365bf642d1af387c04fd5"( L. Y9 p$ t* j. O( H
          }4 G/ L+ @% C  a: F# o. ~9 D" ^
        ]
$ z7 N, r% t/ r/ B- `      },2 H  b2 D) Q1 _- W) l8 s
      {8 \( O1 f& c  H; j* h3 f2 u
        "position": 1,3 P* |- h# O+ ]  {
        "witness_components": [, R/ b7 e8 l* [2 z5 U3 y
          {
# N- a" N+ y2 C* b5 F8 u            "keys": [
& X4 T# n+ I/ e/ h% D, @              {
( ~. b# o* R* B6 i% h                "derivation_path": [
# J: c0 X0 M7 m6 Z0 B1 l  I: w  j                  "010100000000000000",
; n: l/ A, t+ z: u/ o0 |0 }                  "0800000000000000"
' _* J3 z& A/ h' m9 \* }1 `" |3 z                ],) ?; ~" ]5 [$ @$ ?9 T2 V
                "xpub": "de0db655c091b2838ccb6cddb675779b0a9a4204b122e61699b339867dd10eb0dbdc926882ff6dd75c099c181c60d63eab0033a4b0a4d0a8c78079e39d7ad1d8"4 x, h! R) z' x7 @, ^7 _2 l# p5 R
              }
+ V' K2 M: }- [            ],
' d; v/ z3 J! o            "quorum": 1,! @8 j) ?* w; W! r( Z5 d
            "signatures": null,3 \2 a2 e( p8 ^: g. W+ Z8 r/ }
            "type": "raw_tx_signature"
$ Z3 u5 ]3 x2 p/ m          },0 ~  q# ]8 A+ V' P1 J# B8 U) A" ]
          {
- }( @2 o8 }( b+ Q            "type": "data",, k. I; H2 g0 |5 d
            "value": "05cdbcc705f07ad87521835bbba226ad7b430cc24e5e3f008edbe61540535419"
! w& K% x  I8 Z( E          }
# ?: A3 ^* P& b1 c# {        ]0 {7 j* N8 l; z7 h' o
      }' e0 e/ ^( U  D% t' g
    ]5 b: w% f* B2 o# H' ^
  }- i" e9 m# W, x2 x6 N' w  Q+ `  N0 Z
}
9 w) D) S. v# R6 l0 ~对应请求对象的源代码如下:* G  d1 `  J, m' o5 U
type SignRequest struct {    //function pseudohsmSignTemplates request, m( ~3 F, T7 K' Q
        Password string             `json:"password"`
$ Z2 `: T& Z8 c( i6 _; L; o3 a2 ^; I        Txs      txbuilder.Template `json:"transaction"`
* E* U$ _( I: ?; N1 B- T% ~# T}
# i8 P; L! N! @$ ]  y4 H  W! ^# {% b结构字段说明如下:
% Y6 y. B* |$ G9 C% L& K- ePassword 签名的密码,根据密码可以从节点服务器上解析出用户的私钥,然后用私钥对交易进行签名
6 Q' _1 _5 |/ F/ t" a! ZTxs 交易模板,build-transaction的返回结果,结构类型为 txbuilder.Template,相关字段的说明见build-transaction的结果描述) j( ?. Y6 h" y/ m" @) s2 h9 ^

1 `) D" W# q1 e& y4 @2 v  N8 [签名交易sign-transaction请求成功之后返回的json结果如下:
+ f/ J! |/ S' H2 t{
$ s% r0 R* r  `% q; e  "sign_complete": true,; ?$ w6 ?0 s& f# F, a* A/ ^
  "transaction": {
  \4 H. ^7 t3 e3 ?. C+ I1 Y) ]    "allow_additional_actions": false,5 }9 [. h, h9 X+ r+ w2 ?
    "raw_transaction": "070100020161015f1190c60818b4aff485c865113c802942f29ce09088cae1b117fc4c8db2292212ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8099c4d599010001160014a86c83ee12e6d790fb388345cc2e2b87056a0773630240273d5fc4fb06909fbc2968ea91c411fd20f690c88e74284ce2732052400129948538562fe432afd6cf17e590e8645b80edf80b9d9581d0a980d5f9f859e3880620d174db6506e35f2decb5be148c2984bfd0f6c67f043365bf642d1af387c04fd50161015fb018097c4040c8dd86d95611a13c24f90d4c9d9d06b25f5c9ed0556ac8abd73442275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f80a094a58d1d0101160014068840e56af74038571f223b1c99f1b60caaf4566302400cf0beefceaf9fbf1efadedeff7aee5b38ee7a25a20d78b630b01613bc2f8c9230555a6e09aaa11a82ba68c0fc9e98a47c852dfe3de851d93f9b2b7ce256f90d2005cdbcc705f07ad87521835bbba226ad7b430cc24e5e3f008edbe6154053541903013effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80bfffcb9901011600140b946646626c55a52a325c8bb48de792284d9b7200013e42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f9d9f94a58d1d01160014c8b4391bab4923a83b955170d24ee4ca5b6ec3fb00013942275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f6301160014366b275ed9b2266b645cf1b8be51009cc3b260e100",
! }. J0 ~! r4 F7 m/ h1 E    "signing_instructions": [
+ X: s/ ~9 U7 y/ W) b      {8 B+ {$ ]8 K3 s; I+ T
        "position": 0,! P# }# T5 P2 K
        "witness_components": [
' e$ L7 Y" h# R, S( b  L          {
* V  c7 `0 B- W) e8 A" Y            "keys": [
8 V% J) m+ h3 ~9 [              {
9 @7 B: l" w0 h0 c! k6 v: X                "derivation_path": [
9 T& y* P" b. ?5 T. a4 F                  "010100000000000000",
; H3 d6 ^* A. J' ~( J& j' G. N  K) [                  "0100000000000000"( s7 A0 O: q1 C5 {* F8 C
                ],5 r0 O6 |" D; T4 h! G$ q3 D% _" E
                "xpub": "de0db655c091b2838ccb6cddb675779b0a9a4204b122e61699b339867dd10eb0dbdc926882ff6dd75c099c181c60d63eab0033a4b0a4d0a8c78079e39d7ad1d8"; x. |# Q  t3 ~' `
              }
, }: |& @# G7 e, v% n            ],9 D' Z' e& h% Y2 o1 u
            "quorum": 1,
! c+ n' l9 O3 q  F4 C& f4 v            "signatures": [5 z1 E5 T* Z, u  X% K
              "273d5fc4fb06909fbc2968ea91c411fd20f690c88e74284ce2732052400129948538562fe432afd6cf17e590e8645b80edf80b9d9581d0a980d5f9f859e38806"
6 h/ y+ N  u4 g# B            ],4 T* x7 K! e8 B# R% [$ J# ?
            "type": "raw_tx_signature"7 [( l! }1 X7 a9 `0 c# u- T0 D( `8 C
          },6 W8 f9 j" L. V/ O* B" E& _
          {
5 @/ {) T; d2 M) t/ s: g            "type": "data",( ^/ G" {- a5 Z5 k, a7 g3 v
            "value": "d174db6506e35f2decb5be148c2984bfd0f6c67f043365bf642d1af387c04fd5"
4 e0 l. z3 n+ s5 h3 E          }
; T+ f- @7 b# M0 A        ]
' ]3 `$ r! b: @6 G: r# a( y      },3 ~% C- W6 B$ o
      {
, S' ]4 C0 n, [' G# z. F        "position": 1,
/ ^. U# p# }8 h1 a6 r. Y3 E3 V: }        "witness_components": [
) P% _; C9 s8 k7 r" f$ Z8 F* |          {
  r$ H! O  Z) o9 p            "keys": [* Y% t& I) r* I0 {
              {% [( r; F+ p( a2 s  D. c: e, f
                "derivation_path": [& E8 T( @: R. p0 ]& E" b! b- b# b
                  "010100000000000000",
$ I/ b( W8 R8 r                  "0800000000000000"
: @0 y9 A: D+ e+ \: h% w                ],/ `. L0 R0 N5 p$ H, k
                "xpub": "de0db655c091b2838ccb6cddb675779b0a9a4204b122e61699b339867dd10eb0dbdc926882ff6dd75c099c181c60d63eab0033a4b0a4d0a8c78079e39d7ad1d8"
, d! Q0 @( c; x. o1 v& l              }$ T3 A6 ]- i  F5 V5 g+ B9 x
            ],/ T# N; v0 J& }8 I7 C. N8 }. F
            "quorum": 1,
( w6 \' C. K4 E0 n0 r            "signatures": [# {3 X, X) _% \, u+ D0 ^
              "0cf0beefceaf9fbf1efadedeff7aee5b38ee7a25a20d78b630b01613bc2f8c9230555a6e09aaa11a82ba68c0fc9e98a47c852dfe3de851d93f9b2b7ce256f90d"( ]8 J! Z( z* b& ], R
            ],1 C8 `% x! u* L1 p5 z
            "type": "raw_tx_signature"
0 J0 o% N7 B* f! U- W5 {          },0 S* S& i* ~- s. R( y4 Q
          {/ N' {' k; D6 K- g8 B; g' w. t' M
            "type": "data",
4 p2 K6 c5 z' R& w! N            "value": "05cdbcc705f07ad87521835bbba226ad7b430cc24e5e3f008edbe61540535419"
1 e5 j- `' m1 k4 v8 I2 w0 ~          }
+ C: v" p$ M% q' P, {* i# J8 C        ]
7 o, h! h/ R4 d4 u" H( d* [" H7 u" u      }  x) |$ G! G. f' [
    ]
2 x4 e! k1 |9 ]9 s7 E; ^0 a4 [0 E  }
! ?. \" v7 c) h$ q, U* h# U& x+ t}
& [0 F+ {  x* S7 a对应响应对象的源代码如下:
+ @6 z( _3 g0 B4 Ttype signResp struct {
" W4 J; s  f7 e) W9 w2 i        Tx           *txbuilder.Template `json:"transaction"`
$ N5 F* @3 J$ P% C. Z3 B! Q        SignComplete bool                `json:"sign_complete"`
) C" Y, m, M3 G, r$ r& n}2 {( @0 R/ S* H  [
结构字段说明如下:, ]+ E3 c2 x% n+ ^! E$ D
Tx 签名之后的交易模板txbuilder.Template,如果签名成功则signatures会由null变成签名的值,而raw_transaction的长度会变长,是因为bc.Tx部分添加了验证签名的参数信息7 M% b6 j# \, `5 K* w& E* f- k0 U3 Q
SignComplete 签名是否完成标志,如果为true表示签名完成,否则为false表示签名未完成,单签的话一般可能为签名密码错误; 而多签的话一般为还需要其他签名。签名失败只需将签名的交易数据用正确的密码重新签名即可,无需再次build-transaction构建交易3 X' }- z- u6 ^' z; G, Y

$ \+ e5 N: B/ M) `! Y0 M3、提交交易3 `4 u8 Z! w. p1 b# t8 g" h6 g
API接口 submit-transaction,代码api/transact.go#L135! q6 e  r! N5 N( U. r3 W9 `( I
提交交易的输入请求json格式如下:1 G  ]9 C2 H) f
{3 }1 {2 d& I; j/ J! E1 ]
  "raw_transaction": "070100020161015f1190c60818b4aff485c865113c802942f29ce09088cae1b117fc4c8db2292212ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8099c4d599010001160014a86c83ee12e6d790fb388345cc2e2b87056a0773630240273d5fc4fb06909fbc2968ea91c411fd20f690c88e74284ce2732052400129948538562fe432afd6cf17e590e8645b80edf80b9d9581d0a980d5f9f859e3880620d174db6506e35f2decb5be148c2984bfd0f6c67f043365bf642d1af387c04fd50161015fb018097c4040c8dd86d95611a13c24f90d4c9d9d06b25f5c9ed0556ac8abd73442275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f80a094a58d1d0101160014068840e56af74038571f223b1c99f1b60caaf4566302400cf0beefceaf9fbf1efadedeff7aee5b38ee7a25a20d78b630b01613bc2f8c9230555a6e09aaa11a82ba68c0fc9e98a47c852dfe3de851d93f9b2b7ce256f90d2005cdbcc705f07ad87521835bbba226ad7b430cc24e5e3f008edbe6154053541903013effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80bfffcb9901011600140b946646626c55a52a325c8bb48de792284d9b7200013e42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f9d9f94a58d1d01160014c8b4391bab4923a83b955170d24ee4ca5b6ec3fb00013942275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f6301160014366b275ed9b2266b645cf1b8be51009cc3b260e100"
; p# u6 j9 u3 K! m( ?: B}
: r( f! i3 H* c! k5 \  m$ I对应源代码的请求对象如下:
. \- O& X7 N8 w/ S: b, ?, S0 Rtype SubmitRequest struct {    //function submit request
" b0 u' ^- @0 J3 u  Z' h# W" A( q* b        Tx types.Tx `json:"raw_transaction"`
% x" V( Z' A# q7 P, O}
5 h9 Y( Y& z6 R+ z6 C( w. k结构字段说明如下:
7 l( R: m5 Z# \& }* e$ C  lTx 签名完成之后的交易信息。这里需要注意该字段中的raw_transaction不是签名交易sign-transaction的全部返回结果,而是签名交易返回结果中transaction中的raw_transaction字段。: G3 g% d% N! F6 V! x' s' R

5 O3 v4 f; K' v1 L6 ksubmit-transaction请求成功之后返回的json结果如下:
* o* R1 L+ K: }5 k{
. n) W4 q& O5 q: d8 b4 b% U  "tx_id": "2c0624a7d251c29d4d1ad14297c69919214e78d995affd57e73fbf84ece361cd"0 E1 a1 Q( }; I: M& d
}
3 S- \& g" R/ A9 v% J! m对应源代码的响应对象如下:
# \% V0 H) p  S# Ytype submitTxResp struct {  |  Z( V( P) M7 [6 W4 \
        TxID *bc.Hash `json:"tx_id"`; C+ `  Z8 R, b$ p' j
}2 O: o& k. {8 k4 S- R
结构字段说明如下:
2 U% M4 z6 i2 X! Q3 ]' }; PTxID 交易ID,当交易被提交到交易池之后会显示该信息,否则表示交易失败4 K9 l2 ~  A2 T3 e( a% _

, e& S: C' H- T! f8 w, u, ~
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

V刘晨曦 初中生
  • 粉丝

    0

  • 关注

    3

  • 主题

    14