Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

V刘晨曦
113 0 0
比原项目仓库:9 t* o# S- H2 N3 ^. l. S( w2 a
Github地址:https://github.com/Bytom/bytom
* a: T0 K# i5 w, ?Gitee地址:https://gitee.com/BytomBlockchain/bytom- t& C: u# E& `
该部分主要针对用户使用bytom自带的账户模式发送交易/ {. c4 C" k9 n& F8 P! M
1、构建交易
# @+ W, x2 p6 r  x4 V& B- K$ `" m- h  uAPI接口 build-transaction,代码api/transact.go#L120
, ?4 H* ~: M9 r- j7 k; [以标准的非BTM资产转账交易为例,资产ID为全F表示BTM资产,在该示例中BTM资产仅作为手续费,该交易表示花费99个特定的资产到指定地址中。其中构建交易的输入请求json格式如下:
* \- [. ?/ o4 w( _; q) a7 s{+ U6 [9 L/ }% p# v% u
  "base_transaction": null,
) n% D3 t0 a8 Z  "actions": [
3 ^/ w5 f7 I' W    {6 n6 p" m( o0 m1 G& d% V& \
      "account_id": "0ER7MEFGG0A02"," z, I# I2 T# s1 P  `7 ^
      "amount": 20000000,
+ j7 b4 g2 |6 r      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",  x% w% U( B: n, c& Y) t
      "type": "spend_account"8 @5 O, N! A) a9 y7 }5 g
    },$ \4 Y( K# q4 v5 E0 K
    {& O0 ^  h+ ]8 I  l$ T
      "account_id": "0ER7MEFGG0A02",
  D& `2 ?' h( e/ S      "amount": 99,3 X" w0 V' E  I2 L( V8 C4 Y, g
      "asset_id": "42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f",: z" F2 B, b% e6 Y1 v% g+ P
      "type": "spend_account"
& H: _8 @' p; s" r; ^    },' ?6 T4 N+ ?1 P$ R  q( O
    {# j: U: H) t. g4 d  E
      "amount": 99,5 D) `5 Y1 p& f% m! h' k
      "asset_id": "42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f",9 f- Z! U, l7 b0 g, n8 V
      "address": "sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me",% X6 D3 L& i/ _/ W8 z( c
      "type": "control_address"& d/ U% z6 R, p( A
    }' z* g) q( s/ e3 n
  ],
9 `# W7 |% }- q  "ttl": 0,
7 l) [$ @$ ?  u  "time_range": 0( m: R; L+ Z/ Z2 z2 d. ?5 P
}
) y6 t$ W" k% s2 X; p对应源代码的请求对象如下:
" t6 v: P) z% i1 w// BuildRequest is main struct when building transactions
9 v( L; G5 t0 K: t7 x9 a( e, Btype BuildRequest struct {5 ], o- e3 T# _% A0 ^
        Tx        *types.TxData            `json:"base_transaction"`
& {. ?4 p; S. n2 U1 D        Actions   []map[string]interface{} `json:"actions"`
5 f! e5 O+ w5 R+ \/ K# A/ n        TTL       json.Duration            `json:"ttl"`' v8 x- S/ w) c( g) p* F* {7 w
        TimeRange uint64                   `json:"time_range"`
9 ~6 L& W) ?6 ~# p1 `1 H: {  E}* z' a: u0 r/ Q# w/ C% _0 i6 T
结构字段说明如下:
) P: v! I! Z/ Y6 M- STx 交易的TxData部分,该字段为预留字段,为空即可
3 {. E" _( n9 t$ aTTL 构建交易的生存时间(单位为毫秒),意味着在该时间范围内,已经缓存的utxo不能用于再一次build交易,除非剩余的utxo足以构建一笔新的交易,否则会报错。当ttl为0时会被默认设置为600s,即5分钟; A  K- ]: k4 Z% M! N
TimeRange 时间戳,意味着该交易将在该时间戳(区块高度)之后不会被提交上链,为了防止交易在网络中传输延迟而等待太久时间,如果交易没有在特定的时间范围内被打包,该交易便会自动失效6 y, _) N0 a7 r  _7 p/ S% ~
Actions 交易的actions结构,所有的交易都是由action构成的,map类型的interface{}保证了action类型的可扩展性。其中action中必须包含type字段,用于区分不同的action类型,action主要包含input和output两种类型,其详细介绍如下:
0 @  [' r% X7 L$ G4 }input action 类型:9 ?3 }3 ]8 m" P: n0 i
issue 发行资产
) \1 i, r3 q+ ~+ M0 }spend_account 以账户的模式花费utxo/ @* ?+ M% x9 M) l4 i
spend_account_unspent_output 直接花费指定的utxo7 ?+ {; h: @" r
output action 类型:- s/ t" \; }4 @6 T' F. F
control_address 接收方式为地址模式
. z* |) Y0 c5 F$ _6 |+ tcontrol_program 接收方式为(program)合约模式
+ o" O1 N0 |% U* J* z9 d9 P' Aretire 销毁资产
2 @  c, ]) {+ T6 u( W/ ?1 N2 p& ]
# Y( ~6 r& m, r* L3 Z- y" `7 l: o, ~" q# v2 x& F+ K5 S

, e8 X. b& \, Z# E9 }, P注意事项:
, ?$ G( b) D# ~一个交易必须至少包含一个input和output(coinbase交易除外,因为coinbase交易是由系统产生,故不在此加以描述),否则交易将会报错。) Y9 t$ S$ \% j' _2 g( H
除了BTM资产(所有交易都是以BTM资产作为手续费)之外,其他资产在构建input和output时,所有输入和输出的资产总和必须相等,否则交易会报出输入输出不平衡的错误信息。# b; K, Z2 h1 E) s% b5 g7 ~- J
交易的手续费: 所有inputs的BTM资产数量 - 所有outputs的BTM资产数量% \( X3 o7 w, l/ Q5 c8 w/ ?
交易中的资产amount都是neu为单位的,BTM的单位换算如下:1 BTM = 1000 mBTM = 100000000 neu- m* b1 i. o5 G; b- ^4 z
3 p# s& J. [- h! r' P6 W$ A  z
action简介% o$ _9 Y+ T* g$ @# ^
下面对构建交易时用到的各种action类型进行详细说明:# X7 d4 [* v+ \% z2 X2 C; F
issue
6 d* [' }" w* @8 }: v3 GissueAction结构体源代码如下:
2 N. ^1 m4 A  A$ q1 V3 ^0 [. otype issueAction struct {
% i, D. ]4 h. N$ K/ ^& D* G        assets *Registry6 ?: ]% X# w! t; c% I
        bc.AssetAmount2 L4 |) N: z6 @. w
}
* u, P1 k) w! s1 `' otype AssetAmount struct {
3 j& F3 O8 l! H! w5 _+ D( N& Q        AssetId *AssetID `protobuf:"bytes,1,opt,name=asset_id,json=assetId" json:"asset_id,omitempty"`
9 a7 c, M' v" R7 n; M2 S        Amount  uint64   `protobuf:"varint,2,opt,name=amount" json:"amount,omitempty"`- a% H9 N* g9 [9 t# M) \5 ]! W
}, c2 Y4 Z* {& \
结构字段说明如下:! j, w8 W1 w6 x, h$ O5 v$ Z: W  a; p
assets 主要用于资产的管理,无需用户设置参数
- d, x$ j$ `6 B+ {8 K, |* A. ~  s) }AssetAmount 表示用户需要发行的资产ID和对应的资产数目,这里的AssetID需要通过create-asset创建,并且这里不能使用BTM的资产ID3 z% T/ m. M# y

) n9 d% f! Y' w$ m# n5 [2 ]issueAction的json格式为:1 E/ H  |3 t0 ^) Q# }: O3 e* w
{: [/ L  Y6 P8 D; b+ m& ~
  "amount": 100000000,$ E! z* L2 f9 ~. X/ ?, W! A
  "asset_id": "3152a15da72be51b330e1c0f8e1c0db669269809da4f16443ff266e07cc43680",4 p2 N4 d. n# T1 p. q
  "type": "issue"
. m$ G% W) ?  R3 h; M0 x- ], F8 d}
5 ^) d7 J7 `: I/ d2 ~3 _. N/ }/ |例如发行一笔资产的交易示例如下:
) B8 Z! |) |. @0 U1 c8 P0 j9 G8 E(该交易表示发行数量为900000000个assetID的42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f的资产到接收地址sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me中, 其中手续费为20000000neu的BTM资产)
6 f" P6 ?' s9 x0 e# J9 q1 s: y( M{
, S3 `) j, u& Y' ~  "base_transaction": null,
; D& E( w8 y" J# C- v+ w: ^" k$ V  "actions": [
; Y) ?% [( }" |& b& d5 V. R1 S    {
& i6 D3 S7 h% U: v* K3 v: _0 Y  N      "account_id": "0ER7MEFGG0A02",0 o. |. m! ?4 i! D4 G7 N7 |
      "amount": 20000000,
$ q$ E) \: |7 {0 ~8 ~, F$ y4 R      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",6 ~* \- }% c' P" q$ _1 q* \* {
      "type": "spend_account"
+ |& H- o: ?# ?$ n' f    },
2 P& X+ Z* B" a1 n/ Y' U    {
, \; o6 r# S$ l      "amount": 900000000,5 `% k( d; ^6 ^; w5 s7 s) R/ r
      "asset_id": "42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f",
6 e' u) B  q5 b" q9 I      "type": "issue"
# f0 k6 I, j4 ]6 N1 ~1 O    },
/ F$ s8 z) K4 H! e    {
2 Z. O' g  S9 D) A, R) w, c      "amount": 900000000,' R4 y0 C! h# D0 M
      "asset_id": "42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f",! n0 Y: T8 P+ t! A
      "address": "sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me",: g/ G3 X$ Q: ]) o! a  f: V
      "type": "control_address"
0 t6 T0 l; L5 j    }2 K0 X& s5 c! u- j* y# _
  ],
* L/ w! t: B" d1 H  "ttl": 0,
& \5 i) C5 D; i  q0 m1 m9 E  "time_range": 08 Y* u- c7 A6 W# {
}
7 C* r$ f6 P6 ^0 _! a$ }1 }+ n1 P) N# x
spend_account
$ Y" o( W1 t& m9 l! K! Y2 HspendAction结构体源代码如下:
* I5 B% h0 q0 U  v; [" R- s! ftype spendAction struct {- X8 R' a, o% f6 |6 B+ ]' L% u
        accounts *Manager
4 H' ?6 D9 e+ G7 y        bc.AssetAmount5 J& A# k! P2 S: `/ S- M! C% ?1 d
        AccountID   string  `json:"account_id"`2 X; W" @& B9 O) }3 i
        ClientToken *string `json:"client_token"`
7 V4 i% [1 G% s8 D" |$ e}
# e# j2 D; \+ u8 g% ^type AssetAmount struct {3 K9 Y/ X, U3 b5 T8 c5 s$ J
        AssetId *AssetID `protobuf:"bytes,1,opt,name=asset_id,json=assetId" json:"asset_id,omitempty"`  f  [6 Y2 x+ L9 N# q* P5 g- p
        Amount  uint64   `protobuf:"varint,2,opt,name=amount" json:"amount,omitempty"`  ^8 _  r/ [' ~  K; `
}( y+ Q& J7 J4 }: }/ n4 k
结构字段说明如下:
& _0 d3 C7 K. Q" z5 @% D% w+ Faccounts 主要用于账户的管理,无需用户设置参数* E( |/ ?5 \* ?# C1 Z5 V0 w
AccountID 表示需要花费资产的账户ID
; p) c* e$ ]' B2 z+ D- z) b4 qAssetAmount 表示花费的资产ID和对应的资产数目
7 s; V7 o9 a8 D3 b( l$ r* ~ClientToken 表示Reserve用户UTXO的限制条件,目前不填或为空即可
, l" x2 L/ O$ X) N# N6 n5 Q4 k% A* k# s$ P, a
spendAction的json格式为:& z- i% h. q5 I$ j& _
{
- n9 G2 u0 @% `4 |& {  "account_id": "0BF63M2U00A04",
  f5 P8 u4 j( v5 b& D  "amount": 2000000000,
" x6 q+ J' s/ Y; Q( F. X  "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",. m- a" h1 j9 q+ l1 [
  "type": "spend_account"- B( i4 r5 c) L& e" E! G% v% `% k
}5 s( q0 F1 R2 X2 t
例如转账一笔资产的交易示例如下:) w4 W  l; M* w" \) |
(该交易表示通过账户的方式转账100000000neu的BTM资产到地址sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me中, 其中手续费20000000neu = 输入BTM资产数量 - 输出BTM资产数量)
' a" Y: L2 \. r  Q7 W6 S) \( G  [{
0 o8 X" j% y/ J* D% {- b8 N  "base_transaction": null,' {7 k' w+ q/ ]. L
  "actions": [
- |3 u+ X- E$ L/ O    {, V, c- a; X0 X4 [; Y
      "account_id": "0ER7MEFGG0A02",8 N& M1 r  Q  d4 u' F* T0 o
      "amount": 120000000,
! h* L9 M. e5 }* H      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
& S/ ]% ]5 j/ c. D( k# ^      "type": "spend_account"
* x5 L  w. u9 V; S    },& E) g# U* [  u+ l! v
    {
! l# Z& Y0 z7 }* }      "amount": 100000000,, r# @9 W% V- g1 n, F, i2 e
      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
. W$ S3 @5 S: E) F" l% ?" W      "address": "sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me",
5 m! m- @6 w  ~      "type": "control_address"; A. P8 H9 k$ o. @6 n6 d
    }
' ]& }3 C. r$ B: c6 H  ],4 R0 Y0 Z/ I- m6 b  f: {
  "ttl": 0,# D6 y5 k& {' x2 e" t
  "time_range": 0
5 ^$ p9 `  y+ ]}" Q3 o5 a5 z: |3 ~. Z- `5 G

9 S+ w. Y6 N4 r* vspend_account_unspent_output
; o0 S5 G0 I6 `8 y  X, C% D* t; j1 yspendUTXOAction结构体源代码如下:: g, B1 B+ m4 O% k
type spendUTXOAction struct {
' X) Q" J" Q3 l) z5 x        accounts *Manager' {# c% K1 ]1 T3 w& N: g
        OutputID *bc.Hash `json:"output_id"`+ X; X- A% e! J: G# v
        ClientToken *string `json:"client_token"`
' o: B, |' W4 {}
0 U( g* F5 n! t: C; Z: c' F7 w0 Z5 ^结构字段说明如下:6 \# f+ V' h& W# |, q, i
accounts 主要用于账户的管理,无需用户设置参数: u9 F4 e; V  K( h+ x. Y6 w
OutputID 表示需要花费的UTXO的ID,可以根据list-unspent-outputs查询可用的UTXO,其中OutputID对应该API返回结果的id字段( N' D% Z' Q) m% @
ClientToken 表示Reserve用户UTXO的限制条件,目前不填或为空即可# e4 [9 D! _7 L0 q: w& ]

: q; e6 C' c0 U# v3 l) t% vspendUTXOAction的json格式为:
& y. ?" P: \8 U0 b" H+ o7 `{
1 e# ~2 c3 O* E  "type": "spend_account_unspent_output",
# l: y6 O% x+ u! G$ q% |  "output_id": "58f29f0f85f7bd2a91088bcbe536dee41cd0642dfb1480d3a88589bdbfd642d9"
: U9 ~3 z/ H0 O) e0 A}/ C5 v; I; F- U! p6 [  R
例如通过花费UTXO的方式转账一笔资产的交易示例如下:4 G0 T6 E' T4 V/ U/ b
(该交易表示通过直接花费UTXO的方式转账100000000neu的BTM资产到地址sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me中, 其中手续费 = 输入BTM资产的UTXO值 - 输出BTM资产数量)- F' r; g  n1 }! J# i% q
{! X9 o$ O3 s; j. p1 R  _) U
  "base_transaction": null,
0 |" y7 M  v, T& r' q! W! t  "actions": [" I# b6 Y3 k6 R1 t) k
    {! d0 _! l) f, r% m7 K( _, A9 E, A
      "output_id": "58f29f0f85f7bd2a91088bcbe536dee41cd0642dfb1480d3a88589bdbfd642d9",  D8 H  |/ O( `
      "type": "spend_account_unspent_output"; u! G; e- u% l* P
    },* p+ b& P' q2 t% a9 {
    {+ ]6 n6 y7 p% o9 u
      "amount": 100000000,
: f' F4 |. g+ g& o" r      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
% o: q& k! ?  X, v2 b0 A      "address": "sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me",
- w( F1 K5 n' M( x# s3 ?& u* o      "type": "control_address") p9 j( W$ R, J) }4 X
    }: G1 Y1 S* @8 ~6 [2 j
  ],& y2 i) u! C" I3 L& s
  "ttl": 0,) x! f/ M. N, P
  "time_range": 0
9 N8 v/ r6 m" ]5 l% e3 |; ~5 D& p* |}8 d( e! p( y# |9 U) b

5 B0 g3 q% A. q4 {. Acontrol_address
6 T; V1 Q/ |/ z9 A7 l0 ]controlAddressAction结构体源代码如下:3 O: `4 u  M5 a$ a
type controlAddressAction struct {+ A8 Q% M- F- F0 \0 V4 X
        bc.AssetAmount  G9 B) q8 x; ^1 u- t
        Address string `json:"address"`
+ U' ~2 W1 b# K& {}
1 R0 O3 w# y: F" ~type AssetAmount struct {
/ s/ |# Z4 L! _; m: _1 O: P. e6 V9 f# A        AssetId *AssetID `protobuf:"bytes,1,opt,name=asset_id,json=assetId" json:"asset_id,omitempty"`) u# C8 }% w* {  }+ |
        Amount  uint64   `protobuf:"varint,2,opt,name=amount" json:"amount,omitempty"`
1 v4 u% P. d6 A! l& K! E}. \+ X5 |: Z  G  V
结构字段说明如下:
+ l  M6 K' t5 @# nAddress 表示接收资产的地址,可以根据 create-account-receiver API接口创建地址8 J# Y8 Z, M) s  ^3 a
AssetAmount 表示接收的资产ID和对应的资产数目
8 j/ o, y$ v1 W5 K$ ~' M# K( p
* L/ n, y. c* w1 T3 |' l" scontrolAddressAction的json格式为:, ]6 t0 S$ ?  S0 R% k- Q3 I0 U- n4 T
{
- b  I% H: E6 t6 m; y) D  "amount": 100000000,9 }/ }% I. V- c- t
  "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
$ L5 D: k( o; L4 S" N2 a  "address": "bm1q50u3z8empm5ke0g3ngl2t3sqtr6sd7cepd3z68",: ^% S# f) E6 H1 _
  "type": "control_address"5 {% i, e- v7 M( W( E8 I7 N7 e0 w
}
1 ^9 A: \$ z, q例如转账一笔资产的交易示例如下:) D3 x3 S2 |: b: k8 X& {, {
(该交易表示通过账户的方式转账100000000neu的BTM资产到地址sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me中, 其中control_address类型表示以地址作为接收方式)
. O9 h- R5 G0 w/ [5 J  ?{- P# F. j- [, {, G
  "base_transaction": null,+ _& ?4 F" y6 ]- G; r/ y* A0 P
  "actions": [
* z# O$ S' m. g    {
1 @+ q) ?% j% X$ A7 ]      "account_id": "0ER7MEFGG0A02",4 d' C% b* S6 A1 v$ r! {
      "amount": 120000000,5 d2 ]$ z  p1 u; X& q# ^
      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",: A  s* y( C4 c/ v
      "type": "spend_account"& D+ i! q2 S! c8 v  z. ~
    },
. s. ?/ n' v$ L2 j4 x8 V  M/ T    {$ D# _! I* Z, C: e" [9 ~! N. g
      "amount": 100000000,
# R0 ~1 m7 x8 Q      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",1 [% u1 g# N4 N( G. G+ ^5 W( C. v
      "address": "sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me"," ]4 K$ A" @' f( K
      "type": "control_address"
3 }3 N) x& T* O7 O    }
2 p1 {' J4 O, u/ S7 W0 n* b+ Z  ],( P" e( G+ D% x6 w  g1 J6 c/ h2 w
  "ttl": 0,6 ?6 u/ ^0 |9 L( R8 V( Q
  "time_range": 0) O1 o  K, i1 H7 h
}8 P: p; r8 f  `, a
) j8 M' k& G3 O, b4 V: k& _
control_program
# T8 ^, r8 q' g3 v7 U  H5 GcontrolProgramAction结构体源代码如下:0 f; Z: q+ W+ N
type controlProgramAction struct {, m1 z( R1 ?# K: L+ T
        bc.AssetAmount
' S, |8 P& i( d( h) ~( k  q1 e$ O3 C        Program json.HexBytes `json:"control_program"`3 I2 F0 a. C( _, ^
}, b9 Y/ A. T9 A7 D* r, E: H
type AssetAmount struct {
8 r+ o) I2 x5 t2 T% D+ t3 s        AssetId *AssetID `protobuf:"bytes,1,opt,name=asset_id,json=assetId" json:"asset_id,omitempty"`
" e" ?) I$ _( e) a: b        Amount  uint64   `protobuf:"varint,2,opt,name=amount" json:"amount,omitempty"`9 H! E. U, W8 J$ x9 j( o
}* `: g4 s6 V* }+ ^9 C/ g
结构字段说明如下:
# _0 I* H+ [5 u4 S* ?! L, t# {Program 表示接收资产的合约脚本,可以根据 create-account-receiver API接口创建接收program(返回结果的 program 和 address 是一一对应的)
' @/ \0 Z/ t9 n. uAssetAmount 表示接收的资产ID和对应的资产数目* j: q/ S" A* s" X; [/ t4 [% J& z. N
9 P! u2 N( q) L: w2 v1 O
controlProgramAction的json格式为:% S% h* @& l0 W/ ~2 `
{% P/ s) a6 b( q/ Y3 T
  "amount": 100000000,4 {5 \+ n2 \, B. e$ X
  "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",. X! f6 J; o8 o; s/ G
  "control_program":"0014a3f9111f3b0ee96cbd119a3ea5c60058f506fb19",
, n7 }8 K: G9 F  "type": "control_program"5 ~0 o6 ^! @2 W. i
}
- P  h* H1 m0 R' e' [8 T! H例如转账一笔资产的交易示例如下:: H- a6 g, ]' i
(该交易表示通过账户的方式转账100000000neu的BTM资产到接收program(跟address是一一对应的)0014a3f9111f3b0ee96cbd119a3ea5c60058f506fb19中, 其中control_program类型表示以program作为接收方式)1 Q* a) y9 O1 H1 _
{
3 \5 o, Q( o: f; f0 m  "base_transaction": null,) |2 e4 D0 A! O- ^8 C  w
  "actions": [( w$ `1 J5 R, W& S: R4 k
    {6 [+ R5 [1 Z' l; B0 l/ ]& x. u( m
      "account_id": "0ER7MEFGG0A02",4 i! ]5 [6 I+ ~5 m2 D0 T; T+ j
      "amount": 120000000,
& z- m; U- ~; _. X) \; c( ~      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
; B/ ^, C) M0 C1 U/ h; J" B      "type": "spend_account"  N6 l) P7 R( o& W5 I
    },; N8 m  [; ]( @" ]4 N, f
    {; {8 f9 g$ d/ l- A
      "amount": 100000000,; o4 c1 F+ P* T
      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",+ {0 x8 v) N# N7 J+ N6 s
      "control_program": "0014a3f9111f3b0ee96cbd119a3ea5c60058f506fb19",- w, u0 x: H- z" G6 s0 K
      "type": "control_program"
' f2 c7 G$ B0 e2 F" h) P    }! a8 d. D( I. s+ c) ~
  ],
/ Q3 F+ `9 q  w: j* n$ x  "ttl": 0,
$ a7 R& M2 u$ p  "time_range": 0
* k3 T+ t5 u! J$ k1 b: w9 F}* U# r  Q5 T" [! q- T+ ]* F
8 ]) Z+ G7 I, @8 \9 m
retire
; |0 V! X, O0 R# Y3 W0 X( SretireAction结构体源代码如下:
: f3 \! q2 g- v( `; \0 ?type retireAction struct {
" \0 S, I& R6 d% D8 b        bc.AssetAmount1 E/ X0 ~& v9 n# P! c0 `7 Q: @  D  G
}
) ]& _" {, u3 dtype AssetAmount struct {5 |+ q8 ?! T& R+ h5 O  f* I' R5 G
        AssetId *AssetID `protobuf:"bytes,1,opt,name=asset_id,json=assetId" json:"asset_id,omitempty"`
' Z. F* D7 K5 ]- M. n) L  T        Amount  uint64   `protobuf:"varint,2,opt,name=amount" json:"amount,omitempty"`! x1 ]7 K: f& H1 E
}7 J$ \" `) L$ C0 e4 s7 Q- s5 \
结构字段说明如下:9 V. p$ L; O' m9 X
AssetAmount 表示销毁的资产ID和对应的资产数目( h0 {4 }) n4 w3 _' D
$ a4 }2 z# R9 x# ^
retireAction的json格式为:
# p; w! D; D- z& R  d8 r{" e2 l4 d9 i1 x+ D9 H5 O
  "amount": 900000000,
2 \9 _8 D, f% a, m$ n  "asset_id": "3152a15da72be51b330e1c0f8e1c0db669269809da4f16443ff266e07cc43680",6 g: G4 ?/ s$ b/ M# F
  "type": "retire"( l9 M" b% k! l2 p1 v; L# M) U* j5 _
}) l% P( n* }( y6 s  T+ |
例如销毁一笔资产的交易示例如下:) B9 ?4 u- U) ~6 W( Q# u
(该交易表示通过账户的方式将100000000neu的BTM资产销毁, retire表示销毁指定数量的资产)
% N% q6 j6 Q0 _{
  z' g+ L) d( ?  "base_transaction": null,
+ ?0 y6 R# i3 e% P% R! J  "actions": [. S/ i9 ]3 N: x" W6 {4 F
    {
( s( e9 K/ p; `      "account_id": "0ER7MEFGG0A02",
2 k, a4 X" K1 H% q, ]! G/ u      "amount": 120000000,
* m# A# S9 N3 J. q- n% a9 p      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
( C+ s7 V/ k' t1 t      "type": "spend_account"' e# A& Z5 E3 n+ ]5 m( ?" ]9 a
    },6 A+ `0 c" N+ Y# Q: F
    {' ~$ R8 Z  x. o  Q: I3 k9 }8 y: S8 _
      "amount": 100000000,) R) |5 Q* F) t4 l
      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",) E7 }3 e/ p5 R4 m
      "type": "retire"
* i% G3 f+ a1 H! f    }
' e7 y: y' @- I& _( J/ A  ],
2 w8 x7 w7 N$ ~0 n  "ttl": 0,; o+ @' ~  o% [* v) i8 {  C
  "time_range": 01 j7 E! T' e: p# R7 x
}
* e- p+ {/ N: x
2 }1 y% c5 U  A8 o/ R8 @; ubuild-transaction的输入构造完成之后,便可以通过http的调用方式进行发送交易,构建交易请求成功之后返回的json结果如下:% M9 |8 L  `: s2 N$ \7 C
{5 O, w& W( p" A7 _- |. W" E& [
  "allow_additional_actions": false,
5 B4 X2 |+ N- J4 t  "raw_transaction": "070100020161015f1190c60818b4aff485c865113c802942f29ce09088cae1b117fc4c8db2292212ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8099c4d599010001160014a86c83ee12e6d790fb388345cc2e2b87056a077301000161015fb018097c4040c8dd86d95611a13c24f90d4c9d9d06b25f5c9ed0556ac8abd73442275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f80a094a58d1d0101160014068840e56af74038571f223b1c99f1b60caaf456010003013effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80bfffcb9901011600140b946646626c55a52a325c8bb48de792284d9b7200013e42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f9d9f94a58d1d01160014c8b4391bab4923a83b955170d24ee4ca5b6ec3fb00013942275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f6301160014366b275ed9b2266b645cf1b8be51009cc3b260e100",
, ?7 P; b- }# G& n+ O7 L# Y" i" j  "signing_instructions": [
0 A( e, z4 i7 Y& }3 B    {
" U; ]  ^- _/ D      "position": 0,
5 [) ^% M& z% j; ~2 s. f      "witness_components": [
' @. y% A, I( i        {' u8 v* z# C( X. w$ Z2 W
          "keys": [
* O8 z7 J; a( j4 i5 A5 `! B            {
+ k5 d! K$ z6 k& X6 s: G+ p/ {0 S              "derivation_path": [
9 {6 _% W3 Q3 G8 }! R# f/ K                "010100000000000000",$ L' X! e% M2 ^" x
                "0100000000000000"6 v. G3 p* \3 b
              ],
( W+ u1 R+ _3 `              "xpub": "de0db655c091b2838ccb6cddb675779b0a9a4204b122e61699b339867dd10eb0dbdc926882ff6dd75c099c181c60d63eab0033a4b0a4d0a8c78079e39d7ad1d8"- p8 n, J. I' N
            }) M0 {! _! r. \- ?1 I
          ],
% w0 G$ E2 d" y8 i& p  ~          "quorum": 1,3 r# c, g$ w! ~$ N5 c
          "signatures": null,
* j* e) d4 |1 L4 T" X4 L3 H) E2 x          "type": "raw_tx_signature"
% U$ w% @" C# ?        },3 f8 |$ {! Y1 i" t
        {
& O4 u5 K: H- j  p0 p6 F9 i9 F/ H          "type": "data",  [; ~# s$ y8 y$ c' e1 H: t
          "value": "d174db6506e35f2decb5be148c2984bfd0f6c67f043365bf642d1af387c04fd5"
! \; u; x! R+ v6 _1 u        }
8 P" `8 A1 }& `6 A7 x      ]
( t) D6 l1 l+ o/ Q    },
; P& g( A+ e! Y1 N3 b    {
% z2 p4 k- n0 k$ j8 V7 \      "position": 1,. s! y9 w' L6 ]8 b" S
      "witness_components": [
4 a; \+ M3 q- n6 Z. h# }+ T( Y2 J' B2 X        {
% C/ F( N# D# k6 }4 B          "keys": [
2 |! A5 `2 Y7 k            {
- p- a, l$ M0 N$ a; r2 ?# {              "derivation_path": [3 Q7 q. ?9 u' I* u* A4 t" d, w
                "010100000000000000",
6 [% l- d, a" R                "0800000000000000", D- a8 j- y1 Q9 @; [
              ],
( ?$ b) T: J2 R. Y. @              "xpub": "de0db655c091b2838ccb6cddb675779b0a9a4204b122e61699b339867dd10eb0dbdc926882ff6dd75c099c181c60d63eab0033a4b0a4d0a8c78079e39d7ad1d8"
+ Q  J5 j( k$ K            }" b7 R3 e5 H0 Y7 E
          ],: O7 ?' U% s1 ~% V5 D8 _% ?- J: s; }
          "quorum": 1,+ m+ t3 S; m/ x- K; V2 K
          "signatures": null,! B( g# q5 x. d; J8 j
          "type": "raw_tx_signature"
/ m* h# e% ^% z% j$ ]        },, M7 k6 [8 Z( \7 y0 ]2 K+ C( K
        {0 u7 D/ e. D0 m6 t, ^+ N5 K
          "type": "data",
# P6 }+ y1 L" J3 U/ e( a          "value": "05cdbcc705f07ad87521835bbba226ad7b430cc24e5e3f008edbe61540535419"' o6 E3 e2 }) x" G1 B
        }( A% O( M0 k: W& Z4 _5 J" e/ L
      ]% D/ ~# o+ o$ _' \
    }
1 d  ~6 ]# L8 L9 v3 U( [) t  ]
6 m8 E7 I( D' g}4 X# K" \/ I' b7 N& K2 a1 I
对应响应对象的源代码如下:
$ q/ }' t- S  a2 y// Template represents a partially- or fully-signed transaction.1 Q  `4 `7 E9 d
type Template struct {
4 o# |( b* z" C4 j" m! T) I        Transaction         *types.Tx             `json:"raw_transaction"`
. G, G5 K  n8 V        SigningInstructions []*SigningInstruction `json:"signing_instructions"`: c( R) I& H- \
        // AllowAdditional affects whether Sign commits to the tx sighash or
  {# ~6 T( J  f% g' t' L        // to individual details of the tx so far. When true, signatures; k/ q: Y" E/ e3 L% R- M
        // commit to tx details, and new details may be added but existing
% v. [7 C" D' j, r- v$ Z        // ones cannot be changed. When false, signatures commit to the tx
: ^- }7 t1 \/ r        // as a whole, and any change to the tx invalidates the signature.
) D: R0 v$ G$ j! B+ E" u+ b; G        AllowAdditional bool `json:"allow_additional_actions"`
& r% `+ O9 X5 m% t$ m6 t}
2 n) ~- g( A$ o" {" ?  R' E结构字段说明如下:$ d. R) c7 W. }$ t, }
Transaction 交易相关信息,该字段包含TxData和bc.Tx两个部分:
* T3 K: |# ^  J! C0 wTxData 表示给用户展示的交易数据部分,该部分对用户可见
% a7 t3 B1 V4 e" Z/ w8 u/ I/ r& y: z; tVersion 交易版本
4 }" }! t3 o. b1 p8 m. OSerializedSize 交易序列化之后的size
" G7 i; W; Z. f6 E6 N/ n0 i. WTimeRange 交易提交上链的最大时间戳(区块高度)(主链区块高度到达该时间戳(区块高度)之后,如果交易没有被提交上链,该交易便会失效)
& G2 ^; Y2 Q5 d7 jInputs 交易输入
) |7 c. Z4 n5 N# t3 m4 O9 T8 hOutputs 交易输出. b/ l# i4 |2 v5 `8 u% l7 Z, z3 w
bc.Tx 表示系统中处理交易用到的转换结构,该部分对用户不可见,故不做详细描述
- L5 |7 @3 d0 V2 H, e# ESigningInstructions 交易的签名信息
( w  K% A4 n) U$ QPosition 对input action签名的位置; c4 F% K+ g- J3 b0 a" \; j  B  J' C
WitnessComponents 对input action签名需要的数据信息,其中build交易的signatures为null,表示没有签名; 如果交易签名成功,则该字段会存在签名信息。该字段是一个interface接口,主要包含3种不同的类型:7 _9 f# r# B1 y3 ^% Y
SignatureWitness 对交易模板Template中交易input action位置的合约program进行哈希,然后对hash值进行签名4 G& `+ Q8 U/ r
signatures (数组类型)交易的签名,sign-transaction执行完成之后才会有值存在+ ^( P, C- c& D/ s, ~" Y5 _$ t7 ^  C
keys (数组类型)包含主公钥xpub和派生路径derivation_path,通过它们可以在签名阶段找到对应的派生私钥child_xprv,然后使用派生私钥进行签名# h8 r! b5 d" \- e
quorum 账户key 的个数,必须和上面的keys的长度相等。如果quorum 等于1,则表示单签账户,否则为多签账户
/ e! e5 a" D8 h. nprogram 签名的数据部分,program的hash值作为签名数据。如果program为空,则会根据当前交易ID和对应action位置的InputID两部分生成一个hash,然后把它们作为指令数据自动构造一个program
0 b1 d! l$ t. g) u2 Q/ F  U& ?& kRawTxSigWitness 对交易模板Template的交易ID和对应input action位置的InputID(该字段位于bc.Tx中)进行哈希,然后对hash值进行签名
2 b5 i, Y0 y* ~6 osignatures (数组类型)交易的签名,sign-transaction执行完成之后才会有值存在
2 J5 t" v/ ^( e! i9 g0 S6 zkeys (数组类型)包含主公钥xpub和派生路径derivation_path,通过它们可以在签名阶段找到对应的派生私钥child_xprv,然后使用派生私钥进行签名" o% _) \2 X. T) a  Y; u
quorum 账户key的个数,必须和上面的keys 的长度相等。如果quorum 等于1,则表示单签账户,否则为多签账户
3 Q) E+ }9 z5 aDataWitness 该类型无需签名,验证合约program的附加数据
7 P: P; J5 O0 X* C; `% f) U! a' |! ], ^$ o/ h
AllowAdditional 是否允许交易的附加数据,如果为true,则交易的附加数据会添加到交易中,但是不会影响交易的执行的program脚本,对签名结果不会造成影响; 如果为false,则整个交易作为一个整体进行签名,任何数据的改变将影响整个交易的签名
: Z2 _0 h% a* l
* Y/ H0 w  Z% \% o7 j估算手续费: K3 b7 [& I4 j6 B/ W
估算手续费接口estimate-transaction-gas是对build-transaction的结果进行手续费的预估,估算的结果需要重新加到build-transaction的结果中,然后对交易进行签名和提交。其主要流程如下:/ y8 I9 g) E* E, d
  build - estimate - build - sign - submit6 |7 b  f. N9 ]8 F3 @) T; a
估算手续费的输入请求json格式如下:
: R+ P$ R. L# ^8 ?{% N6 J5 x3 [  y' F3 g
  "transaction_template": {$ t; }" ~" E) ]) {& O
    "allow_additional_actions": false,4 q5 q) i& x1 M! b
    "raw_transaction": "070100020161015f1190c60818b4aff485c865113c802942f29ce09088cae1b117fc4c8db2292212ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8099c4d599010001160014a86c83ee12e6d790fb388345cc2e2b87056a077301000161015fb018097c4040c8dd86d95611a13c24f90d4c9d9d06b25f5c9ed0556ac8abd73442275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f80a094a58d1d0101160014068840e56af74038571f223b1c99f1b60caaf456010003013effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80bfffcb9901011600140b946646626c55a52a325c8bb48de792284d9b7200013e42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f9d9f94a58d1d01160014c8b4391bab4923a83b955170d24ee4ca5b6ec3fb00013942275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f6301160014366b275ed9b2266b645cf1b8be51009cc3b260e100",
7 r- T! V6 {" P    "signing_instructions": [) p9 w. V2 ]8 q3 U) a9 J
      {% _/ O6 n) C" j; G2 W1 Q8 ~
        "position": 0,7 R$ i5 c/ i) e3 _' e' n+ O* }$ p! B/ Z
        "witness_components": [& H. J2 F# `6 V/ X" p0 |8 |
          {
1 i3 v. N* J0 e' C            "keys": [
" i( d* g) O+ f5 ^" G! H$ n              {
; Q& @) J( o% r/ G                "derivation_path": [4 _5 n3 y6 k, a6 W! S
                  "010100000000000000",
- y3 u2 w& y* k. d0 w. M                  "0100000000000000"
% D: \0 J! F2 _! E# `  Z3 I! c2 j7 x                ],5 F2 ~5 ]( G  H0 X6 R
                "xpub": "de0db655c091b2838ccb6cddb675779b0a9a4204b122e61699b339867dd10eb0dbdc926882ff6dd75c099c181c60d63eab0033a4b0a4d0a8c78079e39d7ad1d8"  S9 E- f: Z& Y8 r" @. V- o. n/ T1 O
              }0 I) X$ ?! S$ g* @0 m
            ],$ o5 I& T/ v* H
            "quorum": 1,# }( s6 [& r( {6 C& \
            "signatures": null,  R6 Z5 e2 l3 U6 |7 p
            "type": "raw_tx_signature"
3 h7 c' A/ q4 c; ]) H3 O# t4 P          }," r+ }6 Z  l% S2 v  J
          {
5 e* I1 b) I0 V% C            "type": "data",
% E7 S8 Q& ]7 n2 B1 C            "value": "d174db6506e35f2decb5be148c2984bfd0f6c67f043365bf642d1af387c04fd5"* [0 m; W3 B! x; `
          }
' m/ i6 v; J( }0 Y' Z. Q        ]
4 o% J  Q  ^: v9 K      },3 u7 D, N" i' n$ \9 i
      {
- d2 {  H! b7 X        "position": 1,
6 H! C5 }  F" P) V9 n) [        "witness_components": [  ^2 v! l; r, t0 ]8 [  \% C
          {# w/ \# R0 m/ ]! d( j1 A
            "keys": [
) D7 b  y- k! }+ I6 ?8 o1 n9 |              {
' n7 S+ F6 Q+ k7 T- l- k                "derivation_path": [
( ^2 Y' P  l) G) K                  "010100000000000000",. U1 a6 g9 O" R! x
                  "0800000000000000"+ F9 g5 t& K3 d3 M/ L! D
                ],/ I! ~1 |  V3 e: G% d+ O8 o3 l0 R' R
                "xpub": "de0db655c091b2838ccb6cddb675779b0a9a4204b122e61699b339867dd10eb0dbdc926882ff6dd75c099c181c60d63eab0033a4b0a4d0a8c78079e39d7ad1d8"
9 s! G( [7 z7 {4 r" a3 M$ V) j              }
3 X! ~' g% a6 L9 y* ^& O            ],9 I9 \2 K2 W( \
            "quorum": 1,
2 F$ |, I' m) l3 Q            "signatures": null,4 M! d. W5 K9 z/ \4 t
            "type": "raw_tx_signature"+ U8 v6 l3 h- _9 G
          },& z! Y6 ?4 p/ {$ @
          {; s5 ]: h' E$ B% v, G. Y
            "type": "data",+ }5 r; n2 C- ^; S
            "value": "05cdbcc705f07ad87521835bbba226ad7b430cc24e5e3f008edbe61540535419"0 M4 P, S3 r8 C+ U# K6 d) |8 S
          }
* D, u, i+ X2 H9 H! E        ]
# f5 d+ W; D* I- D# c4 \% C      }1 `' ]# I1 x0 Y' l( q- O
    ]
! `7 z3 k8 A0 O6 ]. d0 j) U5 @$ J  }( [0 [$ {  ^& H* q) S( B
}& M8 H- V2 A. z
对应响应对象的源代码如下:
, h' W+ j% O) C5 ctype request struct{# B6 k! h1 z2 ~/ O
        TxTemplate txbuilder.Template `json:"transaction_template"`8 h  F$ D7 |; s; ^
}# x9 |# m. z% Z+ A- A+ \" N' a, ~0 _# i$ [
// Template represents a partially- or fully-signed transaction.
; ^2 K9 W/ V# a' F; b$ htype Template struct {( r; H5 N; Q- z# l+ r
        Transaction         *types.Tx             `json:"raw_transaction"`
5 h0 o2 R5 A8 a. m4 J6 D7 c: O4 ~        SigningInstructions []*SigningInstruction `json:"signing_instructions"`
. D" c; \8 E# @& r1 K- ^: H/ \        // AllowAdditional affects whether Sign commits to the tx sighash or7 }% M1 s0 e8 ?3 y9 e
        // to individual details of the tx so far. When true, signatures
. J3 F) e6 e6 p7 U, n        // commit to tx details, and new details may be added but existing
+ J2 c$ O  h5 i( c; I$ ^        // ones cannot be changed. When false, signatures commit to the tx
$ J% a- b2 c1 f- O        // as a whole, and any change to the tx invalidates the signature." V+ |. D7 a6 i5 `0 o6 M
        AllowAdditional bool `json:"allow_additional_actions"`; S1 [, J+ x  H& V9 a
}
9 P7 y: C; l& a. l0 l, f其中TxTemplate相关字段的说明见build-transaction的结果描述
' t) S- r0 f/ c调用estimate-transaction-gas接口成功之后返回的json结果如下:  G2 r+ F; @! ?0 p6 ^6 l+ {
{
6 i0 {4 q' F, m8 K  "total_neu": 5000000,+ [3 n4 K8 w6 H" O( e, G( G
  "storage_neu": 3840000,. N& r8 j9 z( B7 o  @3 d
  "vm_neu": 1419000& s7 p" f+ g+ Z  W( n: r# p
}
+ R3 ?; d2 T/ L/ N2 x对应响应对象的源代码如下:
/ Y2 y  C/ m& [2 r6 I// EstimateTxGasResp estimate transaction consumed gas3 u$ C/ h1 M) D  V2 E1 I
type EstimateTxGasResp struct {. S$ {1 {) m6 W" _* n7 P! K
        TotalNeu   int64 `json:"total_neu"`# y- ~, A( V" s# a. {( v' X
        StorageNeu int64 `json:"storage_neu"`
8 u; C9 {+ W% ~8 O        VMNeu      int64 `json:"vm_neu"`
( h- ~; H' A; h0 u}
) ?/ D% `( A% Q/ b5 v" |结构字段说明如下:
# ]! W6 G! v& X$ ?3 M% o$ ]TotalNeu 预估的总手续费(单位为neu),该值直接加到build-transaction的BTM资产输入action中即可
2 Q7 ~) ]7 ?" v4 p9 T4 `StorageNeu 存储交易的手续费
; J7 Y) b! C, VVMNeu 运行虚拟机的手续费6 s: o9 K9 e/ R: |; u& }0 y% A
  ]% S( x5 C6 z8 G+ Q- {
2、签名交易
( r' y! H; M0 B/ N$ bAPI接口 sign-transaction,代码api/hsm.go#L53% p  z7 C/ ?! h1 D5 c2 A
签名交易的输入请求json格式如下:
5 |1 p! Y  n+ u& @{& l5 K0 i/ V) J% f# O
  "password": "123456",
7 Z0 u" [; q+ [* L" _9 ?% b: L  "transaction": {
7 m' X+ k2 p1 E+ D* x/ B    "allow_additional_actions": false,
# q+ l% w: C/ H" i, ]$ ~, z    "raw_transaction": "070100020161015f1190c60818b4aff485c865113c802942f29ce09088cae1b117fc4c8db2292212ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8099c4d599010001160014a86c83ee12e6d790fb388345cc2e2b87056a077301000161015fb018097c4040c8dd86d95611a13c24f90d4c9d9d06b25f5c9ed0556ac8abd73442275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f80a094a58d1d0101160014068840e56af74038571f223b1c99f1b60caaf456010003013effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80bfffcb9901011600140b946646626c55a52a325c8bb48de792284d9b7200013e42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f9d9f94a58d1d01160014c8b4391bab4923a83b955170d24ee4ca5b6ec3fb00013942275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f6301160014366b275ed9b2266b645cf1b8be51009cc3b260e100",
* j, j2 S, K0 g' m' S) O" \" S* K    "signing_instructions": [0 w7 P6 D: H' k" m$ L" d: x1 [
      {# L/ E" _" D0 Y
        "position": 0,
5 G* d4 T2 S! V4 t2 M! B, L- p& D        "witness_components": [
& q  A" d3 K% |/ o          {1 E$ I3 k4 C! w5 J: O* @( `
            "keys": [. B. H" O) K" |
              {
: l# y2 L, k/ P                "derivation_path": [2 g: {2 n0 j5 c- u" [" M
                  "010100000000000000",  K! W& z3 L, E  ~
                  "0100000000000000"
, ]7 v  g; t0 g6 D) I* ~2 l) o# G                ],
2 S/ M) k5 m% j) |* E6 q                "xpub": "de0db655c091b2838ccb6cddb675779b0a9a4204b122e61699b339867dd10eb0dbdc926882ff6dd75c099c181c60d63eab0033a4b0a4d0a8c78079e39d7ad1d8"
8 t8 v. d5 |8 n; m# ^              }/ {2 g" @! F- A
            ],
% U" r$ {: f) W5 C' ^( X4 {            "quorum": 1,# j6 N; F+ T+ e1 K
            "signatures": null,! z' s' g3 A- p$ @7 _" @& s: l+ e
            "type": "raw_tx_signature"  C" O1 M" X" h$ Q% T( F
          },
. R$ p' b2 H3 J* Q  h4 q  x          {9 s9 o7 x) b& J
            "type": "data",& r% ^9 V' `9 T( [% _0 W+ h
            "value": "d174db6506e35f2decb5be148c2984bfd0f6c67f043365bf642d1af387c04fd5"! ?# x) X) p/ w7 B. F  P' l
          }1 y; R+ j4 p7 f. y1 |/ V# U& J
        ]9 H4 e! X) Z- F, m7 p8 @
      },
. M( R: ]* @( x' b0 V, X. K  _2 t      {. Z9 x! T- |# J$ N+ W
        "position": 1,- K" T$ e/ s& B' K+ K1 a
        "witness_components": [' N! h. v* }7 l! Q5 V- \; b" N: F
          {1 W( i0 {; _1 j9 Z& {
            "keys": [- a# I. T, j) e: n& \3 x& n
              {
1 H, T' y8 s% w+ A! @9 i                "derivation_path": [
. K7 k) x' L& r- C                  "010100000000000000",
& O4 _. y. \" S9 H( e6 ]                  "0800000000000000"
  Z# B: o4 ^: `# Z                ],$ q! |4 w% L6 p" j# L) O' z
                "xpub": "de0db655c091b2838ccb6cddb675779b0a9a4204b122e61699b339867dd10eb0dbdc926882ff6dd75c099c181c60d63eab0033a4b0a4d0a8c78079e39d7ad1d8"
+ I4 S0 V3 N( X. o/ k/ h8 h% r              }! }. p8 k7 ^: f. q
            ],
% ]# K+ A1 e% j, Q            "quorum": 1,
; u9 q5 q9 c; Q3 G  U+ Q( \6 S            "signatures": null,
' Y) L0 N8 g1 T( ~2 L- s6 P$ X            "type": "raw_tx_signature"/ q8 |0 D2 a8 T5 B4 q+ _
          },( Z# ?5 }' ~1 H
          {
5 F! F& B, ?6 J6 m            "type": "data",
8 q  P& Z/ H% k& k: a# y1 S            "value": "05cdbcc705f07ad87521835bbba226ad7b430cc24e5e3f008edbe61540535419"4 ?* t( H. Z, y1 w( t( G
          }" s$ I3 K  q/ D
        ]- d* r; I) g! L6 e) a
      }5 Q9 W+ ?; e, k/ }( N& \4 n
    ]; k1 j. q1 M6 I* S
  }; A+ r* n1 L+ ?* _" }) |8 o
}
  A2 a' Y1 s" p- b对应请求对象的源代码如下:7 L3 f5 j; i: H1 G, }  Q
type SignRequest struct {    //function pseudohsmSignTemplates request
1 f3 W; |3 f; t' U$ @' X$ M        Password string             `json:"password"`! \3 ]) X6 r0 g/ L
        Txs      txbuilder.Template `json:"transaction"`  k! J$ O' P* V6 g  V; o/ Q0 ^+ {
}. _% E* O1 P9 \  \4 K
结构字段说明如下:
5 }; F8 W/ K2 Z" m. APassword 签名的密码,根据密码可以从节点服务器上解析出用户的私钥,然后用私钥对交易进行签名( W1 p# Q+ q! f& h) i% t5 k
Txs 交易模板,build-transaction的返回结果,结构类型为 txbuilder.Template,相关字段的说明见build-transaction的结果描述
4 O  m% @! M$ U8 W: N1 m; L5 {' |3 {- k4 Y6 \, A9 L$ X" Z
签名交易sign-transaction请求成功之后返回的json结果如下:
. Q9 o3 P* I2 b6 d{0 H9 J- d3 l, Q' Z
  "sign_complete": true,2 X2 ?6 E! l7 s" S
  "transaction": {# f  P: g& ^& z- g- }4 @/ J
    "allow_additional_actions": false,
- p' L* G" l  h6 }1 T    "raw_transaction": "070100020161015f1190c60818b4aff485c865113c802942f29ce09088cae1b117fc4c8db2292212ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8099c4d599010001160014a86c83ee12e6d790fb388345cc2e2b87056a0773630240273d5fc4fb06909fbc2968ea91c411fd20f690c88e74284ce2732052400129948538562fe432afd6cf17e590e8645b80edf80b9d9581d0a980d5f9f859e3880620d174db6506e35f2decb5be148c2984bfd0f6c67f043365bf642d1af387c04fd50161015fb018097c4040c8dd86d95611a13c24f90d4c9d9d06b25f5c9ed0556ac8abd73442275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f80a094a58d1d0101160014068840e56af74038571f223b1c99f1b60caaf4566302400cf0beefceaf9fbf1efadedeff7aee5b38ee7a25a20d78b630b01613bc2f8c9230555a6e09aaa11a82ba68c0fc9e98a47c852dfe3de851d93f9b2b7ce256f90d2005cdbcc705f07ad87521835bbba226ad7b430cc24e5e3f008edbe6154053541903013effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80bfffcb9901011600140b946646626c55a52a325c8bb48de792284d9b7200013e42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f9d9f94a58d1d01160014c8b4391bab4923a83b955170d24ee4ca5b6ec3fb00013942275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f6301160014366b275ed9b2266b645cf1b8be51009cc3b260e100",8 ^0 S% L/ [/ R
    "signing_instructions": [! p, m* O6 X. F- _/ W8 L1 K
      {
, U5 m2 U( [) j  ~, r+ k) l  R        "position": 0,6 Z5 ^: X9 Q& N$ I" r/ G
        "witness_components": [- v$ W% q4 l. l" U8 d$ [
          {* q* V9 y) t5 j* S6 n
            "keys": [, w+ G% f5 l6 a
              {* I/ ]3 g- i" W
                "derivation_path": [( N& `( O  B9 ^+ W
                  "010100000000000000",& J4 v- J' w, c$ s& O1 G7 q9 `, R4 E
                  "0100000000000000"3 ?7 l, i. a" h2 C8 b) j  |
                ]," j* U/ U" c) \, X6 n/ [: y
                "xpub": "de0db655c091b2838ccb6cddb675779b0a9a4204b122e61699b339867dd10eb0dbdc926882ff6dd75c099c181c60d63eab0033a4b0a4d0a8c78079e39d7ad1d8"
" o* S& l4 [! f$ f& i              }$ }4 ?6 H, V" ?
            ],
! M8 K4 i; N- F, u$ R& c% j: B            "quorum": 1,
! K& M  M0 n% b+ Q# w, k            "signatures": [1 U. ]5 E) C( p' u* b
              "273d5fc4fb06909fbc2968ea91c411fd20f690c88e74284ce2732052400129948538562fe432afd6cf17e590e8645b80edf80b9d9581d0a980d5f9f859e38806"2 h/ ?5 H0 C/ [$ N
            ],
, J1 k# B# ]' P; ?! M0 q2 u4 ~' d            "type": "raw_tx_signature"* u0 C4 x0 b! l6 h5 R& N4 L
          },
; F2 o/ Y9 _0 v4 A. E9 h, x          {
$ T2 {. A& g/ [0 M6 H. T" P            "type": "data",- D) b% j$ F3 P/ i; Z3 k
            "value": "d174db6506e35f2decb5be148c2984bfd0f6c67f043365bf642d1af387c04fd5"2 r# g- h- L! e& j9 D
          }
6 H( ?% T% R7 t/ l/ q& ]* v        ]) V* Q6 g. r6 H
      },2 x. R0 o4 q1 _
      {
; w/ ]) }/ T1 E1 o- U1 |# V' g        "position": 1,
. j& K- z; x8 P4 ]# i, Z* P! f& C        "witness_components": [
8 u3 f4 C  J* x9 @          {# n' X/ D# {. A7 u6 H5 x! R/ z
            "keys": [. w! z2 h3 h2 b
              {  m* ?! {* v6 I& \) R
                "derivation_path": [
6 \! w- H, L) X                  "010100000000000000",* j) M! |# g' g6 U: G
                  "0800000000000000"
1 r# n. |. S3 i4 e2 g; d                ]," ]  b4 e9 c% `
                "xpub": "de0db655c091b2838ccb6cddb675779b0a9a4204b122e61699b339867dd10eb0dbdc926882ff6dd75c099c181c60d63eab0033a4b0a4d0a8c78079e39d7ad1d8"
; w5 T8 u1 E) _7 B1 v              }
) @% Y; t7 A7 f) [" ^/ y! G8 Y            ],- ~% z" y8 j) X% o( z7 w* f- Q) ^
            "quorum": 1,
7 P5 t# o" v8 y# Q& U            "signatures": [8 ?+ m0 p6 L+ V$ s
              "0cf0beefceaf9fbf1efadedeff7aee5b38ee7a25a20d78b630b01613bc2f8c9230555a6e09aaa11a82ba68c0fc9e98a47c852dfe3de851d93f9b2b7ce256f90d"
9 s" u! ]- `+ i, G            ],) L* ~1 H  E1 ~3 t' P% S
            "type": "raw_tx_signature"
0 f9 X' j" r+ R7 }4 p: Y          },2 m3 e% A( p3 g, @
          {
$ {0 m8 z1 A8 p( s! ]6 p1 z; a! }; Z            "type": "data",8 \- d, j0 E+ D  l
            "value": "05cdbcc705f07ad87521835bbba226ad7b430cc24e5e3f008edbe61540535419"
: ]. S$ ^- K! v5 N- p$ h          }/ l/ ~$ k- Q# n
        ]2 N% Q: s6 C6 T
      }
2 G" P+ s& M  m/ a8 ]    ]
% r7 _( N! _# P0 P7 b2 {  }
/ ^8 K4 F, p  l}) h$ _  w* W. e( _; c% s0 N
对应响应对象的源代码如下:& X; K) {( {# N+ p" \, W
type signResp struct {
1 l6 i  b. h; i1 {        Tx           *txbuilder.Template `json:"transaction"`
3 L9 [7 _) ]; [8 I        SignComplete bool                `json:"sign_complete"`
9 T; E, @' Z2 _}% |: c; T8 n( C
结构字段说明如下:
% A: R: @8 C) y/ ~; e4 pTx 签名之后的交易模板txbuilder.Template,如果签名成功则signatures会由null变成签名的值,而raw_transaction的长度会变长,是因为bc.Tx部分添加了验证签名的参数信息
7 }1 ~' @: O7 B0 uSignComplete 签名是否完成标志,如果为true表示签名完成,否则为false表示签名未完成,单签的话一般可能为签名密码错误; 而多签的话一般为还需要其他签名。签名失败只需将签名的交易数据用正确的密码重新签名即可,无需再次build-transaction构建交易
6 `. B, A- b4 k7 v3 H
2 o; i. A) P  K, [: v& g* G* @3、提交交易1 t+ r3 J# `) S2 g- S, C( _
API接口 submit-transaction,代码api/transact.go#L135
4 d6 D" V" j: l提交交易的输入请求json格式如下:
3 k. d7 b4 v% g% I{& E! ^" t+ @( k% S
  "raw_transaction": "070100020161015f1190c60818b4aff485c865113c802942f29ce09088cae1b117fc4c8db2292212ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8099c4d599010001160014a86c83ee12e6d790fb388345cc2e2b87056a0773630240273d5fc4fb06909fbc2968ea91c411fd20f690c88e74284ce2732052400129948538562fe432afd6cf17e590e8645b80edf80b9d9581d0a980d5f9f859e3880620d174db6506e35f2decb5be148c2984bfd0f6c67f043365bf642d1af387c04fd50161015fb018097c4040c8dd86d95611a13c24f90d4c9d9d06b25f5c9ed0556ac8abd73442275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f80a094a58d1d0101160014068840e56af74038571f223b1c99f1b60caaf4566302400cf0beefceaf9fbf1efadedeff7aee5b38ee7a25a20d78b630b01613bc2f8c9230555a6e09aaa11a82ba68c0fc9e98a47c852dfe3de851d93f9b2b7ce256f90d2005cdbcc705f07ad87521835bbba226ad7b430cc24e5e3f008edbe6154053541903013effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80bfffcb9901011600140b946646626c55a52a325c8bb48de792284d9b7200013e42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f9d9f94a58d1d01160014c8b4391bab4923a83b955170d24ee4ca5b6ec3fb00013942275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f6301160014366b275ed9b2266b645cf1b8be51009cc3b260e100") a& m3 R( O* \1 ]( s
}
+ T" ]0 B) J  @$ L8 M/ M/ V对应源代码的请求对象如下:) n. m! T7 G+ y7 A2 a" o3 i" u4 ~
type SubmitRequest struct {    //function submit request
: Q: `4 T  b* l/ _        Tx types.Tx `json:"raw_transaction"`
% S- @3 o/ M% @: _1 E) W4 r}
) ?$ }8 c7 Y# ?: O$ B, `结构字段说明如下:
9 W; s- l3 H4 UTx 签名完成之后的交易信息。这里需要注意该字段中的raw_transaction不是签名交易sign-transaction的全部返回结果,而是签名交易返回结果中transaction中的raw_transaction字段。% Z# p; H) a0 E& o
6 F1 P3 _; P4 l) a# y3 |
submit-transaction请求成功之后返回的json结果如下:% e8 q/ X$ N( G- W- x
{$ j) J7 U/ R! f. ?
  "tx_id": "2c0624a7d251c29d4d1ad14297c69919214e78d995affd57e73fbf84ece361cd") g; n( M5 `& N7 O
}# [3 W8 O, ]) j5 \
对应源代码的响应对象如下:
% [/ m7 l0 ^4 F* w& w3 Xtype submitTxResp struct {
) s& r$ O4 {' o        TxID *bc.Hash `json:"tx_id"`
5 k# ^. t* H- X}
. X2 H% {# ~. z( _结构字段说明如下:+ H) r2 W* ?* _  {% w0 T, E" i
TxID 交易ID,当交易被提交到交易池之后会显示该信息,否则表示交易失败) i* w8 v  ?& d& d

$ r$ V5 @9 K. V: I: E
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

V刘晨曦 初中生
  • 粉丝

    0

  • 关注

    3

  • 主题

    14