EOS纯技术上手学习
罗宾虚汉
发表于 2022-11-4 20:37:25
167
0
0
主要内容:
EOS Docker快速部署
* R# e( x0 e/ ?9 z( l
EOSC使用
创建钱包% W" v8 S! ?! t/ L
将私钥导入钱包7 I5 z+ }" a+ ^4 e* u
0 u! N, y) B5 Y% J
锁定和解锁钱包/ F* ^1 t3 M8 d$ X* b- _
创建账户
内置转账
查询交易历史
9 c$ P4 `% e7 E D( J8 C1 V
测试合约 - currency
0 g* Y) j( G! d. [+ ]
调用合约: v3 G" |+ A7 k, Y$ P* T B0 D# W
查询合约8 Y Z4 \3 U/ D5 o/ p1 k5 w
链接特定的节点 f7 K7 h3 f4 L8 m- J: T
链接独立钱包服务
" A n* r* b9 U' m. Y: D
免签名验证
其他RPC调用
" m M. l# `' X0 l
EOS Docker快速部署
构建eos镜像
git clone https://github.com/EOSIO/eos.git --recursive+ u2 O7 b0 Z9 W- [& L
cd eos
cp genesis.json Docker
docker build -t eosio/eos -f Docker/Dockerfile .1 K" x( h7 ?5 d7 K6 {. }
启动容器! r" x! H& b: ?4 x9 Q, `" R
sudo rm -rf /data/store/eos # options
sudo mkdir -p /data/store/eos
docker-compose -f Docker/docker-compose.yml up
如果 docker-compose 启动有报错, 可能需要给文件存储目录赋予用户读写权限% h; V9 T8 `1 x* ?& D
sudo chown -R SYSTEM_USER /data/store/eos
验证,查询区块链状态信息
curl http://127.0.0.1:8888/v1/chain/get_info
如果想使用多节点环境,可使用yml文件启动+ a$ N& R4 R+ G6 r
version: "2"
services:& R2 V2 D) C/ k- L
node1:
image: eosio/eos ) s. \' {1 {$ j( x1 ]0 G* k; K- m
ports:
- "8888:8888"
- "9876:9876"
volumes:: }. X% p+ N6 H; ^5 `
- ./node1/data:/opt/eos/bin/data-dir5 Y/ l5 Z9 ^* P9 h! w3 V) ^& H. {
node2:
image: eosio/eos $ b8 R( ?0 o& ~5 V# d
ports:# L. X4 p4 C& n. n
- "8889:8889"
- "9877:9877"% ~. K- q% v' U2 L1 t1 S# q
volumes:) j! W% P: y" V: t0 W- P4 p3 M
- ./node2/data:/opt/eos/bin/data-dir, U4 T# c u) O
depends_on:
- "node1"# g }8 G7 c$ L2 ]" @# P
EOSC使用! f- B$ l2 h' F6 _+ \" X
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 times
plugin =
eos::producer_plugin
plugin =
eos::chain_api_plugin
plugin =- z6 m% `* ]0 ^5 ?2 h& Z
eos::wallet_api_plugin
plugin =
eos::account_history_api_plugin
启动eosd后,可以使用EOSC查询当前的区块链状态* G2 R+ F1 ?3 \# n
docker exec docker_node1_1 eosc get info
{
"head_block_num": 23449,
"last_irreversible_block_num": 23432,0 y) J9 O6 Z8 D. `9 {) E; Z4 @
"head_block_id": "00005b996cc85962b28537c3d72696a012d1071638f5e4bad1809cf9afc9abb6",
"head_block_time": "2017-09-29T01:53:33",
"head_block_producer": "initi",
"recent_slots": "1111111111111111111111111111111111111111111111111111111111111111",9 }- e+ T9 ]+ x2 `/ l1 a: ]
"participation_rate": "1.00000000000000000"
}# W& u6 j D* h5 W' s: T/ f! _9 h I
创建钱包
任何发送到区块链的交易都需要由所有者持有的私钥进行签名。首先,我们需要一个钱包来储存和管理私钥,使用EOSC命令创建一个钱包。
docker exec docker_node1_1 eosc wallet create2 i7 |" F" H D) a9 ~2 v2 J9 `# U. f
Creating wallet: default9 I- N8 Q8 i3 b/ J
Save password to use in the future to unlock this wallet.
Without password imported keys will not be retrievable.
"PW5JXSxkHqNEwRKCpG2JUTLqkR8SNCBXofkAwaFDLwQkNdqaSXwC8") @ p; t+ }' l0 @
命令执行完成,会在eos-walletd中创建一个名为‘default’的钱包,并返回钱包密码。
这时候可以查看钱包列表
docker exec docker_node1_1 eosc wallet list4 ^ u% f9 k3 B4 N& S, y
Wallets:
[0 q4 A# }. R- Y# @( N: q
"default *"- Q6 y3 u" \+ I
]
如果你没有指定钱包名称,默认都操作的是‘default’钱包
将私钥导入钱包
如果你想授权某个钱包可以由某人来管理和控制,需要导入该授权者的私钥。
docker exec docker_node1_1 eosc wallet import 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
imported private key for:' [' O% s. h% C8 j* Z
EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
导入后,可以查询钱包已经导入的私钥和对应的公钥0 c. R7 F' A5 E6 E, u( D$ B1 n: x
docker exec docker_node1_1 eosc wallet keys
[[
"EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV",4 [+ T% F z H/ ]% w& a+ i
"5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3"
]
]) `/ p' o5 M* a
锁定和解锁钱包; u+ L7 W, d% w5 ~. N
日常使用,为了保证私钥安全,可临时锁定钱包,锁定后查看钱包列表是不可见的
docker exec docker_node1_1 eosc wallet lock) @: R9 S& @! D7 j: l2 M
Locked: 'default' ^0 J d1 E. l; U5 C6 G
当想要使用时,可以用创建钱包时生成的密码来解锁钱包
docker exec docker_node1_1 eosc wallet unlock --password PW5KVWrn81Y8PLAb52gr2FyXCanVavcrj9d5TC9C3yKhqq1PJYRPk
Unlocked: 'default'
解锁后,可以在列表重新看到default钱包了 _# \! f! d# _. O' ^7 F" F! Z
docker exec docker_node1_1 eosc wallet list9 _4 s- e+ Q; W% W/ t* h
Wallets: * }$ b9 b |) p: o( i3 Z8 g
[
"default *"# L6 A1 u9 Q. b+ w4 ^% \ |
]: T5 s# R% W( s$ E
创建账户( d/ D3 ?- S% b Z/ I
创建账户需要有两组密钥:owner和active。EOS使用EOSC工具来创建密钥对
1)owner key.
Private key:5JRc8XxvodWey4StZ2zzkUhCQhDaHvGMkABtfHzQR2ie4qaUFJ7
Public key: EOS5mFEdAzxvMkHLQXt2v4naUjnBrPGmzMUCikymqhSR6m7QLGSTB
2)active key
Private key:5KNzFCbToz2a9Hztz9Qen5cyJcM3x5Wpq4GFiTYZgGhzntXdmYo
Public key: EOS5EdsvESpibWLJxupTqod1nswJnbiXQZuUcLiAWEEsqcZskymeB
EOSC不会保存生成的私钥 W; ]: s% n) k3 G
因为后续测试智能合约需要,我们创建一个名为currency的账号。目前这个版本,所有的账户都需要用已有账户来创建,所以我们用inita账户的owener key和active key来创建currency。 为了使inita获得发送交易的权限,需要先导入inita的私钥到钱包。(参见私钥导入钱包的步骤)
docker exec docker_node1_1 eosc create account inita currency EOS6NpEqWi177VKQkuJQL9V6Y3LqAAp9C2j5 t# V/ Q# \& F& o6 E1 p8 F
执行成功,会输出一串json的交易信息,打印账户创建相关内容' A: [- f6 o, E% w$ ~4 M- ~" O0 O2 u' B
我们可以查询inita可以创建了哪些用户
docker exec docker_node1_1 eosc get servants inita& Z2 N& f4 i- [# e' v* F
{
"controlled_accounts": [! W: @' E j. @: P* M( M8 ~
"currency"
]
}
内置转账4 g3 J1 ~/ o" [: Z
创建账户之后,可以查看当前账户的状态,可以看到创建的测试账号没有余额,这样不少功能无法测试,我们需要试着给创建账户添加一些余额
docker exec docker_node1_1 eosc get account currency
{/ F8 N4 n, c2 A+ L- C
"name": "currency",
"eos_balance": "0.0000 EOS",& r9 N+ h6 F9 e, B
"staked_balance": "0.0001 EOS", D9 l" w0 S/ ]" J
"unstaking_balance": "0.0000 EOS",& ~4 p, I3 G8 [6 p
"last_unstaking_time": "1969-12-31T23:59:59",
"permissions": [{0 l: J# o V( P
"name": "active",- {0 F- @1 O1 i
"parent": "owner", y E. W& p; E2 N4 z5 x/ \
"required_auth": {
"threshold": 1,
"keys": [{! z/ h D5 \8 E! U0 G4 x3 a/ \
"key": "EOS8ff42NMpJUybVj3nwUSnPpc3mMysKxyE4HVJy1E5o3fQv7knWf",
"weight": 1
}' q. L% Y2 U" ?3 S! q& A* G- c
],
"accounts": []
}1 m9 K" p& q6 R$ G e" L6 r& n
},{8 d2 E/ x. `# Q" a
"name": "owner",
"parent": "owner",
"required_auth": {
"threshold": 1,
"keys": [{! H* V0 i! {' y4 {! w
"key": "EOS5fQ4saiHV426EQ7AKrGoD2AVMBYe77bnGSq42JjXBUfipv7o3E",
"weight": 1
}1 t* t( r: s* ?; Z
],4 x9 V, ^+ P( e# p A6 c* y: n
"accounts": []4 h% ~) r4 B" b' k3 z
}
}4 h/ ^: k3 m4 W* k3 {; a$ l
]7 l. O8 U/ _* l6 [) Q( G! D7 N( f
}
保存全网余额的创世账号是eos,查询余额状态
docker exec docker_node1_1 eosc get account eos9 O# T" [9 F3 H0 D* [
{( l4 L" H+ |/ y7 F$ r7 Z
"name": "eos",
"eos_balance": "69000000.0000 EOS",
"staked_balance": "0.0000 EOS",( S0 `3 g4 L1 n) f+ X1 M$ I* z2 L
"unstaking_balance": "0.0000 EOS",
"last_unstaking_time": "1969-12-31T23:59:59",
"permissions": [{: |3 @5 d/ K6 ]5 ?9 Z$ I- B% h
"name": "active",5 ]2 Y5 K8 k3 d* C/ I; w$ Z. j# b
"parent": "owner",
"required_auth": {" i8 e3 `0 K+ B
"threshold": 1,
"keys": [],
"accounts": []
}
},{- U3 `4 a. Z) t3 t4 C
"name": "owner",% q. v- M9 G ?7 A: E: O* m
"parent": "owner",
"required_auth": {
"threshold": 1," ?3 x( `1 W9 f7 T# g: s/ ?- H
"keys": [],
"accounts": []) `3 J/ V1 L- ^
}
}
]
}+ r4 `4 V# l# f+ G; o' u
我们可以通过创世块定义的创世账户使用EOSC给当前创建的账户转移余额: e$ G) k% {( V% ?6 X. r* c
docker exec docker_node1_1 eosc transfer inita currency 100000000/ ~5 C1 W3 l4 e
{6 o& c% X' v5 T5 T4 ^
"transaction_id": "59575b8caf08eac7c00eb7483c048f12d0e7abf1ede839c3b2ed41dc6c5c7c5f",) V, J' C) n% {! w
"processed": {. ?) z) C5 K# [/ V
"refBlockNum": 24199,
"refBlockPrefix": 1485651173,
"expiration": "2017-09-29T02:31:03",
"scope": [
"currency",
"inita"
],0 ?( H1 N5 s" j; C. T
"signatures": [
"1f14229bdd4bfb927021bf96ff0651c8b0fa5666e9f5cf423a0270a1b91f2d2f690b573e179d8475ce2c6b160f5cd5507d58a44f8f6cf536348584efa8dd62ade0"3 R. q/ ]3 _* }! l# E
],2 u3 V6 v. q. ~. a
"messages": [{* F1 O1 n0 X8 N$ D8 e
"code": "eos",
"type": "transfer",
"authorization": [{
"account": "inita",0 n: B$ S7 k ]: w: s$ S
"permission": "active"
}7 S5 I+ D. I, k- l
],4 @+ v2 ^* f" s4 [3 ~
"data": {. s+ S0 s8 m6 K
"from": "inita",8 [/ _$ s ~ f% ^5 c8 _- X% r
"to": "currency",1 B, ~$ L3 S5 ]( a9 h
"amount": 100000000,9 I0 X$ h( U" m& t/ j7 e8 x
"memo": ""
},
"hex_data": "000000000093dd740000001e4d75af4600e1f5050000000000"$ f5 \/ n1 N( I7 R0 _ U
}
],9 V0 E5 |! e& B3 s) W( X
"output": [{
"notify": [{' A& l& C6 l, p T4 ?* \% T
"name": "currency",
"output": {
"notify": [],
"deferred_transactions": []
}# B( }, j: l, ^! x) g
},{! ^3 `6 o" z' A* {
"name": "inita",
"output": {
"notify": [],, g) f2 x- O# h8 \! w }6 l" @5 s
"deferred_transactions": []
}6 h% `8 [9 {& L% K0 {
}
],
"deferred_transactions": [], P" f: n7 {7 }6 L1 }! @* q
}7 R" S! L1 h' W' w/ B
]+ d. [1 M! E: W% m6 d( r
}. a3 x/ ?9 ]) w" h6 z
}( f' r: V% J: x) c4 g' ~
再通过执行get account 命令,验证余额已经成功转移到创建的账户下5 u) d( z0 r/ g4 i" N' }/ F
查询交易历史- E- m S' G+ i4 U3 T
查询交易历史会使用到插件account_history_api_plugin,我们已经在config.ini中定义2 q3 T; y6 P* L* l5 m8 @) J" _
docker exec docker_node1_1 eosc get transaction # e* v; W+ n3 _4 u
如果需要查询一个特定账户最近一次的交易记录' Z$ q! ]) _1 n* N. t
docker exec docker_node1_1 eosc get transaction inita6 W- c0 f7 g+ a5 D: L- _8 @
创建智能合约
官方提供了一个示例合约currency,我们依然使用EOSC来创建并部署智能合约,合约代码位置contracts/currency。+ N; q& f3 T- y1 R+ K' S8 c1 ?) D$ m
1)为合约创建一个所有者账户。前文已经创建了currency账户( M6 Y( r# E- G5 L1 Z) O
2)检查区块链上有无同名合约
docker exec docker_node1_1 eosc get code currency
code hash: 0000000000000000000000000000000000000000000000000000000000000000
3)为了获得部署权限(发送交易请求)需要将currency的active key导入到钱包中/ {/ U `; y2 Z- F$ M7 W) o+ H
4)部署合约(.wast后缀文件)和他的abi(.abi后缀文件); F8 Z9 u/ W# m
docker exec docker_node1_1 eosc set contract currency ../../contracts/currency/currency.wast ../../contracts/currency/currency.abi! H& D/ j+ Q) n3 \+ d/ h
Reading WAST...
Assembling WASM..., S5 ]" i$ @. h$ F& s( U$ j
Publishing contract...& k; d5 }0 A) U; H3 p9 U. A% `5 D
屏幕打印部署成功相关的信息,并查询合约hash
docker exec docker_node1_1 eosc get code currency ; Z- C f' o- V) v9 H
code hash: c4023f74b3c7a3321d1641e4111b13584078fa7265c6ab12e1c19ff7ee800faf
调用合约2 n2 D" ~- X# k& a. P6 M6 v' w
在合约部署到区块链上之后,所有的currency余额会分配给我们创建的currency账户。我们可以调用合约测试做一些转账交易。- `; h' G" S+ }" g+ g- |" r
为了更好了解区块链合约的调用方式,我们可以通过.abi查看可以执行的操作列表和消息结构。& T" N0 C: Z3 B, d7 E6 P
docker exec docker_node1_1 eosc get code -a currency.abi currency- [" Z [# C. R2 a' i2 I# S0 S
code hash: c4023f74b3c7a3321d1641e4111b13584078fa7265c6ab12e1c19ff7ee800faf
saving abi to currency.abi2 U% O3 [% Q, Y9 {5 \, z& g7 W
cat currency.abi #查看
{+ ^* ^7 J$ Y7 w4 T- u" O
"types": [{ T# |- r, b3 O; Y0 s
"newTypeName": "AccountName",
"type": "Name"/ S: t% d" J3 G7 P2 E* M9 y1 @, C7 k
}4 x0 v3 | e$ ^, @+ u. D
],$ t1 G& A7 B0 h) |0 c
"structs": [{) j" w3 ^2 ?$ x, e d7 E o& |
"name": "transfer",. o8 d8 }2 L4 T7 R' e5 y
"base": "",, X: U7 V. b4 N- L% Y. Y
"fields": {
"from": "AccountName",& K9 d$ U' d7 Y) n0 o1 o
"to": "AccountName",
"amount": "UInt64"
}6 n9 Z- k$ c* b' `: K0 a+ G
},{
"name": "account",
"base": "",
"fields": {3 |9 ~' x9 t2 E1 g( t. ~
"account": "Name",
"balance": "UInt64"1 M4 c, I" o& W1 |: @: m( i
}! i5 k9 u: C E2 _$ @$ q" Y
}7 c( ?# W0 Z' y/ E2 i% m" _/ r
],
"actions": [{; S4 T, N: N+ s6 `
"action": "transfer",
"type": "transfer", ^6 E* g Y1 X7 R
}# o; f5 W$ K4 Q) `: e' q: R7 O
], o0 }5 ?9 |+ F6 b. Z% ~$ r' L
"tables": [{
"table": "account",; K @# D0 Z+ y( }' u8 ]2 e
"type": "account",+ Y7 R; J9 a9 G+ V/ k3 Q' R
"indextype": "i64",. R0 c8 H( t6 i6 F) n" l' E
"keynames" : ["account"],, o' W: i2 u7 {6 s) f* h* P1 V
"keytypes" : ["Name"]
}
]* X* ^8 b6 m' f' N: F
}
通过上面的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% t [3 c/ X" t U% [" c9 W/ ~
执行完成,我们查询余额验证结果
docker exec docker_node1_1 eosc get table inita currency account+ X% R+ ^0 S7 A! P) K4 D* s
{
"rows": [{( s' K3 S/ D$ P! J. Z
"account": "account",/ L! c5 }$ \4 X9 ~$ _/ }+ q2 L3 `
"balance": 50 / n4 V+ p$ @7 y* G) m
}
],
"more": false
}
docker exec docker_node1_1 eosc get table currency currency account
{
"rows": [{
"account": "account",
"balance": 999999950
}- [/ y+ v5 R& G2 d1 c) h
],. r G( J8 U8 v8 N) L5 j
"more": false
}
余额不足的账户尝试转账,会提示失败
docker exec docker_node1_1 eosc push message currency transfer '{"from":"tester","to":"inita","amount":50}'-S inita -S tester -p tester@active, C* t( H: |! J, X+ x! n+ n- W& F4 W6 d7 ?
3543610ms thread-0 main.cpp:271 operator() ] Converting argument to binary...3 h# M, \; q/ m; g% R& n! X$ U
3543615ms thread-0 main.cpp:311 main ] Failed with error: 10 assert_exception: Assert Exception% U3 h/ S' P+ r3 t; W: [6 S
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...]% z- w1 N" Q% M
查询合约
如上文验证步骤,在调用完合约后,可以通过查询表来验证每个帐户持有的余额。
docker exec docker_node1_1 eosc get table currency currency account
连接特定节点/ v, Q' x) A/ d' u- O* U+ P4 q
默认情况下,EOSC连接本地端口8888的节点。可以通过指定主机地址和端口来连接其他EOSD节点。同样的,钱包服务也可以指定特定的主机地址和端口。1 s1 ~3 u# Z( _( I2 _" z- B
docker exec docker_node1_1 eosc --host --port ' g/ n7 v7 D0 u5 k- r9 V& g |
链接独立钱包服务+ o) R3 T/ A- Q U
除了使用EOSD内置的钱包服务,也可以独立部署钱包服务
docker exec docker_node1_1 eos-walletd --http-server-endpoint host:port1 o4 p3 D. J6 t! f
调用独立钱包服务需要添加如下选项
docker exec docker_node1_1 eosc --wallet-host --wallet-port+ `$ j6 s3 p: r2 h, ^8 h) U) u
免签名验证( m% _7 k6 v% R/ ]- m
开发者如果需要快速测试功能,可以跳过节点签名的步骤,这样可以解耦密码学的问题而关注应用功能$ D# ?; F6 |; L1 j
启动时使用特定参数4 C" {# v$ m0 k" h J+ E
eosd --skip-transaction-signatures4 T3 }2 G# y+ d; Q% k7 p' s
EOSC调用时添加-s 选项$ O8 p3 m5 X3 n g8 M& i
docker exec docker_node1_1 eosc -s
其他RPC调用0 b9 U9 a4 {2 J# g6 ?) u5 e
EOSD RPC 包含通过HTTP RPC与eosd和注册其上的插件进行调用的方式.
1)区块链API 配置: Y) F l/ B$ D: j
想要查询eosd信息需要启用plugin = eos::chain_api_plugin插件并添加至config.ini中1 W6 V. o3 g* w* @
2)get_info接口用于查询区块链的基础信息9 d N2 p) e: h. m8 p; L
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"}6 a: V) Q: I+ U3 g. }# `% M
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}'
返回结果如下:
{"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}; Y$ ^, d k/ T% c9 c
4)push_transaction接口,调用合约交易$ L( I" T3 |% J1 q/ J/ t$ |6 _; E+ J
该调用为JSON格式并会将结果更新到区块链上
执行正确的结果返回
返回 HTTP 200 和交易ID号% E& U( z) T: O0 Q
{ 1 b9 D( [6 Q6 H6 p1 Z! `. _) N
'transaction_id' : "..."
}- k1 b2 X ^. w
执行错误的结果返回,一般为400错误(参数错误)或者500错误) a0 L* n6 b; w/ } N0 @
HTTP/1.1 500 Internal Server Error T+ S- L/ k# M. a
Content-Length: 1466
...error message.." m1 D- I- M2 A7 {* X
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":[]}'. m4 M5 |" l, P& I u* a8 f$ C
此示例模拟一个转账交易。 refBlockNum和refBlockPrefix使用的前例block查询的结果
成为第一个吐槽的人