EOS纯技术上手学习
罗宾虚汉
发表于 2022-11-4 20:37:25
113
0
0
主要内容:1 K1 [( H: L0 z
- R+ \ M$ q/ S. _0 F
EOS Docker快速部署" I/ S G6 N/ Q1 ^$ B5 z5 Q, O
; W$ Y+ ?/ h' Q. C/ S0 S* ]
EOSC使用) }# p I; ~, t& l) P" j+ E: R
' s( {9 K: N) x5 W" M$ E
创建钱包
将私钥导入钱包4 ~8 A c4 f: t: ^8 v8 m' D
锁定和解锁钱包* Q% y2 V$ s5 n0 b
4 a! y5 p% ^1 M1 F j+ j/ n7 b% G
创建账户& G, {( K3 w6 b: l& Z
内置转账, v5 s# ^7 |. j4 a5 ?. F6 ]
查询交易历史* j, O7 E3 r! C0 e
测试合约 - currency
2 K! o/ H7 z7 ` G( O' T- z
调用合约
8 a% |6 f. o1 a; c, q+ S
查询合约
" {; r" T1 \8 O$ D: m4 F
链接特定的节点
链接独立钱包服务* y" X6 W* ~% w I; [( Q; L* t: O8 W+ k
5 r0 b* @& J) S/ v9 J! } M2 R( l+ `
免签名验证
其他RPC调用
! ]2 y: N" y2 f0 Z3 _# W5 V+ }
EOS Docker快速部署8 d( Q* U: c6 Q, A/ P1 {
构建eos镜像. P" Y9 R$ {/ C) f0 W' q
git clone https://github.com/EOSIO/eos.git --recursive
cd eos9 a0 ?$ t; _. P$ P, Z% Y* w5 r# ^5 _
cp genesis.json Docker 6 v! |# O& S1 J7 W! |9 w
docker build -t eosio/eos -f Docker/Dockerfile .- d; P/ D7 C0 r/ N
启动容器* ^0 O5 [) z: q! u. R- E0 j
sudo rm -rf /data/store/eos # options
sudo mkdir -p /data/store/eos
docker-compose -f Docker/docker-compose.yml up0 v& Y0 e! q8 ?; G0 Q/ m
如果 docker-compose 启动有报错, 可能需要给文件存储目录赋予用户读写权限/ `# [. s2 F4 I. @% F8 e; r
sudo chown -R SYSTEM_USER /data/store/eos
验证,查询区块链状态信息* S. S" U" s2 Y& U( s! h- I/ q; P
curl http://127.0.0.1:8888/v1/chain/get_info$ R7 U4 v, J" q1 X
如果想使用多节点环境,可使用yml文件启动1 ], c+ X+ e9 {, d0 k
version: "2"4 D! F; q, x4 [! N B" E
services:
node1:
image: eosio/eos
ports:* O6 |! {" i! b
- "8888:8888"8 j" M# l! A) T$ `9 G$ U, @- J- f
- "9876:9876"5 V6 A) q b S# Q1 M9 X
volumes:
- ./node1/data:/opt/eos/bin/data-dir
node2:
image: eosio/eos # q: W+ z! U' e0 J, l1 c
ports:
- "8889:8889"
- "9877:9877"8 T& T" O# m+ v2 a3 m6 W0 \
volumes:
- ./node2/data:/opt/eos/bin/data-dir8 b5 ? V: _# o( j
depends_on:
- "node1"1 T( n9 X0 T) N$ d7 M
EOSC使用7 E* K3 V i- u, O# `8 z
EOSC是EOS的核心进程EOSD对外暴露的RESTAPI命令行工具。EOSC的使用会利用到一些内置插件,插件在EOSD的配置文件config.ini中进行设置,如与链的交互需要使用’plugin = eos::chain_api_plugin’。为了签署交易并发送到区块链上,需要使用‘plugin = eos::wallet_api_plugin’。为了查询交易和历史记录,需要使用’eos::account_history_api_plugin’ 。* [ B, W, H2 z3 J* |" U8 n/ `
# Plugin(s) to enable, may be specified multiple times
plugin =
eos::producer_plugin
plugin =6 S# u; a* G* _5 r+ A7 t" p
eos::chain_api_plugin
plugin =
eos::wallet_api_plugin! c' d1 O; _& H) S; @
plugin =
eos::account_history_api_plugin
启动eosd后,可以使用EOSC查询当前的区块链状态
docker exec docker_node1_1 eosc get info8 b. ^: A, R7 Q4 m9 S
{
"head_block_num": 23449,0 D. Z, v2 A' v$ W0 o$ i
"last_irreversible_block_num": 23432,* p1 c$ i( g+ E* q
"head_block_id": "00005b996cc85962b28537c3d72696a012d1071638f5e4bad1809cf9afc9abb6",
"head_block_time": "2017-09-29T01:53:33",9 g4 \ P! X; f% _( k2 H
"head_block_producer": "initi",& l* R0 n$ N5 h0 k
"recent_slots": "1111111111111111111111111111111111111111111111111111111111111111",4 h2 l$ p7 X/ u
"participation_rate": "1.00000000000000000"+ u4 r$ p @/ K6 u
}6 h/ f g; q% l9 D
创建钱包) o) @! `/ Y$ J3 t3 [0 A
任何发送到区块链的交易都需要由所有者持有的私钥进行签名。首先,我们需要一个钱包来储存和管理私钥,使用EOSC命令创建一个钱包。
docker exec docker_node1_1 eosc wallet create
Creating wallet: default
Save password to use in the future to unlock this wallet.6 S8 s6 I' ^( m
Without password imported keys will not be retrievable.3 t% w9 T$ o6 y6 X5 X; f
"PW5JXSxkHqNEwRKCpG2JUTLqkR8SNCBXofkAwaFDLwQkNdqaSXwC8"
命令执行完成,会在eos-walletd中创建一个名为‘default’的钱包,并返回钱包密码。
这时候可以查看钱包列表2 X, T: [% _! j9 |6 c! u
docker exec docker_node1_1 eosc wallet list+ G5 L3 f$ F2 x7 ?3 s( B1 j
Wallets: & }1 Q2 Z$ T& Q4 i
[
"default *"7 N9 w1 B0 M, I; D9 w Y: b
]
如果你没有指定钱包名称,默认都操作的是‘default’钱包
将私钥导入钱包
如果你想授权某个钱包可以由某人来管理和控制,需要导入该授权者的私钥。8 F# ]: F/ G, C& n6 r
docker exec docker_node1_1 eosc wallet import 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3$ ?/ e% w9 M& _7 F; A
imported private key for:9 b% @5 I6 a/ r
EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV+ ^6 t. s9 F4 d" P
导入后,可以查询钱包已经导入的私钥和对应的公钥, l8 b0 I# ~& W; B: J3 f8 D
docker exec docker_node1_1 eosc wallet keys
[[3 O- V$ E8 ?! } m4 S; {# o
"EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV",
"5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3") F3 p( _: b0 {
]- L4 B4 N( ]+ a1 A( f- K
]
锁定和解锁钱包
日常使用,为了保证私钥安全,可临时锁定钱包,锁定后查看钱包列表是不可见的( I% x" Z3 G K+ J5 R+ |
docker exec docker_node1_1 eosc wallet lock# V$ k& [) o8 z% q4 \
Locked: 'default'- C3 C. x( D5 t0 N) w
当想要使用时,可以用创建钱包时生成的密码来解锁钱包
docker exec docker_node1_1 eosc wallet unlock --password PW5KVWrn81Y8PLAb52gr2FyXCanVavcrj9d5TC9C3yKhqq1PJYRPk% c; a9 O D9 }
Unlocked: 'default': |# h5 S" f* ~) |! }" f, j y' z
解锁后,可以在列表重新看到default钱包了
docker exec docker_node1_1 eosc wallet list
Wallets:
[
"default *"
]
创建账户
创建账户需要有两组密钥:owner和active。EOS使用EOSC工具来创建密钥对
1)owner key.9 Q+ N0 W4 ?- \, C& R; m
Private key:5JRc8XxvodWey4StZ2zzkUhCQhDaHvGMkABtfHzQR2ie4qaUFJ7
Public key: EOS5mFEdAzxvMkHLQXt2v4naUjnBrPGmzMUCikymqhSR6m7QLGSTB9 C; _2 E. A1 C b! J" g/ `
2)active key
Private key:5KNzFCbToz2a9Hztz9Qen5cyJcM3x5Wpq4GFiTYZgGhzntXdmYo0 ?1 \- h/ C; Z& t* X( j
Public key: EOS5EdsvESpibWLJxupTqod1nswJnbiXQZuUcLiAWEEsqcZskymeB
EOSC不会保存生成的私钥( r1 T9 ]9 @. `; |2 l! f k
因为后续测试智能合约需要,我们创建一个名为currency的账号。目前这个版本,所有的账户都需要用已有账户来创建,所以我们用inita账户的owener key和active key来创建currency。 为了使inita获得发送交易的权限,需要先导入inita的私钥到钱包。(参见私钥导入钱包的步骤)
docker exec docker_node1_1 eosc create account inita currency EOS6NpEqWi177VKQkuJQL9V6Y3LqAAp9C2j
执行成功,会输出一串json的交易信息,打印账户创建相关内容1 w8 i' o+ h9 x9 c4 D' g
我们可以查询inita可以创建了哪些用户$ u8 I, Y3 s, ~ B9 @% f0 M5 q
docker exec docker_node1_1 eosc get servants inita
{
"controlled_accounts": [. ~( A& m# n5 D+ ]( e
"currency"" Z" h+ J1 d/ E8 D. [3 ~
]
}, l5 ^5 ^3 u2 {3 z# W% {
内置转账
创建账户之后,可以查看当前账户的状态,可以看到创建的测试账号没有余额,这样不少功能无法测试,我们需要试着给创建账户添加一些余额8 N4 U" M$ |1 b
docker exec docker_node1_1 eosc get account currency
{
"name": "currency",
"eos_balance": "0.0000 EOS",$ |$ }' h3 K8 r1 E p6 x
"staked_balance": "0.0001 EOS",
"unstaking_balance": "0.0000 EOS",
"last_unstaking_time": "1969-12-31T23:59:59",
"permissions": [{
"name": "active",
"parent": "owner",# H, F ~( y) E1 R$ E1 X3 b6 ^' E2 q+ b" @0 j
"required_auth": {
"threshold": 1,9 w+ U5 f( V& f# Y
"keys": [{) y0 V- |8 M# [
"key": "EOS8ff42NMpJUybVj3nwUSnPpc3mMysKxyE4HVJy1E5o3fQv7knWf",* m4 J7 R8 I* v8 S3 A
"weight": 1$ c) d3 w& V! M
}
],
"accounts": []- I2 [* y4 R" X. M! m) K
}
},{
"name": "owner",
"parent": "owner",
"required_auth": {# s2 b. u3 T6 g% M' U4 o6 J7 F
"threshold": 1," L" |3 H* W* J' h
"keys": [{
"key": "EOS5fQ4saiHV426EQ7AKrGoD2AVMBYe77bnGSq42JjXBUfipv7o3E",
"weight": 1) R9 Z1 Z/ a' O [- I5 I- E: y6 r
}
],9 L1 N7 j$ j5 {+ q) I# `! p
"accounts": []
}! h1 | R! h; ~
}+ t% i1 A' F" {8 s- b
]
}: f# j q9 v/ F
保存全网余额的创世账号是eos,查询余额状态# b+ Q* d D! Z* d' d; `
docker exec docker_node1_1 eosc get account eos/ x$ X; A F/ b, ?9 _
{9 c5 w" o. H3 q( F ]# c r
"name": "eos",
"eos_balance": "69000000.0000 EOS",6 Q8 S/ @" u' t" u) G
"staked_balance": "0.0000 EOS"," _6 w$ B3 T5 m" k m5 |9 f
"unstaking_balance": "0.0000 EOS",
"last_unstaking_time": "1969-12-31T23:59:59",
"permissions": [{0 }. _- [* v9 P. N
"name": "active",2 |7 z4 F& M( U) O9 }/ U+ ?
"parent": "owner",5 L3 v/ f- B2 p+ h( q
"required_auth": {
"threshold": 1,9 ?$ ^9 M" o- Z
"keys": [],+ }) _1 p" n+ B9 J+ D) \+ s: o4 v Z
"accounts": []
}
},{
"name": "owner",
"parent": "owner", w. n0 l; g* a; f o
"required_auth": {
"threshold": 1,+ \' N7 O' u5 r( c" d5 N5 v5 t
"keys": [],$ J' q8 k7 f- c' L; y' Y
"accounts": []) k' m* j$ L) H! J& ?% o: F
}0 n& w6 } A8 B) M. d: G
}
]
}. g7 s, e( @, q, y- W! k" t
我们可以通过创世块定义的创世账户使用EOSC给当前创建的账户转移余额# }% C4 D3 H* }% [0 E
docker exec docker_node1_1 eosc transfer inita currency 100000000
{6 j* Y; T' v1 q5 C! p
"transaction_id": "59575b8caf08eac7c00eb7483c048f12d0e7abf1ede839c3b2ed41dc6c5c7c5f",. C8 ]0 v9 w5 F6 |
"processed": {
"refBlockNum": 24199,& i# \4 w5 A6 @3 t$ `; ~
"refBlockPrefix": 1485651173,
"expiration": "2017-09-29T02:31:03",2 `; f0 H$ c. H/ G$ U/ R1 k6 x
"scope": [
"currency",
"inita"
],# E& M- F1 T2 [. g. b/ p
"signatures": [
"1f14229bdd4bfb927021bf96ff0651c8b0fa5666e9f5cf423a0270a1b91f2d2f690b573e179d8475ce2c6b160f5cd5507d58a44f8f6cf536348584efa8dd62ade0"" ^+ P- S. O, h) t
],
"messages": [{
"code": "eos",
"type": "transfer",
"authorization": [{
"account": "inita",' Q: @5 W! t# F3 ~( R
"permission": "active"
}/ C3 j- t0 K$ f" [& N8 L
],
"data": {/ l1 |5 v: ` g, k
"from": "inita",
"to": "currency",
"amount": 100000000,
"memo": ""
},2 F1 l9 `% w6 r B
"hex_data": "000000000093dd740000001e4d75af4600e1f5050000000000"
}
],) y: ?7 m' p E" }. a$ _0 b: x% a
"output": [{7 S6 t: C' F6 `. S6 G
"notify": [{$ x3 ^: w) H: ?- M# y( |5 [
"name": "currency",0 X `) O) \/ ~. j; Q) K+ c' z
"output": {
"notify": [],
"deferred_transactions": []2 M0 h x( u% L
}
},{
"name": "inita",
"output": {# Y% y& v5 E9 E9 H, E' p$ P
"notify": [], n' I! C/ O" z7 R9 S
"deferred_transactions": []
}, b8 ~0 U# F. S1 H- [/ a" c# \
}
],% X7 w5 w3 R- f8 R& v7 W- z+ g* m
"deferred_transactions": []' A- Y) d* A. V& x; d; b3 ~% c
}& b C4 h* X8 W1 S" c. W+ _
]$ r, B3 S- h- u8 e0 _' ?
}5 a: ?* [# f" `3 q% _" \' O P
}
再通过执行get account 命令,验证余额已经成功转移到创建的账户下( c+ D# u1 f9 K6 H/ {$ ~
查询交易历史2 W: {% n D, i# x5 [ w
查询交易历史会使用到插件account_history_api_plugin,我们已经在config.ini中定义
docker exec docker_node1_1 eosc get transaction % p* Z2 v/ [% j. x# f
如果需要查询一个特定账户最近一次的交易记录
docker exec docker_node1_1 eosc get transaction inita
创建智能合约
官方提供了一个示例合约currency,我们依然使用EOSC来创建并部署智能合约,合约代码位置contracts/currency。
1)为合约创建一个所有者账户。前文已经创建了currency账户1 S+ s+ Q }# P% r' M5 q
2)检查区块链上有无同名合约
docker exec docker_node1_1 eosc get code currency
code hash: 0000000000000000000000000000000000000000000000000000000000000000 % R) [- K m0 D
3)为了获得部署权限(发送交易请求)需要将currency的active key导入到钱包中
4)部署合约(.wast后缀文件)和他的abi(.abi后缀文件)% n' x$ E! d/ E" l7 U; ?
docker exec docker_node1_1 eosc set contract currency ../../contracts/currency/currency.wast ../../contracts/currency/currency.abi o3 }3 o* d* Y- ]% W* I( Q
Reading WAST...
Assembling WASM...
Publishing contract...0 G9 I5 b7 P# C l: @% S* }: D; n
屏幕打印部署成功相关的信息,并查询合约hash' l5 ~5 X9 S2 C9 o1 Y; a
docker exec docker_node1_1 eosc get code currency
code hash: c4023f74b3c7a3321d1641e4111b13584078fa7265c6ab12e1c19ff7ee800faf
调用合约/ s1 n( |" ]8 R
在合约部署到区块链上之后,所有的currency余额会分配给我们创建的currency账户。我们可以调用合约测试做一些转账交易。
为了更好了解区块链合约的调用方式,我们可以通过.abi查看可以执行的操作列表和消息结构。
docker exec docker_node1_1 eosc get code -a currency.abi currency- M) c1 S! D, `3 j
code hash: c4023f74b3c7a3321d1641e4111b13584078fa7265c6ab12e1c19ff7ee800faf7 }- @- A: c5 k6 [- W
saving abi to currency.abi" Z- m2 {( `& o# t
cat currency.abi #查看0 ?6 h- b( a; {- ~' \
{: p- T4 r* X2 i4 P) {1 {8 e
"types": [{
"newTypeName": "AccountName",, `, ~% f6 u8 [) @3 j- q( M! @
"type": "Name"9 {4 c$ r" ^/ w9 h' r
}8 m# _0 u& N1 n+ p. Z* l
],
"structs": [{9 W9 I& |5 V. j1 i. J) F$ i. O
"name": "transfer",
"base": "",) c) J8 Y/ e. u; j% ~4 T9 c3 c
"fields": {# A/ P% o9 i2 L7 N- T) ?
"from": "AccountName",. e8 ?# B) R6 _ a
"to": "AccountName",
"amount": "UInt64"( K1 a' v; T- w3 D: q- ]
} J* n+ C9 L; z* b2 p; c, E
},{
"name": "account",( W! c) v3 @1 r- o) K& w
"base": "",9 L f- a/ g4 O. t
"fields": {
"account": "Name",
"balance": "UInt64"
}
}
],
"actions": [{9 a, ]& Z( y( f& A/ M6 @( S, ?
"action": "transfer",' g& z4 S+ d+ g
"type": "transfer"# [0 ~% l" `5 d) @5 o" `" E7 C( a
}
],. P* i/ g3 X) }- U: a7 K) j4 c6 d8 b6 Y
"tables": [{- H3 D0 ^; [& R/ d9 O
"table": "account",
"type": "account",% b) p) ^7 S. J0 v2 O. j5 f& Z
"indextype": "i64",; z- B* V! |, N) |# B. o" q; W" N* U6 O
"keynames" : ["account"],8 m/ Q5 g& T# T% A
"keytypes" : ["Name"]
}; M% W2 M0 n7 ]
]
}% x1 ~- N e" Z5 f3 g
通过上面的abi我们可以看到currency合约可以执行transfer操作,消息格式为from,to和amount。我们调用合约从currency账户转移50个余额到inita账户 ~' _& o1 ?/ a
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' D- U! ^- ^/ M( W+ P; L6 y
{
"rows": [{
"account": "account",
"balance": 50
}9 u$ m+ j6 n( B7 G9 t9 _' K
],
"more": false
}5 V1 q8 ]5 |$ ~ c* h
docker exec docker_node1_1 eosc get table currency currency account8 Y1 B6 }1 X/ Z/ D3 g7 f
{
"rows": [{
"account": "account",
"balance": 999999950
}! j7 w4 F' @4 [; I3 q/ z9 r; O
],7 A0 j7 M9 ]% t! B E
"more": false
}
余额不足的账户尝试转账,会提示失败( \0 |4 X) t/ n. G1 D
docker exec docker_node1_1 eosc push message currency transfer '{"from":"tester","to":"inita","amount":50}'-S inita -S tester -p tester@active
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
status_code == 200: Error : 10 assert_exception: Assert Exception
test: assertion failed: integer underflow subtracting token balance
{"s":"integer underflow subtracting token balance","ptr":176} thread-1 wasm_interface.cpp:248 assertnonei32i32 [...snipped...]
查询合约5 `" L6 f1 _- D f
如上文验证步骤,在调用完合约后,可以通过查询表来验证每个帐户持有的余额。7 G" _5 N) W1 C" \$ X- v
docker exec docker_node1_1 eosc get table currency currency account
连接特定节点
默认情况下,EOSC连接本地端口8888的节点。可以通过指定主机地址和端口来连接其他EOSD节点。同样的,钱包服务也可以指定特定的主机地址和端口。+ t+ K0 a5 i8 W5 ?0 t1 X
docker exec docker_node1_1 eosc --host --port
链接独立钱包服务' h6 V5 [% C% m1 g1 t L
除了使用EOSD内置的钱包服务,也可以独立部署钱包服务
docker exec docker_node1_1 eos-walletd --http-server-endpoint host:port
调用独立钱包服务需要添加如下选项, K6 a- Y' r: D w" R
docker exec docker_node1_1 eosc --wallet-host --wallet-port4 M3 A; b3 y r+ O- ?2 L
免签名验证3 X2 D* Z1 B0 |2 K- g/ L
开发者如果需要快速测试功能,可以跳过节点签名的步骤,这样可以解耦密码学的问题而关注应用功能
启动时使用特定参数7 i5 b5 b- u+ ^. O, X
eosd --skip-transaction-signatures
EOSC调用时添加-s 选项
docker exec docker_node1_1 eosc -s
其他RPC调用
EOSD RPC 包含通过HTTP RPC与eosd和注册其上的插件进行调用的方式.: n. u* a8 [1 v2 U6 p
1)区块链API 配置
想要查询eosd信息需要启用plugin = eos::chain_api_plugin插件并添加至config.ini中
2)get_info接口用于查询区块链的基础信息% G" M2 k2 b, h, M3 u, Q7 W9 j
curl http://127.0.0.1:8888/v1/chain/get_info $ f8 m4 Y) @' p' C/ M% v! A
返回结果如下:
{"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"}
get_block接口用于查询区块相关信息+ I" B: L: A' {
. |5 }# M6 K7 E- b
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}'
返回结果如下:( G8 f/ C6 W6 x L9 P5 d( t
{"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}7 X; A5 P5 m& Z
4)push_transaction接口,调用合约交易
该调用为JSON格式并会将结果更新到区块链上
执行正确的结果返回
返回 HTTP 200 和交易ID号
{ , S# h' V: I. b! U, |" [/ `
'transaction_id' : "..."
}% W. A2 |- E7 h; j& o
执行错误的结果返回,一般为400错误(参数错误)或者500错误 G8 r" I# X7 I
HTTP/1.1 500 Internal Server Error
Content-Length: 1466
...error message..% ~3 N: J5 E+ k4 ^
push_transaction 调用方法7 q$ f; f; G0 E9 _0 a
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":[]}'8 I! t3 T' L' ^- Y4 {
此示例模拟一个转账交易。 refBlockNum和refBlockPrefix使用的前例block查询的结果
成为第一个吐槽的人