Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

V刘晨曦
102 0 0
比原项目仓库:9 E  Y" c+ r$ j. y& z2 d
Github地址:https://github.com/Bytom/bytom
# V4 T' [+ y0 k3 M. [9 iGitee地址:https://gitee.com/BytomBlockchain/bytom
5 S/ \1 a( O% q9 f该部分主要针对用户使用bytom自带的账户模式发送交易/ X) V2 |7 I5 R) }8 \
1、构建交易% w* M* q8 m4 S8 L) C$ g: ~+ v: W
API接口 build-transaction,代码api/transact.go#L1209 u- Y* Q( a( N: g8 u& k5 a. a
以标准的非BTM资产转账交易为例,资产ID为全F表示BTM资产,在该示例中BTM资产仅作为手续费,该交易表示花费99个特定的资产到指定地址中。其中构建交易的输入请求json格式如下:
# v% N, [) M( r' q* e2 N4 R{  V6 b! z9 F8 x3 A' B
  "base_transaction": null,
9 e! N# r" q1 U$ V3 s7 h  "actions": [
- f# w: ]6 d9 Z6 Q    {
4 u' q4 j2 \" X! ]      "account_id": "0ER7MEFGG0A02",
" b# t8 }6 d4 m, n$ M; p6 j  w: k) N      "amount": 20000000,8 ~2 o4 c1 a( c) l$ x8 H# Q
      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
% Z% K  [9 Z3 M+ K! V      "type": "spend_account"
: x  P8 `3 Z% Q9 e    },$ q: a! n7 P# m3 [  P
    {
% U6 {# w5 H( c, v- D4 D3 E      "account_id": "0ER7MEFGG0A02",# f3 Q7 R* |' b. F/ V" q
      "amount": 99,
9 z' f  ^- t& G& n* M8 `      "asset_id": "42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f",
2 X+ G5 d& v  X; x" h      "type": "spend_account"- S, i6 ?. p: J1 n3 F
    },
5 L! _' j1 p  K& D) R- Z. a    {! T. ]  j% t5 c' \1 z2 e
      "amount": 99,5 w( z, o  Y: |( E
      "asset_id": "42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f",$ I5 A# P: Y# @7 Y8 }+ q- s
      "address": "sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me",. l& U) f' D" t* S! C  _
      "type": "control_address"
& i1 G0 ^& \4 Q! C3 i    }3 X/ @; M! N& i$ g
  ],
4 v1 T2 Z& t/ A! ~* s7 L3 F  "ttl": 0,
8 f: ?% V6 k8 `1 Q( x  "time_range": 06 h' N8 t# M, V9 F
}
  \$ ?% r& G0 M, Q( a4 L) y; K4 r对应源代码的请求对象如下:9 I( U' a, n3 e3 g3 s
// BuildRequest is main struct when building transactions
7 Q( O7 `$ {4 f/ I& Ptype BuildRequest struct {
9 d# p0 w+ T! ^  n3 \, h        Tx        *types.TxData            `json:"base_transaction"`
& v/ P; @; h$ @- c        Actions   []map[string]interface{} `json:"actions"`8 f( j4 O1 p7 D( a5 o# g( }
        TTL       json.Duration            `json:"ttl"`
* {- d. `+ g9 B1 r' x& C- G        TimeRange uint64                   `json:"time_range"`% `: ]6 m& S9 z8 n4 n, M
}
# {3 ], }1 u4 r  \9 D结构字段说明如下:
# P. J1 t8 \" |2 Y1 ~' ITx 交易的TxData部分,该字段为预留字段,为空即可
/ J6 Y8 ~+ s& D9 t$ eTTL 构建交易的生存时间(单位为毫秒),意味着在该时间范围内,已经缓存的utxo不能用于再一次build交易,除非剩余的utxo足以构建一笔新的交易,否则会报错。当ttl为0时会被默认设置为600s,即5分钟
4 m+ ~( r, a8 \; D2 b; PTimeRange 时间戳,意味着该交易将在该时间戳(区块高度)之后不会被提交上链,为了防止交易在网络中传输延迟而等待太久时间,如果交易没有在特定的时间范围内被打包,该交易便会自动失效3 M3 H' K2 r+ O# f  k, A
Actions 交易的actions结构,所有的交易都是由action构成的,map类型的interface{}保证了action类型的可扩展性。其中action中必须包含type字段,用于区分不同的action类型,action主要包含input和output两种类型,其详细介绍如下:% o( J/ X3 H; g  C, W0 h& w& @
input action 类型:  m4 \0 D) i; p" f% c
issue 发行资产
5 Y; j0 J1 O" M3 Uspend_account 以账户的模式花费utxo
+ r+ l1 Z  m' ^7 B" P9 lspend_account_unspent_output 直接花费指定的utxo
9 W# n: b* H) {5 b" o5 B2 woutput action 类型:
( U4 `. x  n' M% pcontrol_address 接收方式为地址模式
7 g& d4 U4 a+ b5 ~control_program 接收方式为(program)合约模式
" J' j/ I" L! [7 e" O# R! U" `retire 销毁资产8 @) @" i8 A! n
4 d6 h8 r. m! `; Z

2 ]4 n- F* J6 h: D- B* _- a* o
* u, n9 ~: P1 l. }注意事项:9 i$ _% M* a" p$ ?0 _, o
一个交易必须至少包含一个input和output(coinbase交易除外,因为coinbase交易是由系统产生,故不在此加以描述),否则交易将会报错。: c: E7 @& F. T9 R
除了BTM资产(所有交易都是以BTM资产作为手续费)之外,其他资产在构建input和output时,所有输入和输出的资产总和必须相等,否则交易会报出输入输出不平衡的错误信息。! l8 e* M3 \( W  N
交易的手续费: 所有inputs的BTM资产数量 - 所有outputs的BTM资产数量
) F+ Y% f- J% b* I/ o+ u交易中的资产amount都是neu为单位的,BTM的单位换算如下:1 BTM = 1000 mBTM = 100000000 neu
5 U# A2 \" [3 b) W* g( V0 r, Y! C" X! _( F
action简介
. q& q$ Q* I- o5 H, }: E下面对构建交易时用到的各种action类型进行详细说明:
' o  ~1 h) L3 T' B% {issue
3 v7 @: q! e0 H) [& |issueAction结构体源代码如下:& K5 I/ j6 m' w  M8 ^
type issueAction struct {
( e$ e% t  a/ u8 O, o2 l, T2 ^: ~        assets *Registry$ W" a* ~6 s, {6 p# s4 p
        bc.AssetAmount) q! f% P# j* s) p2 H
}
0 A# X$ Q% P/ \, [' c! ?type AssetAmount struct {
7 C1 f+ e4 W" a, ~6 C& r' j        AssetId *AssetID `protobuf:"bytes,1,opt,name=asset_id,json=assetId" json:"asset_id,omitempty"`
* ~* x4 T4 C2 D+ p        Amount  uint64   `protobuf:"varint,2,opt,name=amount" json:"amount,omitempty"`& y8 n' R% O; N, q& R9 d  y
}- q: x* s2 h# z
结构字段说明如下:3 u9 c5 t0 r$ g" U, j! i
assets 主要用于资产的管理,无需用户设置参数
3 M' o& j& K6 [* o& S9 j: Z5 aAssetAmount 表示用户需要发行的资产ID和对应的资产数目,这里的AssetID需要通过create-asset创建,并且这里不能使用BTM的资产ID
9 S; s* M2 z$ c4 L
* j0 [/ F7 c* GissueAction的json格式为:+ z3 _# l: L! _  ]: x
{3 R4 k( G( L' h6 j" [
  "amount": 100000000,$ Z* ^% H) J: @( \
  "asset_id": "3152a15da72be51b330e1c0f8e1c0db669269809da4f16443ff266e07cc43680",
7 C( D. S3 L) {1 s  n  "type": "issue"
- v* z. H! R: H' m- O}
) P2 K! y0 N5 O8 c- k+ U- _/ Y9 X例如发行一笔资产的交易示例如下:
4 f! j+ X7 y: ~(该交易表示发行数量为900000000个assetID的42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f的资产到接收地址sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me中, 其中手续费为20000000neu的BTM资产)
0 K5 c* v; l2 T{
" z# x4 v& [4 r9 r" _4 K  "base_transaction": null,% Z: Z7 d8 U& f) q$ {$ v2 B8 }
  "actions": [
# U( P  \/ P. i# u9 k    {
, O7 e& s* g5 x! ]9 v      "account_id": "0ER7MEFGG0A02",1 l  t! v. q5 \9 [$ j
      "amount": 20000000,
: F5 `3 w* v2 \  C, C4 d      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
5 S; F4 U% T1 c4 g      "type": "spend_account"
  m" _0 V7 I' |  R: s    },: I7 O% e/ v9 I( W% D6 H6 A
    {
$ M7 ]. x7 V( O( w9 ?* t      "amount": 900000000,
  ~+ t$ y8 o9 N      "asset_id": "42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f",
' }$ ]# F9 i) B/ j2 k      "type": "issue"5 v: W& G- ~& L. z7 e
    },# G/ e4 |$ j  _9 t3 X
    {: E' I/ w6 m$ y1 Z
      "amount": 900000000,* E( A* g; [& z# {+ O
      "asset_id": "42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f",
5 U! A& u* r: D; B6 y3 R' I& ]      "address": "sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me",
7 x2 X% i( {+ P* q9 ^) R      "type": "control_address"
- R5 Q2 x& W" l- d    }
4 s8 }0 ^6 ~; ?5 `* W) p( @; U  ],6 X# n* p# b  @1 `
  "ttl": 0,3 n6 ]! E! t/ _
  "time_range": 0, M8 v; l/ Z0 ]7 J  Z3 J5 U
}8 ~# o7 ~+ j. Q# }2 x' a9 H
5 {  z; }2 {3 D0 f
spend_account
7 K# l/ Y% R1 O7 S! L1 _spendAction结构体源代码如下:2 \# i0 E- p# I0 J
type spendAction struct {/ m8 j/ Q& ~% c: Q/ `$ A
        accounts *Manager
8 ]0 v9 B& ^, q; S  l) t        bc.AssetAmount
9 a1 r; S5 Y$ ]. b4 ~' n/ W        AccountID   string  `json:"account_id"`1 Y: _; K5 K4 ?  E( L
        ClientToken *string `json:"client_token"`
( G, o) ^2 e6 a- p0 ^1 X# ^" s}
6 c+ }- ?* `; n( X" ~type AssetAmount struct {/ d9 m9 @. m. o3 m7 [9 [2 R
        AssetId *AssetID `protobuf:"bytes,1,opt,name=asset_id,json=assetId" json:"asset_id,omitempty"`
3 z6 ]% V, q% l4 E5 l0 f        Amount  uint64   `protobuf:"varint,2,opt,name=amount" json:"amount,omitempty"`
0 v6 M, n. G0 i& S% s" T}
6 l* L+ d- E4 T) t结构字段说明如下:
5 i0 i/ v& K7 y8 K2 N0 c+ waccounts 主要用于账户的管理,无需用户设置参数1 E6 T' x2 |; {2 p
AccountID 表示需要花费资产的账户ID
( Z% e: s+ q, Q9 u+ m* DAssetAmount 表示花费的资产ID和对应的资产数目
: X8 |7 p0 X) ?. c& }ClientToken 表示Reserve用户UTXO的限制条件,目前不填或为空即可' w) h* L8 [( |
8 e. U4 J$ i- \, T4 R" T
spendAction的json格式为:
  s" s; b5 |0 R' L* [# i{0 b- O# c3 S% \% f2 c3 P
  "account_id": "0BF63M2U00A04",0 G2 ^( K7 L/ R! Z1 o; j
  "amount": 2000000000,, ~0 e* H4 w) P3 U- q
  "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",& O  v5 t, w4 J+ n  }4 O
  "type": "spend_account") O3 M+ [* N1 C3 ]4 |! i1 v( o
}
; a/ D2 @8 U9 y例如转账一笔资产的交易示例如下:! g  M+ @2 w1 ~$ l- h: d: Z' o) T
(该交易表示通过账户的方式转账100000000neu的BTM资产到地址sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me中, 其中手续费20000000neu = 输入BTM资产数量 - 输出BTM资产数量)! I9 D& B& A5 G" e2 K! I
{
5 |9 g. |7 E7 C! O  "base_transaction": null,
: O% B& B: F) ^% H/ \6 v2 @" K# x2 q  "actions": [
- R7 ?% E1 v9 ?2 [  a5 X% [) I    {/ p. Q0 D5 K* A5 ?$ v
      "account_id": "0ER7MEFGG0A02",
3 h' Z& j- b9 D7 r3 _9 T      "amount": 120000000,
' w& V( @0 E( O2 t6 R; B      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
: S* o5 l3 d8 m8 |7 V      "type": "spend_account"2 B* q) M9 f) q; y# R
    },
  h$ @& f+ _* [" M% C, d    {. S2 Y4 N3 @3 \
      "amount": 100000000,
1 Z( N0 |; ]: A. Z" h8 W2 [3 G      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",, U  N1 t( T, }& F, t
      "address": "sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me",) E! G- v# L. P9 h* r4 ^: O
      "type": "control_address"
/ m; C5 H3 f/ ~$ G4 f4 P$ c    }  |1 K* e$ M4 M. L9 s4 s, @
  ],
. d' M% ?: T1 j$ m' p# f  "ttl": 0,
% X8 ~6 l/ _5 Y' }  "time_range": 05 P/ {. w5 @& W7 ^, w) C
}
% e; }( `5 A3 X. u) U, e
- _, z/ F6 Q2 j. \( n- Z  tspend_account_unspent_output1 w4 t8 b/ T6 R' j
spendUTXOAction结构体源代码如下:
& p( m9 u1 ^( k$ Wtype spendUTXOAction struct {
) J; m4 n. y8 o4 E' @  E/ r0 J9 Q        accounts *Manager  w' t1 ]5 H$ ?4 S6 n
        OutputID *bc.Hash `json:"output_id"`; R! R; D* i6 B' F) e( P. T
        ClientToken *string `json:"client_token"`
: N1 C! w! p6 i( d}2 O2 L( W3 `4 C1 u5 M  L3 \
结构字段说明如下:) B/ I7 {6 r1 p( Q% s3 P
accounts 主要用于账户的管理,无需用户设置参数) y! T0 `7 i  h$ C* B9 Y8 h9 R/ l0 F
OutputID 表示需要花费的UTXO的ID,可以根据list-unspent-outputs查询可用的UTXO,其中OutputID对应该API返回结果的id字段/ E# I% [; ?4 f( Q! U( g' |/ i
ClientToken 表示Reserve用户UTXO的限制条件,目前不填或为空即可
/ l) F/ L: T1 n; H8 I0 s- b5 M* T. A* h
spendUTXOAction的json格式为:# V( }% t7 I0 J* ?( N# d' b
{
' ?9 a+ {' c+ s# x  "type": "spend_account_unspent_output",# R! f* v8 a! R2 s0 Z- P
  "output_id": "58f29f0f85f7bd2a91088bcbe536dee41cd0642dfb1480d3a88589bdbfd642d9"  W1 C6 b7 J( D! [/ L
}
0 ~  y1 ~! }; n# I" F, L( l! S例如通过花费UTXO的方式转账一笔资产的交易示例如下:
' z  b  O+ p7 G5 k9 j7 @(该交易表示通过直接花费UTXO的方式转账100000000neu的BTM资产到地址sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me中, 其中手续费 = 输入BTM资产的UTXO值 - 输出BTM资产数量)1 f" x! V) m  A) j
{5 b0 z/ l; J5 r7 G- ]* p% B: b: A
  "base_transaction": null,$ K) `. y4 @: x5 S, ^% l
  "actions": [. B8 x* Y) p. j5 j7 E
    {
8 C2 F3 b8 n, H, h      "output_id": "58f29f0f85f7bd2a91088bcbe536dee41cd0642dfb1480d3a88589bdbfd642d9"," h/ ^2 s6 p$ ~1 }- C) J0 J7 ~
      "type": "spend_account_unspent_output"* @3 Z8 Y8 _( c3 g" X
    },8 m' ^# `* r( y) c/ B) E+ F
    {
/ z( [' `+ n) K  X) ~* \) G( ^      "amount": 100000000,
/ \/ A% Z) `4 z) M# W      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
! e7 `' `: Q1 B* f, e3 y. M      "address": "sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me",
3 ]4 L3 D( ?; K  h2 d      "type": "control_address". l5 A/ t2 f6 R5 T. `
    }1 k4 [/ H" s  P4 D
  ],
6 {# ^6 C2 r3 @6 ?$ `8 s  "ttl": 0,
% s7 x& N/ V3 |8 k/ x  "time_range": 0% Y+ Z  |; ?5 n2 u
}
8 ~4 Y5 t( U* h
& _& n' S0 n3 z  g. {9 _control_address, b% U- Q" p$ d9 j. z; O$ Z
controlAddressAction结构体源代码如下:) G' I8 J  v0 D; i
type controlAddressAction struct {
7 h7 |/ [- K- R6 p        bc.AssetAmount
9 X; v& Y$ V: M" H. }# D3 V        Address string `json:"address"`! L0 o- B! C3 b' z9 X0 j
}6 N% c, G$ ]8 C' @+ m
type AssetAmount struct {
( j9 ]+ B! z# r/ F$ e        AssetId *AssetID `protobuf:"bytes,1,opt,name=asset_id,json=assetId" json:"asset_id,omitempty"`3 B1 Y1 i6 V5 t& i6 X! ~
        Amount  uint64   `protobuf:"varint,2,opt,name=amount" json:"amount,omitempty"`( z; S) Y; P8 d* |: m
}
. {% A8 d& D- g2 @, e结构字段说明如下:
* ?% N4 m$ D# O. QAddress 表示接收资产的地址,可以根据 create-account-receiver API接口创建地址
  m8 |# J+ t1 hAssetAmount 表示接收的资产ID和对应的资产数目3 t* p. L+ q( m5 ~  f, r
& C, F8 k/ r/ U( t
controlAddressAction的json格式为:
# R1 M" h. t& G& n: a9 V0 L{
1 I8 G9 e7 Z4 B9 C# }5 J" J) x  "amount": 100000000,
7 @* s) S6 u7 D& [6 m  "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
' U5 ]" i. H. J' Z2 y2 q5 p1 r0 s  "address": "bm1q50u3z8empm5ke0g3ngl2t3sqtr6sd7cepd3z68",; D+ G9 v" V* ^, }$ o
  "type": "control_address"
6 b+ I; h+ F; O}
2 d8 l4 M# _# v例如转账一笔资产的交易示例如下:# ^" J( S" p0 P# O. F/ j- D( o( T) y
(该交易表示通过账户的方式转账100000000neu的BTM资产到地址sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me中, 其中control_address类型表示以地址作为接收方式)7 S, r1 d! _) p+ d9 z
{3 `) v4 T. M" X; z% {
  "base_transaction": null,
/ O( F0 U: s; X: _  "actions": [& D8 |5 S% |/ O/ L+ u& L% B9 u. l* C" `
    {
; \- _! ^* B3 n      "account_id": "0ER7MEFGG0A02",
) y6 f( E7 S, U& z9 @* k- x      "amount": 120000000,
. z9 J3 F' q+ F0 @  r      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",+ Y1 x7 T7 S% S' D$ ?- |7 Z; x
      "type": "spend_account"( H2 w" a' @, ~
    },! y: E. _. \% H/ J
    {
. N7 @+ W3 e% |0 r      "amount": 100000000,
  _$ e0 m4 t4 @9 m! q; l      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",& O' j7 @+ d3 o) S% I) N% U- l
      "address": "sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me",6 q" W9 G+ m' ]6 W% Q( K
      "type": "control_address"+ y6 f3 J( c$ Z) }
    }* ?; z: _  W. s/ `1 p6 k, N3 P
  ],
  J) ~% s7 R* J+ W. a$ D" D  "ttl": 0,
, k& g3 \( A9 X  "time_range": 0' Z" c& z: O  I$ \! B: G1 w8 h8 p
}
1 f+ Q! N- V& }. e* F8 s/ \- o2 z* ?$ I4 Z
control_program
- Z5 i7 ^* y5 R! j& r$ v8 acontrolProgramAction结构体源代码如下:# X) n) j& x, `
type controlProgramAction struct {0 L7 b" K3 n9 ^( a- [3 C; p( P* I7 V  m
        bc.AssetAmount
1 p- E. X6 O+ ]' A0 i% l3 }3 R        Program json.HexBytes `json:"control_program"`3 G+ G$ |  n5 q9 l8 ?: G3 B0 \
}
% r1 P, d% f& L2 f( Etype AssetAmount struct {! B* c9 N) h) A7 W# [  w% j2 X
        AssetId *AssetID `protobuf:"bytes,1,opt,name=asset_id,json=assetId" json:"asset_id,omitempty"`
9 x3 f1 p, l; e; U5 s/ s        Amount  uint64   `protobuf:"varint,2,opt,name=amount" json:"amount,omitempty"`0 _, o, j% s9 ]' o
}
% a* j" I- q& ?  c; o, _结构字段说明如下:
) ]' @+ F5 g* ]Program 表示接收资产的合约脚本,可以根据 create-account-receiver API接口创建接收program(返回结果的 program 和 address 是一一对应的)# o* J* m' o3 O, E# M* W
AssetAmount 表示接收的资产ID和对应的资产数目
# B3 ^; Y- Z9 g, A4 d8 ^* j
- }% H  C& j( e- bcontrolProgramAction的json格式为:3 e& l1 j9 |; {. }. l7 W3 L8 Y
{4 L4 O% e! J3 g' R/ E: l1 L
  "amount": 100000000,
5 G" r- F. v' a; N" ^, E6 u+ R. O  "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",/ o; |% @9 @$ q3 [' d
  "control_program":"0014a3f9111f3b0ee96cbd119a3ea5c60058f506fb19",: {& p4 {, R) ~0 q! A4 ^0 ~& D0 E
  "type": "control_program"" [  ^% _4 R$ O: q5 l
}
; Q# ^" u, Q( [" F3 q+ o+ {7 \例如转账一笔资产的交易示例如下:
1 J$ b" f- T" e, D$ U- Z) B, N(该交易表示通过账户的方式转账100000000neu的BTM资产到接收program(跟address是一一对应的)0014a3f9111f3b0ee96cbd119a3ea5c60058f506fb19中, 其中control_program类型表示以program作为接收方式)
5 s. F7 k; U5 R% `$ @3 l. Q; V+ b{2 s6 o( L. |# f) w- t' J$ H  o, @
  "base_transaction": null,
( Z3 a  x4 G) E1 |1 Q; ]5 O8 z, Q6 q8 \  "actions": [
/ i9 h* }$ O0 K8 B# \    {
; P' j" c) Q# T6 @, U4 o      "account_id": "0ER7MEFGG0A02",+ a6 X$ Z9 x9 v& ]
      "amount": 120000000,* T5 ?  C2 b* e8 p! }( q  d
      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",& f* Q$ h* ]- B( H8 S8 P, B$ w1 `3 Q
      "type": "spend_account"
. ?2 o- e1 N# n  h    },
" T. v2 C% U/ Y1 P2 ~) k    {$ J5 V( k7 ~4 w, t9 ]& w$ {
      "amount": 100000000,
( x+ e4 q9 G% E! M9 I      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",. b: r3 z6 ?$ P' W9 J+ z: u  H
      "control_program": "0014a3f9111f3b0ee96cbd119a3ea5c60058f506fb19",: Q& K6 p) z8 o: y3 c6 \2 b
      "type": "control_program"
+ v' e% |6 y9 [' n, H    }2 w$ t2 j6 U& d- M6 I7 @* j
  ],
% R1 |, z$ m& r- K: \; z  "ttl": 0,
1 x9 b4 L) \2 W% ~0 B- K" m8 E  "time_range": 0
2 y3 V! d3 c  r6 l}5 W1 r4 N, C' U

' X+ P( `/ t6 O, Q: s7 eretire+ H) ~2 j! _  ~0 a0 e0 w
retireAction结构体源代码如下:2 K# f  ~6 ^3 r5 t* E( C
type retireAction struct {
, @) @% U! m1 C5 A. D        bc.AssetAmount
3 ~3 Y$ S: I. ^7 v7 K8 i}
3 w: }2 }! O! C! F" q3 xtype AssetAmount struct {
" d# ?- z3 K* C3 O: @! E$ H  @# I        AssetId *AssetID `protobuf:"bytes,1,opt,name=asset_id,json=assetId" json:"asset_id,omitempty"`* {5 h" l( {; g+ g$ l7 G" J* |+ R
        Amount  uint64   `protobuf:"varint,2,opt,name=amount" json:"amount,omitempty"`
2 s' ?3 i8 B6 r% j}
6 g, f2 t# a: A3 c! h, i结构字段说明如下:
- e2 k* t) l* Y7 b; F7 bAssetAmount 表示销毁的资产ID和对应的资产数目
* v' u9 f& m) V; T; ^
" `+ ~8 w+ ]1 k1 {- p$ W4 yretireAction的json格式为:
: _$ T' H8 _6 H  S' E; W{
4 u/ `1 J9 n6 K: J  "amount": 900000000,: B  B& \" |9 Z" ?4 @: M
  "asset_id": "3152a15da72be51b330e1c0f8e1c0db669269809da4f16443ff266e07cc43680",
) x, j# I: A% \, X. m  "type": "retire"4 E/ \! L5 E; w% E, [/ s, k6 ^" o5 S
}: s, I& P# a7 U5 I2 ^, G5 [2 X
例如销毁一笔资产的交易示例如下:
" ^- E6 [+ v: w( f/ e1 H(该交易表示通过账户的方式将100000000neu的BTM资产销毁, retire表示销毁指定数量的资产)
0 n% ^" B. V& Z- i+ s% M: V{
' S; v2 R% D% f  "base_transaction": null,! ?6 U8 K; i0 P- Q" y2 l  t& D9 N
  "actions": [7 T0 k: g6 r# K3 k% j: v" `+ D
    {
& p9 {$ y  ~  g5 w( K# g3 E      "account_id": "0ER7MEFGG0A02",0 R5 ^; @1 P1 `$ {
      "amount": 120000000,8 Y6 Z7 I5 l7 e: ]& I$ R& K" v  n
      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
  E0 y7 I- p7 i      "type": "spend_account"9 u! S6 j8 C% p- O% d7 W6 q
    },' Q" E" q- u! Y: E0 B
    {
; _+ W9 G# S5 j      "amount": 100000000,
" t; W+ R& g0 p1 B% W  U, n      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
" T) n) f# m9 o# J8 Y      "type": "retire", Q2 B' ]* p) {
    }0 p. Z% X1 m  }) t0 H: O
  ],
8 Z. P" m+ B6 O  "ttl": 0,
! W5 u! y) \8 d! O  "time_range": 02 v. }. o9 D% F6 j2 m% P
}5 ]  |: u0 x8 R+ O; _# `
; I; Z+ P1 y/ D) A2 T6 G# W4 Q
build-transaction的输入构造完成之后,便可以通过http的调用方式进行发送交易,构建交易请求成功之后返回的json结果如下:
3 @0 @/ E! @1 g2 ^{
; y: E( r9 e& S, g1 L  "allow_additional_actions": false,( q, _# w& x$ [( r" `4 w2 r
  "raw_transaction": "070100020161015f1190c60818b4aff485c865113c802942f29ce09088cae1b117fc4c8db2292212ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8099c4d599010001160014a86c83ee12e6d790fb388345cc2e2b87056a077301000161015fb018097c4040c8dd86d95611a13c24f90d4c9d9d06b25f5c9ed0556ac8abd73442275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f80a094a58d1d0101160014068840e56af74038571f223b1c99f1b60caaf456010003013effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80bfffcb9901011600140b946646626c55a52a325c8bb48de792284d9b7200013e42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f9d9f94a58d1d01160014c8b4391bab4923a83b955170d24ee4ca5b6ec3fb00013942275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f6301160014366b275ed9b2266b645cf1b8be51009cc3b260e100",
& O8 G5 V/ F. s8 t  "signing_instructions": [
& O7 k4 @: z. Y4 j    {3 u) }9 Q- `0 ?9 o3 O* v
      "position": 0,
' N  R4 C7 b$ o5 Z      "witness_components": [: s. t( H( N3 ^9 @* M
        {4 m/ j7 @6 A8 o
          "keys": [& `4 ^2 b; Y* a6 k' W
            {
( J* F4 j5 O0 Q6 T, e* v( d( q( X              "derivation_path": [
& S# z) [( P. p. i0 \- ?, I# \0 l                "010100000000000000",
2 u2 j, J3 r( l) ]+ {/ b$ d                "0100000000000000"8 L7 }4 S' _0 |/ u  x5 F
              ],
- A; ~+ ]' P7 p2 h/ ]1 g              "xpub": "de0db655c091b2838ccb6cddb675779b0a9a4204b122e61699b339867dd10eb0dbdc926882ff6dd75c099c181c60d63eab0033a4b0a4d0a8c78079e39d7ad1d8"2 q5 Y' W2 u' t: O0 L4 O  I
            }% F: [0 W! l- {2 S* Q& t4 ^7 c3 K1 B
          ],
. i& O* Y0 [1 _* Y- O+ p          "quorum": 1,
( G! e. Z; A! I- J  f; I+ w. ^* e          "signatures": null,
8 z9 U& B3 U, j) _2 Z# r! B: P          "type": "raw_tx_signature"4 W. h: L& {. {. A4 e/ I
        },
! i1 Z& J9 m9 M) e1 h- r1 I$ c  ~. ~+ O        {
! S) q; [; {3 s1 w( K5 ]          "type": "data",
  ^! ^* e9 s5 _, M2 }) X1 z( t( D          "value": "d174db6506e35f2decb5be148c2984bfd0f6c67f043365bf642d1af387c04fd5"& R1 b, r! k- r. c+ |, Z7 S3 ?; H& o
        }, j& j  i" Q% k5 i. Z
      ]" N5 w/ U. o1 g8 Q
    },
  ?2 G1 i2 p. {+ T2 I    {" t+ H7 J) r2 q8 F8 j
      "position": 1,
# j+ R0 |# y. Z- H+ ^      "witness_components": [
) P: a" W4 z8 o5 e/ T5 x6 n& Z. A        {9 {# z7 M, Y/ J$ ~. w; E/ F( D
          "keys": [
7 V7 L6 E, ~6 o: e/ v            {
3 `. I& }# {: _9 U              "derivation_path": [
9 N& I2 ?9 X& F                "010100000000000000",
( t0 b6 f+ v4 p; _                "0800000000000000"
. _) }9 z0 j8 F% c' t5 \              ],
2 m: C) a" j0 D. ?6 T              "xpub": "de0db655c091b2838ccb6cddb675779b0a9a4204b122e61699b339867dd10eb0dbdc926882ff6dd75c099c181c60d63eab0033a4b0a4d0a8c78079e39d7ad1d8"
3 a. n: T  O7 X            }
- s% p" r) B2 ]$ z$ }1 ]          ],+ O" z, j- F# p; F0 {( h) I
          "quorum": 1,- H4 |3 K& o' T1 {+ t
          "signatures": null,
: T/ T$ A0 M1 n* h          "type": "raw_tx_signature"
/ |6 c, d0 u$ X$ Q        },
. I& [* T0 h1 D/ t        {
9 t2 U$ {6 p6 @2 L          "type": "data",5 L/ ^: L; _) G
          "value": "05cdbcc705f07ad87521835bbba226ad7b430cc24e5e3f008edbe61540535419"
! c% h' Q7 H# t" b! `        }
0 H( @2 [1 S+ k  L3 C; |7 X, P      ]( _9 `$ J! s( J* G# `" T
    }
2 k% l6 W1 x" W& e  ]; N9 m) A: _2 r" X+ h3 N* {5 k$ x
}" N5 G! n& `- X8 E1 r6 M3 @
对应响应对象的源代码如下:4 g7 e) L$ Z7 ?1 t
// Template represents a partially- or fully-signed transaction.
* n2 a. N' \. J4 z- G) f5 o% j0 h/ \type Template struct {$ g' `- c, h; o. J: T! H
        Transaction         *types.Tx             `json:"raw_transaction"`
2 f: Q& F+ b0 `1 |/ `7 R        SigningInstructions []*SigningInstruction `json:"signing_instructions"`
7 T' ~2 b0 u/ o, b0 f        // AllowAdditional affects whether Sign commits to the tx sighash or% H0 D% C7 g# c' K7 m
        // to individual details of the tx so far. When true, signatures
( V* D- Z* K0 a. h/ V        // commit to tx details, and new details may be added but existing/ j! P9 f1 x+ d
        // ones cannot be changed. When false, signatures commit to the tx4 W# v; k/ N3 p  \0 v( x4 `
        // as a whole, and any change to the tx invalidates the signature.$ l. P1 t1 n# G* u
        AllowAdditional bool `json:"allow_additional_actions"`' t2 y/ E2 s- M8 n0 X
}4 n/ n% a! p- e+ y. v- F
结构字段说明如下:" k; J) t( E+ y# o
Transaction 交易相关信息,该字段包含TxData和bc.Tx两个部分:. V$ `. P$ U9 I8 a: ~
TxData 表示给用户展示的交易数据部分,该部分对用户可见
9 a) c! V" @6 c' N. V2 \Version 交易版本4 i/ _: ^5 v. G# {: Q& w
SerializedSize 交易序列化之后的size
: m  l2 i* f: I& xTimeRange 交易提交上链的最大时间戳(区块高度)(主链区块高度到达该时间戳(区块高度)之后,如果交易没有被提交上链,该交易便会失效)! k5 o* _4 E+ r  A! j
Inputs 交易输入1 S9 L# b9 T6 C& c7 B
Outputs 交易输出
+ E" H% k; P9 s- K: _$ s* ebc.Tx 表示系统中处理交易用到的转换结构,该部分对用户不可见,故不做详细描述: `! P2 `- F/ j/ S7 W, X- L
SigningInstructions 交易的签名信息
( g3 c# \# T- ~. s. sPosition 对input action签名的位置/ Y  \' O3 Y4 Q: f7 [2 c4 J+ [& N7 X
WitnessComponents 对input action签名需要的数据信息,其中build交易的signatures为null,表示没有签名; 如果交易签名成功,则该字段会存在签名信息。该字段是一个interface接口,主要包含3种不同的类型:, z% X* g) ^' h2 f( z0 @! C
SignatureWitness 对交易模板Template中交易input action位置的合约program进行哈希,然后对hash值进行签名$ v4 i( N& H; ~2 Z
signatures (数组类型)交易的签名,sign-transaction执行完成之后才会有值存在
/ S- Z; g! M0 K2 O& t& ~" Okeys (数组类型)包含主公钥xpub和派生路径derivation_path,通过它们可以在签名阶段找到对应的派生私钥child_xprv,然后使用派生私钥进行签名/ E& k1 _$ }& P7 @% d# X3 q$ t
quorum 账户key 的个数,必须和上面的keys的长度相等。如果quorum 等于1,则表示单签账户,否则为多签账户
0 @* S* c! M: ^. o3 Q" w+ C7 U5 n7 I; `program 签名的数据部分,program的hash值作为签名数据。如果program为空,则会根据当前交易ID和对应action位置的InputID两部分生成一个hash,然后把它们作为指令数据自动构造一个program' z! Z; S5 _) P$ @2 u+ i
RawTxSigWitness 对交易模板Template的交易ID和对应input action位置的InputID(该字段位于bc.Tx中)进行哈希,然后对hash值进行签名- ?. S) T/ ?# W7 U2 x' C! N3 T
signatures (数组类型)交易的签名,sign-transaction执行完成之后才会有值存在
6 J6 C. B* ?6 \4 D, C/ ?: Fkeys (数组类型)包含主公钥xpub和派生路径derivation_path,通过它们可以在签名阶段找到对应的派生私钥child_xprv,然后使用派生私钥进行签名
' w! y* Y9 h( y# jquorum 账户key的个数,必须和上面的keys 的长度相等。如果quorum 等于1,则表示单签账户,否则为多签账户
" M8 a% x' v. K6 M( NDataWitness 该类型无需签名,验证合约program的附加数据3 U) N. x2 w' V  ?$ ]

. D* J$ w1 w9 x) T8 HAllowAdditional 是否允许交易的附加数据,如果为true,则交易的附加数据会添加到交易中,但是不会影响交易的执行的program脚本,对签名结果不会造成影响; 如果为false,则整个交易作为一个整体进行签名,任何数据的改变将影响整个交易的签名# _2 D. U, b, \7 T

; r( q+ |2 ]. b9 H4 C8 l0 u估算手续费9 w1 |" {7 L+ X3 _: [
估算手续费接口estimate-transaction-gas是对build-transaction的结果进行手续费的预估,估算的结果需要重新加到build-transaction的结果中,然后对交易进行签名和提交。其主要流程如下:+ f: G. j, R/ H, @1 |3 e: U
  build - estimate - build - sign - submit% q1 B7 W+ Z  M3 m
估算手续费的输入请求json格式如下:
, U" B& W, v& e5 C  y{
$ T& R. h8 V" H4 O' Z  "transaction_template": {6 F" _) q3 U! }- A+ k+ A* y+ ]! V
    "allow_additional_actions": false,
1 a, g# s4 X( J( h+ Q; y2 w    "raw_transaction": "070100020161015f1190c60818b4aff485c865113c802942f29ce09088cae1b117fc4c8db2292212ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8099c4d599010001160014a86c83ee12e6d790fb388345cc2e2b87056a077301000161015fb018097c4040c8dd86d95611a13c24f90d4c9d9d06b25f5c9ed0556ac8abd73442275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f80a094a58d1d0101160014068840e56af74038571f223b1c99f1b60caaf456010003013effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80bfffcb9901011600140b946646626c55a52a325c8bb48de792284d9b7200013e42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f9d9f94a58d1d01160014c8b4391bab4923a83b955170d24ee4ca5b6ec3fb00013942275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f6301160014366b275ed9b2266b645cf1b8be51009cc3b260e100",
" e# N1 p  F( C7 M7 @% M    "signing_instructions": [$ R* x" Z7 p; ?
      {
: `4 T- ~) o% ^: K% |        "position": 0,* b; I0 P3 X2 ~, ]* z; a
        "witness_components": [
5 s6 P" E5 T0 F( A- |( I          {+ x# q: i. ~( M' ?7 a+ l, }
            "keys": [
7 s) r0 [. U& l' Y9 u- W1 H              {
  b5 o( Y, ]2 O( O                "derivation_path": [% `( n5 j/ }! [0 c. d0 \
                  "010100000000000000",# n3 g5 J* r' u
                  "0100000000000000"
/ H; E* }: Z+ ?                ],
, Y" W9 i9 _1 I                "xpub": "de0db655c091b2838ccb6cddb675779b0a9a4204b122e61699b339867dd10eb0dbdc926882ff6dd75c099c181c60d63eab0033a4b0a4d0a8c78079e39d7ad1d8"
& ?$ \* I: V& u              }
1 W; X0 P" x, M+ T            ],0 c/ j  e: {; r2 {% \. m! y5 ]
            "quorum": 1,6 h( \" ]1 U% z" R0 w: T3 B, m2 I' H7 _
            "signatures": null,
% q% L8 F2 d) m  _9 u            "type": "raw_tx_signature"/ C& h* ?% ]3 v
          },' H) w7 d/ N9 z& b% E! A* A' ^0 M1 r
          {# y2 O# Q+ F( y$ @* d
            "type": "data",
$ \/ w5 n7 P3 O& W' {* J. I            "value": "d174db6506e35f2decb5be148c2984bfd0f6c67f043365bf642d1af387c04fd5"" X, Q. Q& [+ t% d- C
          }9 b- l9 v2 c3 k) i& q
        ]& x8 _5 I" p! _9 N! @5 |# V* ?
      },* Z( s! s% C/ k7 }: q% _5 m
      {
) a& g  B  R, D3 T: A0 f        "position": 1,
4 _& w+ o9 y2 a% X: G        "witness_components": [
4 |( U5 r' T+ n: ^/ |- }; l          {
% L3 _$ }1 ^  y1 N0 s            "keys": [
+ w* y) \. R) o+ W$ w: L              {
: N0 C# \% d& P( q                "derivation_path": [9 j/ E5 o1 t4 Y
                  "010100000000000000",# I' O! G: f: Y+ r  `9 ~2 M6 e
                  "0800000000000000"( j8 H/ {) Z9 n# p' a  j% Z" p
                ],
% Z/ E5 R5 Z% I6 m' A+ C                "xpub": "de0db655c091b2838ccb6cddb675779b0a9a4204b122e61699b339867dd10eb0dbdc926882ff6dd75c099c181c60d63eab0033a4b0a4d0a8c78079e39d7ad1d8"
. O# F8 v; R  V4 P              }
/ T7 P& l) T; Q$ n- }            ],
" X, a, m9 b6 x+ K: {5 R            "quorum": 1,
2 O  t* a9 m2 }5 c2 [2 `% J            "signatures": null,. `/ Y- {) [' H; _5 N$ w' S. G* D! L
            "type": "raw_tx_signature"
6 K7 i" t* r$ C- E: X          },! M# E+ z" S* P, M5 K* C4 }$ f
          {
& D  q2 A- B7 a' B% l            "type": "data",
4 z7 C# R! Q& T            "value": "05cdbcc705f07ad87521835bbba226ad7b430cc24e5e3f008edbe61540535419". R$ }6 F- X8 J: R
          }
* R* {7 n" |1 f        ]
- z7 n4 z! V1 I/ j' k. T8 R      }' x6 k7 k5 k$ H- K* \
    ]% W9 R. Z8 @& L0 h' P  Q  B
  }
, d" I; f, M8 j; J0 X( x+ T! n. ?}
+ B% N2 ?/ _  M5 v8 o对应响应对象的源代码如下:
0 O2 m( ^" p! ~6 Gtype request struct{
0 `* n$ \) f4 Y" L+ r        TxTemplate txbuilder.Template `json:"transaction_template"`
0 c+ b+ W2 {" N0 y$ m# Q}; n  n0 D1 j2 g8 n
// Template represents a partially- or fully-signed transaction.
. T$ G# c$ R, {) xtype Template struct {* c7 R$ [  b/ v& W
        Transaction         *types.Tx             `json:"raw_transaction"`
0 e! e+ Y8 x' `8 S        SigningInstructions []*SigningInstruction `json:"signing_instructions"`
8 f+ x/ o4 x4 D- g/ }        // AllowAdditional affects whether Sign commits to the tx sighash or
! {8 o: x' f6 j. K3 Q        // to individual details of the tx so far. When true, signatures
1 Y* T+ M- r# e+ E' T8 g. E, {        // commit to tx details, and new details may be added but existing3 C$ q+ g$ `7 t4 B9 C: d8 r5 D% G( A! p" F
        // ones cannot be changed. When false, signatures commit to the tx+ P$ B$ {/ `  k/ {/ ]
        // as a whole, and any change to the tx invalidates the signature.( J0 f! ]6 ?1 w2 o
        AllowAdditional bool `json:"allow_additional_actions"`
# L+ q) t/ C; g. U- A8 e}
  K6 g5 {9 t" U5 \5 d其中TxTemplate相关字段的说明见build-transaction的结果描述
: y, m0 R9 w9 y5 P! _# o! I& v调用estimate-transaction-gas接口成功之后返回的json结果如下:
9 W. m5 A7 q7 N4 M) W" o  t/ R{  i5 S. |4 j) Q0 ~
  "total_neu": 5000000,) a9 C. G# P8 C& O  b4 f* J
  "storage_neu": 3840000,5 U0 L9 s% ~  s7 Z0 ]( X
  "vm_neu": 1419000# n4 I  q1 i  v: E' a) r/ P  f
}8 L) [' A6 }9 a; a6 p0 f, S
对应响应对象的源代码如下:
! ]5 F; \0 {7 j& w// EstimateTxGasResp estimate transaction consumed gas) v$ i/ @9 c4 h8 K% k
type EstimateTxGasResp struct {0 F4 M& d8 Q+ E" i
        TotalNeu   int64 `json:"total_neu"`( Q. V) t: f' V( d6 U2 ?
        StorageNeu int64 `json:"storage_neu"`. g& A3 j' \- x+ W! w
        VMNeu      int64 `json:"vm_neu"`
7 o7 U/ v& m- x+ U- J5 Z}
# F( @, |" @# ?6 W* O4 `7 Q结构字段说明如下:
! s1 {- n, C  D: l6 P: jTotalNeu 预估的总手续费(单位为neu),该值直接加到build-transaction的BTM资产输入action中即可
( l; Q+ Y% m0 a8 S& WStorageNeu 存储交易的手续费- f* H: I+ c. `. j* J
VMNeu 运行虚拟机的手续费2 F+ K4 G# |6 R* ^; W

) S1 ?2 B+ k* m: K! \2、签名交易
2 ^* e6 P: q9 L# A$ v9 d& }4 NAPI接口 sign-transaction,代码api/hsm.go#L53
* F  [! u+ A0 ^, f+ }( ^% p签名交易的输入请求json格式如下:4 m# G) a/ \6 K6 K
{7 c3 C% w, [, x* \3 R* M3 ?
  "password": "123456",1 J& d5 ?2 v, n. T0 V8 |( F$ i  [
  "transaction": {5 s6 y3 \1 }( i
    "allow_additional_actions": false,3 Y8 x% W( r5 L, w7 p
    "raw_transaction": "070100020161015f1190c60818b4aff485c865113c802942f29ce09088cae1b117fc4c8db2292212ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8099c4d599010001160014a86c83ee12e6d790fb388345cc2e2b87056a077301000161015fb018097c4040c8dd86d95611a13c24f90d4c9d9d06b25f5c9ed0556ac8abd73442275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f80a094a58d1d0101160014068840e56af74038571f223b1c99f1b60caaf456010003013effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80bfffcb9901011600140b946646626c55a52a325c8bb48de792284d9b7200013e42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f9d9f94a58d1d01160014c8b4391bab4923a83b955170d24ee4ca5b6ec3fb00013942275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f6301160014366b275ed9b2266b645cf1b8be51009cc3b260e100",0 m! I, t4 o" Y6 Y$ C8 z$ t
    "signing_instructions": [
. B& w+ V8 y: |) r1 O* ~8 W      {
  J7 q* V! X; v) `6 }& e# t: @        "position": 0,. `6 G1 {9 p( F
        "witness_components": [
+ }& `$ l" p% e1 Q# X% {& h          {
; b- J+ o$ [& s5 H4 T6 `& j            "keys": [6 q7 B( j, O* K) {
              {
) |  J. _/ S) l7 l( T; H2 ^4 p! h                "derivation_path": [( L9 F$ o. r& ?- R6 D+ t6 X3 d
                  "010100000000000000",% a3 d, N8 F# i$ |6 k
                  "0100000000000000"
, _" J8 T- o1 O+ C  O% H+ A( `; t                ],
  I1 c! [' F/ s+ R) d                "xpub": "de0db655c091b2838ccb6cddb675779b0a9a4204b122e61699b339867dd10eb0dbdc926882ff6dd75c099c181c60d63eab0033a4b0a4d0a8c78079e39d7ad1d8": C: j6 |( E" Z: x6 C
              }
5 D7 `3 I9 k/ V' e            ],
2 O3 `) |- |' p' {            "quorum": 1,7 h" H8 C( V' _) [& K
            "signatures": null,# K* S4 Q. U1 L
            "type": "raw_tx_signature"
4 @; Z' P' X1 M4 y( j; X) ?          },4 \! |5 r/ h  v  d
          {
2 t! c7 L: `! p. K+ l0 k            "type": "data"," U8 g4 d  X# K" \7 c1 d% x& n* p
            "value": "d174db6506e35f2decb5be148c2984bfd0f6c67f043365bf642d1af387c04fd5"1 w* s& L/ a) `! a8 a9 I
          }
/ b( A  b, k* W! k5 M        ]
0 a  p3 P, d+ {& A      },' k- A. ~6 J: Z9 K3 ^2 w# ^* y
      {1 ~6 G( f9 c6 x( k0 z
        "position": 1,
) V$ [# z  h2 m; D        "witness_components": [* c. K6 B' F( y1 m: _
          {
. @% `4 T  X7 ?0 K3 K6 f/ _* Z            "keys": [9 j1 h; [  ?) {, e) k5 g  Y
              {
- I0 p7 r+ @7 D( X                "derivation_path": [
5 l& k( Y& C1 G8 \/ R  }6 y4 T                  "010100000000000000"," {1 v4 q. f. ^5 r
                  "0800000000000000"
8 a, Y* `5 w/ _$ G& n) y7 I                ],
+ ^; n. |4 r3 r3 O7 G5 U0 e                "xpub": "de0db655c091b2838ccb6cddb675779b0a9a4204b122e61699b339867dd10eb0dbdc926882ff6dd75c099c181c60d63eab0033a4b0a4d0a8c78079e39d7ad1d8"
! ?  P0 J+ n7 {" q/ |; U              }) |3 s  Z0 t8 c4 N: m7 U& ?4 B
            ],
8 U4 Y6 A7 w' I1 k: D' V9 N1 f+ v" h            "quorum": 1,
0 Z0 l, G4 h: U. A            "signatures": null,
! N' {6 D+ Q8 f3 D, j            "type": "raw_tx_signature"* b/ `# R1 w$ G( D3 b' s  u
          },
9 _3 b2 a) @# h. G          {
9 J8 ~* l0 ?9 b            "type": "data",
0 g6 b8 B: y) _            "value": "05cdbcc705f07ad87521835bbba226ad7b430cc24e5e3f008edbe61540535419"
  V& H$ S( n( v          }% J# B# s& N6 F. q. q
        ]5 q8 S, R; ^0 \; ]/ y
      }" V( [5 B( j+ z7 {
    ]8 h: u+ E8 J9 m0 B" B+ N) K
  }
6 H: s: @) A( s}6 S, ^$ d! H+ c2 X7 n( K, @
对应请求对象的源代码如下:
0 h; z, M  d- Y  m0 h  r. Wtype SignRequest struct {    //function pseudohsmSignTemplates request# X% R+ [" Q  V% b2 l) F! I6 N2 k
        Password string             `json:"password"`
4 p* w* k: |: Q' j) @8 c        Txs      txbuilder.Template `json:"transaction"`
" I9 H7 s! t1 l5 j}  C" w% o% W3 ^% Q. ]
结构字段说明如下:  ?4 Z: ~0 S  v4 w+ R
Password 签名的密码,根据密码可以从节点服务器上解析出用户的私钥,然后用私钥对交易进行签名
8 [) ]* n& f2 ~7 W- hTxs 交易模板,build-transaction的返回结果,结构类型为 txbuilder.Template,相关字段的说明见build-transaction的结果描述8 B& {* c# s% p' ]' {' b2 T* m) v

, k& p( V% R* V签名交易sign-transaction请求成功之后返回的json结果如下:+ B6 {! \1 t3 F
{8 Y, Q; t, y5 f8 J) H
  "sign_complete": true,
6 L' m( b7 b: a' c- R8 n  "transaction": {
, W1 r% S9 C1 J1 f    "allow_additional_actions": false,% z) p! C8 r" L: t' i; {
    "raw_transaction": "070100020161015f1190c60818b4aff485c865113c802942f29ce09088cae1b117fc4c8db2292212ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8099c4d599010001160014a86c83ee12e6d790fb388345cc2e2b87056a0773630240273d5fc4fb06909fbc2968ea91c411fd20f690c88e74284ce2732052400129948538562fe432afd6cf17e590e8645b80edf80b9d9581d0a980d5f9f859e3880620d174db6506e35f2decb5be148c2984bfd0f6c67f043365bf642d1af387c04fd50161015fb018097c4040c8dd86d95611a13c24f90d4c9d9d06b25f5c9ed0556ac8abd73442275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f80a094a58d1d0101160014068840e56af74038571f223b1c99f1b60caaf4566302400cf0beefceaf9fbf1efadedeff7aee5b38ee7a25a20d78b630b01613bc2f8c9230555a6e09aaa11a82ba68c0fc9e98a47c852dfe3de851d93f9b2b7ce256f90d2005cdbcc705f07ad87521835bbba226ad7b430cc24e5e3f008edbe6154053541903013effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80bfffcb9901011600140b946646626c55a52a325c8bb48de792284d9b7200013e42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f9d9f94a58d1d01160014c8b4391bab4923a83b955170d24ee4ca5b6ec3fb00013942275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f6301160014366b275ed9b2266b645cf1b8be51009cc3b260e100",
$ h6 b9 {/ g8 B1 J% }1 g    "signing_instructions": [
4 e6 \8 ^$ R; z0 W+ x7 K0 K! ~5 k      {
6 M$ P& G% ]4 S1 m" ?        "position": 0,
( v& ^, x+ P; Z, E0 Z6 ?        "witness_components": [5 k6 d" O; E3 `2 p3 N
          {, R' t5 s, G/ o- R/ V& O  Z- \
            "keys": [9 {; [; ?0 t' H, c
              {2 o8 A$ ]) e' G; r4 Z9 V
                "derivation_path": [
" p0 |- E4 v7 F, ?& M7 B6 Y                  "010100000000000000",# ?$ A, i: ?; Y0 X& W8 Z
                  "0100000000000000"
* o' k5 u3 U6 d                ],' \+ L+ M% M4 G, O/ ~- G  G
                "xpub": "de0db655c091b2838ccb6cddb675779b0a9a4204b122e61699b339867dd10eb0dbdc926882ff6dd75c099c181c60d63eab0033a4b0a4d0a8c78079e39d7ad1d8"
, |2 n" g! a) t/ y8 }              }
% I3 M. ~, X  e! E; y; W            ],+ T) n& I9 D" j
            "quorum": 1,
& F* Z  x: p/ e8 c8 P" H            "signatures": [
$ `' H+ O: \* g; f3 u$ c4 \( b              "273d5fc4fb06909fbc2968ea91c411fd20f690c88e74284ce2732052400129948538562fe432afd6cf17e590e8645b80edf80b9d9581d0a980d5f9f859e38806"
8 S0 T) I7 Q1 T% C4 c5 b            ],
3 D4 V" A3 ~: J1 K            "type": "raw_tx_signature"5 f/ @' f; I7 r8 @2 {; Z
          },
0 ~) V% x9 I7 ~3 z3 d1 o; w' c          {
9 s( N, O' s* y            "type": "data",! k6 V/ I% A& P" h( x( t
            "value": "d174db6506e35f2decb5be148c2984bfd0f6c67f043365bf642d1af387c04fd5"
" a' b( C, X/ B5 f% I( B* n          }
- h7 e8 J# o9 Y( s# L$ j        ]3 u- y, t3 J2 `" A& @: v) T
      },4 w& Q& I- b, t. v2 l. w9 a2 o6 ^
      {* J( r6 O! L, h6 ^( K/ c: j
        "position": 1,
1 z2 K( U: @! e/ r        "witness_components": [2 Y2 y) l$ t3 s6 h8 B% q" L" s6 e  p) o) _
          {
, E" N1 ?9 S4 ]* K/ n- r8 D  |            "keys": [
. L2 |" m! K* ]' i0 z1 a  s' l: l              {8 p9 B" @! X9 B6 F6 M" m/ y
                "derivation_path": [7 F( Q" o' ^6 [" v0 ^5 \
                  "010100000000000000",, F: h' F" X1 i1 O
                  "0800000000000000"$ c4 d' P4 K) ~+ z' v& D- O
                ],  B2 d2 ~8 ]$ K" {" a
                "xpub": "de0db655c091b2838ccb6cddb675779b0a9a4204b122e61699b339867dd10eb0dbdc926882ff6dd75c099c181c60d63eab0033a4b0a4d0a8c78079e39d7ad1d8"3 S# |3 e) [+ E4 P
              }
; F2 x' X0 X5 [6 K: `            ],. R2 g  o3 M( l( [
            "quorum": 1,
+ ?) S( O* }: V8 M+ b            "signatures": [
8 N; p) Q9 b, Y- X/ @3 {* a1 P9 f              "0cf0beefceaf9fbf1efadedeff7aee5b38ee7a25a20d78b630b01613bc2f8c9230555a6e09aaa11a82ba68c0fc9e98a47c852dfe3de851d93f9b2b7ce256f90d"
3 |/ c6 a; m( H6 J& W) [            ],# X6 _7 N- X7 N" _, @* k7 Z
            "type": "raw_tx_signature"
, r2 g% ?( S$ O          },6 S; B( [: i3 z/ y
          {9 q0 j% |) |* a" T& u7 z0 c
            "type": "data",, H; X- t# j+ V; j+ e
            "value": "05cdbcc705f07ad87521835bbba226ad7b430cc24e5e3f008edbe61540535419"
7 {( C  h& u7 A! \! U8 ]          }
' ?6 v; K9 B! f% V8 q2 C, b) D( w        ]+ M4 W  r$ S: {1 |7 N* y6 ]
      }
) l0 c. H, s  ^3 K0 d    ]
% _6 c; g" Q$ o  }, ]3 G' ~  }
- m1 k/ C1 ?( m, C}
8 _" m0 E& T0 l/ Z8 w对应响应对象的源代码如下:: J: q" B2 T- y- e8 @
type signResp struct {1 K3 N) q5 ^& m1 {4 P/ s( a
        Tx           *txbuilder.Template `json:"transaction"`
1 ~  `9 M# h; \1 Y        SignComplete bool                `json:"sign_complete"`9 _+ k9 v1 O$ {! F- l! p
}4 W$ p' m9 W) A2 S
结构字段说明如下:
$ E0 I+ l1 s! T" j% C2 WTx 签名之后的交易模板txbuilder.Template,如果签名成功则signatures会由null变成签名的值,而raw_transaction的长度会变长,是因为bc.Tx部分添加了验证签名的参数信息2 ?* J* E% ^- c7 t+ g1 H% j
SignComplete 签名是否完成标志,如果为true表示签名完成,否则为false表示签名未完成,单签的话一般可能为签名密码错误; 而多签的话一般为还需要其他签名。签名失败只需将签名的交易数据用正确的密码重新签名即可,无需再次build-transaction构建交易
* o3 R* v4 \' ^/ E  b/ a7 c0 \
' B  U& _: v+ s  B3、提交交易+ ]- w: E8 _, [# Y/ u6 D0 |
API接口 submit-transaction,代码api/transact.go#L135
3 |  H6 r% h2 Y! m- q8 g/ I提交交易的输入请求json格式如下:
) \" [$ Y+ C9 i7 b5 V- e/ @{
2 G/ o7 b4 k* o2 [# D, m& \  "raw_transaction": "070100020161015f1190c60818b4aff485c865113c802942f29ce09088cae1b117fc4c8db2292212ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8099c4d599010001160014a86c83ee12e6d790fb388345cc2e2b87056a0773630240273d5fc4fb06909fbc2968ea91c411fd20f690c88e74284ce2732052400129948538562fe432afd6cf17e590e8645b80edf80b9d9581d0a980d5f9f859e3880620d174db6506e35f2decb5be148c2984bfd0f6c67f043365bf642d1af387c04fd50161015fb018097c4040c8dd86d95611a13c24f90d4c9d9d06b25f5c9ed0556ac8abd73442275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f80a094a58d1d0101160014068840e56af74038571f223b1c99f1b60caaf4566302400cf0beefceaf9fbf1efadedeff7aee5b38ee7a25a20d78b630b01613bc2f8c9230555a6e09aaa11a82ba68c0fc9e98a47c852dfe3de851d93f9b2b7ce256f90d2005cdbcc705f07ad87521835bbba226ad7b430cc24e5e3f008edbe6154053541903013effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80bfffcb9901011600140b946646626c55a52a325c8bb48de792284d9b7200013e42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f9d9f94a58d1d01160014c8b4391bab4923a83b955170d24ee4ca5b6ec3fb00013942275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f6301160014366b275ed9b2266b645cf1b8be51009cc3b260e100"
4 l1 i6 f" s0 c; L" g+ d! x- c}
1 @: v  O( p; _( T% [( \* J( e; G对应源代码的请求对象如下:
( \# e/ S3 ~+ M# i4 T, u" Otype SubmitRequest struct {    //function submit request: t* ]0 e7 U/ {5 S4 P/ y
        Tx types.Tx `json:"raw_transaction"`
2 n/ ~0 }! N  h- _. r! ?) P6 l( i" Q}
8 _# D" i* }5 o0 [结构字段说明如下:
2 ?% o  \+ |% ]& P7 i9 ~Tx 签名完成之后的交易信息。这里需要注意该字段中的raw_transaction不是签名交易sign-transaction的全部返回结果,而是签名交易返回结果中transaction中的raw_transaction字段。' R: o* e; V( H3 r; @, d( N! k
; @( @: W1 O/ Y9 I. p8 N9 {
submit-transaction请求成功之后返回的json结果如下:5 n; B, ?" {4 [$ P& g& w# K
{0 R0 T8 D, j# [  @. G
  "tx_id": "2c0624a7d251c29d4d1ad14297c69919214e78d995affd57e73fbf84ece361cd"
! a9 y) [7 T$ E- N}% K0 l4 E& e0 ?" T% r# U9 k
对应源代码的响应对象如下:
, I$ N6 i* |* u  p$ Ztype submitTxResp struct {7 a1 p/ ?8 g# B& t4 G; w
        TxID *bc.Hash `json:"tx_id"`9 w, I! Y$ {4 K
}8 |$ _" ^. ~, D1 p! |, S: ?
结构字段说明如下:8 S4 y: T' b, j$ c( N  ?# t
TxID 交易ID,当交易被提交到交易池之后会显示该信息,否则表示交易失败
3 {' g! h1 I. O
6 O9 s6 M4 p0 u' T. t" a0 n
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

V刘晨曦 初中生
  • 粉丝

    0

  • 关注

    3

  • 主题

    14