EOS纯技术上手学习
罗宾虚汉
发表于 2022-11-4 20:37:25
120
0
0
主要内容:
5 u: @+ z( h- G9 \
EOS Docker快速部署
EOSC使用9 D; h7 h+ G4 O) G7 ]. E; j
创建钱包9 k* q3 U& J3 e) z' l w+ ?
) L' e$ l* g* M6 V. G# s. F! e+ d
将私钥导入钱包
! ?4 y& U" ^' F# |
锁定和解锁钱包
# h9 w( G' w, T) Q4 q
创建账户2 I" j; A8 M2 a7 v- ^- ] b
" H- ]- [# A7 D
内置转账
查询交易历史
7 t4 r5 f6 Q4 q( J% H- D! W3 K
测试合约 - currency
调用合约
查询合约8 q9 m# |6 [* e# a6 M' j
链接特定的节点
" w/ c6 _+ J; s
链接独立钱包服务# {/ o: ^7 u4 e- Q. R
6 ^: C/ |& O+ n5 i3 g- ~
免签名验证
/ I7 @. J# _- t" ^
其他RPC调用
; d' @8 w9 F) M9 _6 |* j5 `
EOS Docker快速部署* u# O" V. S: D J C/ ?
构建eos镜像
git clone https://github.com/EOSIO/eos.git --recursive# c1 R3 O! @3 i9 s, P3 k
cd eos# y* M/ t$ O/ M' \- m U5 v
cp genesis.json Docker ( G- m6 w5 K1 p; S/ q% f1 J9 Q O
docker build -t eosio/eos -f Docker/Dockerfile .
启动容器9 S4 K1 J% P; G5 \4 c3 U! Y0 F. D
sudo rm -rf /data/store/eos # options
sudo mkdir -p /data/store/eos. M9 ^: B- } W6 n6 x
docker-compose -f Docker/docker-compose.yml up
如果 docker-compose 启动有报错, 可能需要给文件存储目录赋予用户读写权限
sudo chown -R SYSTEM_USER /data/store/eos+ m$ O+ b# T# L9 T6 f$ p( N
验证,查询区块链状态信息: `, \) E0 h3 a/ q' J0 E
curl http://127.0.0.1:8888/v1/chain/get_info
如果想使用多节点环境,可使用yml文件启动
version: "2"
services:
node1:+ ^+ T2 @; {, B5 A2 h$ E' p }
image: eosio/eos
ports:" w' l" V* w: _) D8 y
- "8888:8888"" }4 D" [9 k! Z! S' O2 o
- "9876:9876"
volumes:7 W) F2 b: c! @) ?5 U, h
- ./node1/data:/opt/eos/bin/data-dir: |" a9 E; G: b8 L- F- K* z
node2:
image: eosio/eos
ports:
- "8889:8889"$ l9 R" |# k. c3 _
- "9877:9877"' [: T; G$ r+ a4 R* a. N# U- p) l
volumes:- n! ?" s h3 W) u
- ./node2/data:/opt/eos/bin/data-dir1 r& G" V# q& z2 c4 \
depends_on:
- "node1"5 |$ t& l( x/ k2 `" h- T
EOSC使用
EOSC是EOS的核心进程EOSD对外暴露的RESTAPI命令行工具。EOSC的使用会利用到一些内置插件,插件在EOSD的配置文件config.ini中进行设置,如与链的交互需要使用’plugin = eos::chain_api_plugin’。为了签署交易并发送到区块链上,需要使用‘plugin = eos::wallet_api_plugin’。为了查询交易和历史记录,需要使用’eos::account_history_api_plugin’ 。
# Plugin(s) to enable, may be specified multiple times4 r% c# `* P' |9 ^/ S
plugin = o; F+ ]7 W" z) D
eos::producer_plugin' _- g1 T' D5 U/ j, _3 S
plugin =
eos::chain_api_plugin# T: X7 f% h: ^: S5 H8 D0 Y
plugin =3 w d/ N5 ~4 [" g
eos::wallet_api_plugin( C* x, r, B) ~5 W: K* l1 W
plugin =: z9 c( O N9 G& J/ o
eos::account_history_api_plugin
启动eosd后,可以使用EOSC查询当前的区块链状态
docker exec docker_node1_1 eosc get info
{: ?* j$ y& v+ L; ^6 Y& ^1 x1 ]$ P' c
"head_block_num": 23449,; n& B5 C% A, [& m
"last_irreversible_block_num": 23432,' y/ p+ c2 d9 _
"head_block_id": "00005b996cc85962b28537c3d72696a012d1071638f5e4bad1809cf9afc9abb6",
"head_block_time": "2017-09-29T01:53:33",
"head_block_producer": "initi"," Y7 g d* j U* D" E
"recent_slots": "1111111111111111111111111111111111111111111111111111111111111111",
"participation_rate": "1.00000000000000000"
}% A9 P+ J+ Y! V' d0 [, u; ?. e6 |, R
创建钱包
任何发送到区块链的交易都需要由所有者持有的私钥进行签名。首先,我们需要一个钱包来储存和管理私钥,使用EOSC命令创建一个钱包。
docker exec docker_node1_1 eosc wallet create* ?7 L6 \8 `5 V+ L! r8 g$ Z6 g
Creating wallet: default& R9 a/ V/ t7 _$ W/ U; u$ W
Save password to use in the future to unlock this wallet.' p7 i o2 M) H- A/ k2 B. L
Without password imported keys will not be retrievable.
"PW5JXSxkHqNEwRKCpG2JUTLqkR8SNCBXofkAwaFDLwQkNdqaSXwC8"
命令执行完成,会在eos-walletd中创建一个名为‘default’的钱包,并返回钱包密码。8 h) [% o1 ? F. B! ^1 H+ G
这时候可以查看钱包列表
docker exec docker_node1_1 eosc wallet list& p) O# u7 I9 Q1 J' s6 d
Wallets: + ?& `6 {$ U4 f
[9 c4 W* k. d" ], B! o
"default *"
]3 Q1 Q; V1 C4 y) C
如果你没有指定钱包名称,默认都操作的是‘default’钱包! g" u4 y) V9 U0 j* r
将私钥导入钱包% b' Y, N, h4 u d7 c) @# Y
如果你想授权某个钱包可以由某人来管理和控制,需要导入该授权者的私钥。: ^0 X6 ~) } h: n5 W$ V9 R
docker exec docker_node1_1 eosc wallet import 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
imported private key for:0 T# m& x0 ^4 Y: c& q; E9 w
EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV+ |7 B F. Y. P. u3 V: U
导入后,可以查询钱包已经导入的私钥和对应的公钥
docker exec docker_node1_1 eosc wallet keys% A3 ^) @* S' H* \! Z" {* l# U
[[
"EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV",
"5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3"
]
]
锁定和解锁钱包+ @8 i& G. G+ ` A4 I3 ~1 g- |& [; y
日常使用,为了保证私钥安全,可临时锁定钱包,锁定后查看钱包列表是不可见的 W) V$ I1 f& c
docker exec docker_node1_1 eosc wallet lock, v2 d, S3 X, G q* }
Locked: 'default'7 f9 u# r6 g e1 p7 M* ?* p) z( g
当想要使用时,可以用创建钱包时生成的密码来解锁钱包/ _3 i5 O9 B1 o, V5 R8 `
docker exec docker_node1_1 eosc wallet unlock --password PW5KVWrn81Y8PLAb52gr2FyXCanVavcrj9d5TC9C3yKhqq1PJYRPk5 J @8 z E) y& O" ?# H7 ]
Unlocked: 'default'
解锁后,可以在列表重新看到default钱包了
docker exec docker_node1_1 eosc wallet list q2 [! c B/ w8 P( k1 `9 w! L
Wallets: ' {+ _' D- B8 E0 I7 q
[
"default *"
]$ @, _- r7 N4 t' E7 x
创建账户
创建账户需要有两组密钥:owner和active。EOS使用EOSC工具来创建密钥对
1)owner key.! w* S7 D* l( K" n' G9 i3 `( Z
Private key:5JRc8XxvodWey4StZ2zzkUhCQhDaHvGMkABtfHzQR2ie4qaUFJ7
Public key: EOS5mFEdAzxvMkHLQXt2v4naUjnBrPGmzMUCikymqhSR6m7QLGSTB
2)active key6 Q9 r2 U. d7 N9 g/ A. x
Private key:5KNzFCbToz2a9Hztz9Qen5cyJcM3x5Wpq4GFiTYZgGhzntXdmYo" H* U3 w8 S* e$ ?( \. I$ A
Public key: EOS5EdsvESpibWLJxupTqod1nswJnbiXQZuUcLiAWEEsqcZskymeB3 i0 B. Z9 q( U3 R% {
EOSC不会保存生成的私钥
因为后续测试智能合约需要,我们创建一个名为currency的账号。目前这个版本,所有的账户都需要用已有账户来创建,所以我们用inita账户的owener key和active key来创建currency。 为了使inita获得发送交易的权限,需要先导入inita的私钥到钱包。(参见私钥导入钱包的步骤)8 l! k# ?2 `4 }2 f
docker exec docker_node1_1 eosc create account inita currency EOS6NpEqWi177VKQkuJQL9V6Y3LqAAp9C2j( l& \5 ^2 p# U+ w( o( f
执行成功,会输出一串json的交易信息,打印账户创建相关内容
我们可以查询inita可以创建了哪些用户
docker exec docker_node1_1 eosc get servants inita
{1 ]1 R# m3 y7 f. z. G8 Q
"controlled_accounts": [
"currency"7 M' K3 E7 a& K6 B- H* O
]- G( _, ]3 E, z$ d# H
}+ c: d P3 Q" s" p4 }
内置转账
创建账户之后,可以查看当前账户的状态,可以看到创建的测试账号没有余额,这样不少功能无法测试,我们需要试着给创建账户添加一些余额
docker exec docker_node1_1 eosc get account currency
{8 z) V$ X) w r; o6 p8 N: J( C
"name": "currency",
"eos_balance": "0.0000 EOS",
"staked_balance": "0.0001 EOS",
"unstaking_balance": "0.0000 EOS",% D" y" Z* b; x, l. u$ I
"last_unstaking_time": "1969-12-31T23:59:59",
"permissions": [{: W3 T. q% U" R- t
"name": "active",. Z/ }; T% ` X% i$ E/ Y: i5 c# _
"parent": "owner",
"required_auth": {2 S% b7 f' n2 J! ]6 p
"threshold": 1,
"keys": [{0 |+ I1 L7 F& ?( U+ m, q) X
"key": "EOS8ff42NMpJUybVj3nwUSnPpc3mMysKxyE4HVJy1E5o3fQv7knWf",
"weight": 1
}' c8 o8 B$ a6 C, `! F: C; m) a
],2 G& y; B G; w2 v2 c% n
"accounts": []
}1 `% @0 q; X; q, s2 f! l3 v! \
},{
"name": "owner",( }: ]6 o/ ?6 O8 o
"parent": "owner",* v+ x" u- J) L2 h' D; ?* z! b
"required_auth": {$ K4 n' r# m6 L
"threshold": 1,
"keys": [{
"key": "EOS5fQ4saiHV426EQ7AKrGoD2AVMBYe77bnGSq42JjXBUfipv7o3E",
"weight": 1
}
],: O N+ F0 B. c0 [: A
"accounts": []
}. ]: w2 n4 W$ H: D+ r8 O! q, y
}
]
}3 c8 u, M7 f# N T3 _& ?. S
保存全网余额的创世账号是eos,查询余额状态
docker exec docker_node1_1 eosc get account eos" k# ]- q( f ~, d! B; n
{" w9 d, X+ d$ t( r& J" e( h
"name": "eos",) p# f8 j# W f; I, h* ^! i
"eos_balance": "69000000.0000 EOS",8 w% g8 B$ f6 p+ B7 B* R- G
"staked_balance": "0.0000 EOS",
"unstaking_balance": "0.0000 EOS",4 F1 O/ \8 h8 _6 o8 W, S# h! S
"last_unstaking_time": "1969-12-31T23:59:59",
"permissions": [{9 b' y0 K5 m0 e: c# ?8 j
"name": "active",
"parent": "owner",/ w, [* `0 J! r8 C1 ]+ `
"required_auth": {
"threshold": 1,
"keys": [],
"accounts": [] | a+ W6 A* V" y4 D6 F
}
},{
"name": "owner",
"parent": "owner",8 N. P3 b% a0 A
"required_auth": {, _, l- v8 `* ~7 Q }) F. J& _( @: s9 g
"threshold": 1,+ p4 M) r- M! l# ~ Q9 E& O
"keys": [],, G* V- U6 W A [
"accounts": []
}
}/ _& Y# L( ? j& g# V
]- T7 y d t2 J# p, h$ x$ w
}, O" f7 l ~) X! C2 U( g
我们可以通过创世块定义的创世账户使用EOSC给当前创建的账户转移余额; B* Y. t' g- b0 E# g
docker exec docker_node1_1 eosc transfer inita currency 100000000
{ S6 ]( z A* Y
"transaction_id": "59575b8caf08eac7c00eb7483c048f12d0e7abf1ede839c3b2ed41dc6c5c7c5f",
"processed": {
"refBlockNum": 24199,9 R: r- M( r1 c+ {* C! `* A
"refBlockPrefix": 1485651173,8 K- q% o3 B0 A/ G7 E# U2 N S
"expiration": "2017-09-29T02:31:03",. b+ ], I/ J2 h R& J' l. |
"scope": [# ]6 e- i% S* I, E2 z, u. F
"currency",
"inita"
],7 K6 f" v- @! c) U
"signatures": [. L; u' f, [2 {7 e' g0 j
"1f14229bdd4bfb927021bf96ff0651c8b0fa5666e9f5cf423a0270a1b91f2d2f690b573e179d8475ce2c6b160f5cd5507d58a44f8f6cf536348584efa8dd62ade0"7 b3 F% H+ v) @: m9 G+ Y2 ~
],% W q" S% V) }) @; \
"messages": [{/ X) c# R/ Q/ X" r' v! G2 B
"code": "eos",
"type": "transfer",
"authorization": [{3 t0 R; |% r( I6 D7 U6 _/ a! Z
"account": "inita",
"permission": "active"
}1 I) P; `+ v q6 l
],6 v7 v. ~* V3 u* y
"data": {, M+ _" m6 C! f5 [$ q
"from": "inita",
"to": "currency",( x/ m( D/ D! w" P! o
"amount": 100000000,2 k$ t. ~$ _* e2 @" T8 }- T
"memo": ""- P. f- l; K& b: V8 c8 L
},7 N) T# O/ p* R( i0 r5 ~* I( M n# }: ?
"hex_data": "000000000093dd740000001e4d75af4600e1f5050000000000"0 e4 \ I: @8 E* n& \
}
], h/ G7 U% D& {* P; s9 O
"output": [{
"notify": [{
"name": "currency",
"output": {% H+ D% L6 `2 w5 E# a
"notify": [],
"deferred_transactions": []
}
},{( i4 r/ V% {, C
"name": "inita",. h- g# V" ~; a5 G+ q/ p; m" W
"output": {' p) ^" p4 w V1 W F
"notify": [],
"deferred_transactions": []; W( j7 o7 \7 a+ x5 G
}: D) d; U4 f7 q7 |( ?
}) c5 f+ i( Z' V2 Y& R9 a. t
],
"deferred_transactions": []
}8 h" i" V) p8 _- [; O
]+ t/ I$ N. a: B9 k& g: c( z! d/ P
}
}
再通过执行get account 命令,验证余额已经成功转移到创建的账户下
查询交易历史$ P$ E% S/ N, |
查询交易历史会使用到插件account_history_api_plugin,我们已经在config.ini中定义
docker exec docker_node1_1 eosc get transaction + L J t q7 U/ z$ K$ z: y
如果需要查询一个特定账户最近一次的交易记录& C2 J3 _9 r$ A' o6 n& F
docker exec docker_node1_1 eosc get transaction inita4 l2 n9 b- y7 b0 ` g
创建智能合约
官方提供了一个示例合约currency,我们依然使用EOSC来创建并部署智能合约,合约代码位置contracts/currency。! \" q& O3 }2 T
1)为合约创建一个所有者账户。前文已经创建了currency账户8 A$ o3 Y4 }( z' V4 X0 g& [
2)检查区块链上有无同名合约
docker exec docker_node1_1 eosc get code currency
code hash: 0000000000000000000000000000000000000000000000000000000000000000
3)为了获得部署权限(发送交易请求)需要将currency的active key导入到钱包中7 p7 B0 @/ V$ p ]8 l
4)部署合约(.wast后缀文件)和他的abi(.abi后缀文件): c7 C# R' ?% P) S
docker exec docker_node1_1 eosc set contract currency ../../contracts/currency/currency.wast ../../contracts/currency/currency.abi" Y. W* K) s; A b9 \4 q* |5 o' a& w
Reading WAST...% l8 M* V `! V4 T2 Z
Assembling WASM...7 W# Y) f5 Y# T* x' d% I# R8 ?
Publishing contract...* W2 I- e' W7 n- T0 v9 p4 b7 A; t
屏幕打印部署成功相关的信息,并查询合约hash
docker exec docker_node1_1 eosc get code currency
code hash: c4023f74b3c7a3321d1641e4111b13584078fa7265c6ab12e1c19ff7ee800faf# k0 Q; s+ {" B9 `. T. T' w
调用合约
在合约部署到区块链上之后,所有的currency余额会分配给我们创建的currency账户。我们可以调用合约测试做一些转账交易。
为了更好了解区块链合约的调用方式,我们可以通过.abi查看可以执行的操作列表和消息结构。 `& K( d: s$ ^: {
docker exec docker_node1_1 eosc get code -a currency.abi currency1 J& \) L/ g/ ]# G
code hash: c4023f74b3c7a3321d1641e4111b13584078fa7265c6ab12e1c19ff7ee800faf2 o S5 ~! L+ w
saving abi to currency.abi8 D+ @) f. T5 K* }/ W
cat currency.abi #查看! M6 O. s+ T4 x' X$ z8 x/ A# k& z( X
{5 G. b$ B% C* g, c: x) v. }( g5 J
"types": [{
"newTypeName": "AccountName",
"type": "Name"! }: i+ V1 v2 x0 ?% v
}
],
"structs": [{6 ~, u$ X( m* f( R$ U3 l
"name": "transfer",
"base": "",
"fields": {/ k" `/ [# k3 E) K4 H
"from": "AccountName",8 ]6 ?8 ?2 z( A
"to": "AccountName",
"amount": "UInt64"
}
},{
"name": "account",
"base": "",
"fields": {. \# _+ ?+ \0 z2 f! R5 |( h
"account": "Name",7 _+ `0 u# {2 i. R E% k0 N
"balance": "UInt64"
}
}
],9 P Z8 I! c* r! f) N
"actions": [{
"action": "transfer",) Y ^6 Q9 }, q ~* \, j
"type": "transfer"9 J2 p6 y% C; v
}/ F% i* G# |% A
],
"tables": [{4 q6 V' [, F1 ]# A
"table": "account",
"type": "account",
"indextype": "i64",, k$ _ J: [( q2 N3 X
"keynames" : ["account"],) r. |0 T K6 d' E: i: ?! r
"keytypes" : ["Name"]
}
]0 z. h% G9 @. M
}
通过上面的abi我们可以看到currency合约可以执行transfer操作,消息格式为from,to和amount。我们调用合约从currency账户转移50个余额到inita账户
docker exec docker_node1_1 eosc push message currency transfer '{"from":"currency","to":"inita","amount":50}' --scop
执行完成,我们查询余额验证结果
docker exec docker_node1_1 eosc get table inita currency account
{
"rows": [{
"account": "account",; o! M. `, |' l+ Y2 o& }8 o8 Q
"balance": 50 9 i1 t* D3 { Z) h5 `( m
}% d8 u0 X! N# ^' C4 _
],
"more": false
}9 _8 o+ y9 g2 W8 d( t, o* i, m
docker exec docker_node1_1 eosc get table currency currency account6 r4 W* M6 P' R3 n8 x1 L; F, y
{
"rows": [{' y) z G" v6 K2 v. w
"account": "account",
"balance": 999999950
}
],/ i" s3 H. ~6 q$ [
"more": false8 C r8 v7 R4 n# ^ k# @4 D
}
余额不足的账户尝试转账,会提示失败
docker exec docker_node1_1 eosc push message currency transfer '{"from":"tester","to":"inita","amount":50}'-S inita -S tester -p tester@active/ Y4 ~ D/ R' s# X8 r& D( l( F7 J A
3543610ms thread-0 main.cpp:271 operator() ] Converting argument to binary...
3543615ms thread-0 main.cpp:311 main ] Failed with error: 10 assert_exception: Assert Exception; J" }* h5 e7 l7 E: H
status_code == 200: Error : 10 assert_exception: Assert Exception2 k- \& x5 A9 f! Q; a% I
test: assertion failed: integer underflow subtracting token balance
{"s":"integer underflow subtracting token balance","ptr":176} thread-1 wasm_interface.cpp:248 assertnonei32i32 [...snipped...]
查询合约
如上文验证步骤,在调用完合约后,可以通过查询表来验证每个帐户持有的余额。3 [: ]! D( ~5 o: s0 U6 Q$ r
docker exec docker_node1_1 eosc get table currency currency account
连接特定节点
默认情况下,EOSC连接本地端口8888的节点。可以通过指定主机地址和端口来连接其他EOSD节点。同样的,钱包服务也可以指定特定的主机地址和端口。
docker exec docker_node1_1 eosc --host --port - _5 C" w( R% v. N
链接独立钱包服务
除了使用EOSD内置的钱包服务,也可以独立部署钱包服务
docker exec docker_node1_1 eos-walletd --http-server-endpoint host:port
调用独立钱包服务需要添加如下选项, B- E# Q5 J4 u2 `) ^0 g4 Y
docker exec docker_node1_1 eosc --wallet-host --wallet-port" u( Y0 e/ X4 F% A
免签名验证2 k9 c7 m; E" Z: T
开发者如果需要快速测试功能,可以跳过节点签名的步骤,这样可以解耦密码学的问题而关注应用功能* c* z5 ?8 D3 I: }; V
启动时使用特定参数
eosd --skip-transaction-signatures
EOSC调用时添加-s 选项 m j/ [' w4 h+ ` I
docker exec docker_node1_1 eosc -s
其他RPC调用
EOSD RPC 包含通过HTTP RPC与eosd和注册其上的插件进行调用的方式.
1)区块链API 配置
想要查询eosd信息需要启用plugin = eos::chain_api_plugin插件并添加至config.ini中3 G$ a4 Z) t# N$ u
2)get_info接口用于查询区块链的基础信息( W: Z# w4 Q. j2 K9 r
curl http://127.0.0.1:8888/v1/chain/get_info
返回结果如下:
{"head_block_num":25028,"last_irreversible_block_num":25014,"head_block_id":"000061c443dd3e85932c442a8e5176b7ac822a0f6d09d034298f508e71c5ae6c","head_block_time":"2017-09-29T03:12:30","head_block_producer":"initm","recent_slots":"1111111111111111111111111111111111111111111111111111111111111111","participation_rate":"1.00000000000000000"}0 w" P: B1 q/ k- y( w8 C O D+ i
get_block接口用于查询区块相关信息
curl http://localhost:8888/v1/chain/get_block -X POST -d '{"block_num_or_id":5}'
curl http://localhost:8888/v1/chain/get_block -X POST -d '{"block_num_or_id":0000000445a9f27898383fd7de32835d5d6a978cc14ce40d9f327b5329de796b}' w6 w& U+ f+ l; A8 l
返回结果如下:
{"previous":"000000047aba47492d2143beebfdfba171192970a0f9248f0408a8614ff42dca","timestamp":"2017-09-28T06:21:21","transaction_merkle_root":"0000000000000000000000000000000000000000000000000000000000000000","producer":"initf","producer_changes":[],"producer_signature":"1f25a5b592b7f605ffdbd1cba90497e94b3e1c0e5805b70851de6875e0f33e20dd1f363cd1fcfd2dc8421fb918d694d260e255956cc7f8f554fa0be01d805a84ed","cycles":[],"id":"00000005bf39fd177fc2ea8ba6540d5f31e8b07218f054016123a34b16d0b30e","block_num":5,"refBlockPrefix":2347418239} e4 L* G1 y4 c1 d. U
4)push_transaction接口,调用合约交易7 V) ^! t! L1 P* E3 c1 }* Z, y
该调用为JSON格式并会将结果更新到区块链上
执行正确的结果返回: R4 M N5 x7 }6 O$ z5 w) v
返回 HTTP 200 和交易ID号" X7 s- C7 V, A \- o V
{ 2 V) q% O: k- |9 i9 K
'transaction_id' : "..."
}( ^2 \! M7 j: Q
执行错误的结果返回,一般为400错误(参数错误)或者500错误
HTTP/1.1 500 Internal Server Error
Content-Length: 1466
...error message..' |5 f4 _7 J) k9 H
push_transaction 调用方法
curl http://localhost:8888/v1/chain/push_transaction -X POST -d '{"refBlockNum":"5","refBlockPrefix":"27728114","expiration":"2017-07-18T22:28:49","scope":["initb","initc"],"messages":[{"code":"currency","type":"transfer","recipients":["initb","initc"],"authorization":[{"account":"initb","permission":"active"}],"data":"c9252a0000000000050f14dc29000000d00700000000000008454f530000000000"}],"signatures":[],"authorizations":[]}'
此示例模拟一个转账交易。 refBlockNum和refBlockPrefix使用的前例block查询的结果
成为第一个吐槽的人