EOS纯技术上手学习
罗宾虚汉
发表于 2022-11-4 20:37:25
121
0
0
主要内容:
EOS Docker快速部署* O3 t) E( ~4 [! G6 Q
EOSC使用
创建钱包! ]. N; N: l$ k! ~0 n+ g. `2 `; r
+ t* D! W* ]" E/ x6 J) \ S/ r
将私钥导入钱包" j) b+ D$ Y$ L$ @: y9 A
8 ]- g& c% f9 h0 j6 ?( n0 D" o, W' ?
锁定和解锁钱包; ?5 `5 w) U; c2 @
. O8 w% p, s# j6 {$ Z* a
创建账户
0 `0 d/ ?( I2 F( G
内置转账
查询交易历史) a& V5 z! W1 F3 x2 a% x
测试合约 - currency
- u$ A0 e: L7 u) `0 N' E; Y/ n
调用合约
$ b& e3 x! ?) {3 [" L
查询合约
. u9 L) f& p- h- o1 @0 [5 w) N
链接特定的节点: [- ]+ G4 B& T
@" v1 G; H" `( }2 Y; R5 [. \7 Y
链接独立钱包服务9 B/ x# |4 {( a6 L4 G4 J$ b4 k' o
9 X _" M* K8 Z, B
免签名验证% ~# i; }* u# J5 w- h
. g' V% [3 L9 S) R% D* ?) Z
其他RPC调用
EOS Docker快速部署* b0 C0 P) T ]* ?' Z! R) v
构建eos镜像5 o& Z9 ]0 K; B3 u
git clone https://github.com/EOSIO/eos.git --recursive
cd eos6 ^8 t" k, x+ A' ]1 z
cp genesis.json Docker
docker build -t eosio/eos -f Docker/Dockerfile ., y V: g+ J' J1 n# j- m/ e$ s
启动容器
sudo rm -rf /data/store/eos # options
sudo mkdir -p /data/store/eos
docker-compose -f Docker/docker-compose.yml up f. \. C O. M# O9 o+ v
如果 docker-compose 启动有报错, 可能需要给文件存储目录赋予用户读写权限) k$ y8 l. L1 o, C I
sudo chown -R SYSTEM_USER /data/store/eos
验证,查询区块链状态信息
curl http://127.0.0.1:8888/v1/chain/get_info2 v8 R" t9 F' b: _3 L
如果想使用多节点环境,可使用yml文件启动/ @( V' u( {8 b/ g/ @
version: "2"9 F9 q) f5 Y1 \3 c, r- r8 v
services:" W2 e; S7 D1 b4 F9 T
node1:/ ]1 Q3 s R3 [% J! m$ X
image: eosio/eos " t: i$ y1 S3 {! k5 O
ports:
- "8888:8888"( p' ?2 N% K7 P* o1 [! m
- "9876:9876"+ X/ s, w) h2 Y( B+ q# ^' T% t
volumes:% e% e1 n4 M0 E! {% S
- ./node1/data:/opt/eos/bin/data-dir: ]- s) H+ \1 [9 h, d/ H
node2:- p# \6 p2 f0 H; ~
image: eosio/eos q4 D* A$ |1 b2 s/ Y q
ports:
- "8889:8889"& g) J# e$ h ~4 u+ E- c
- "9877:9877"2 g/ F+ a' ~! o M D0 ?3 [
volumes:2 x8 w& c/ |+ w- C1 G
- ./node2/data:/opt/eos/bin/data-dir0 j& T0 W' t/ ^% {+ }& K
depends_on:1 a5 {/ F" l( l* }8 V
- "node1"
EOSC使用5 }6 y# O/ l; Y0 Q R$ C$ s, T
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* D j ^. I; x( q
plugin =
eos::wallet_api_plugin+ H4 L3 l6 N6 o2 i/ t0 s5 E
plugin = i% v5 o( e) G0 b4 x
eos::account_history_api_plugin6 s( ?- u( r3 Y+ D( W: D! H
启动eosd后,可以使用EOSC查询当前的区块链状态" n" F) a& ~; }2 Q8 b% B4 N% ^1 C
docker exec docker_node1_1 eosc get info3 y' h H( h! [5 h2 r. k! r
{& c& v# ~2 y" ?0 U% J
"head_block_num": 23449,
"last_irreversible_block_num": 23432,
"head_block_id": "00005b996cc85962b28537c3d72696a012d1071638f5e4bad1809cf9afc9abb6",
"head_block_time": "2017-09-29T01:53:33",
"head_block_producer": "initi",7 L1 _2 b8 ^+ @2 x: Y/ b8 ]- N
"recent_slots": "1111111111111111111111111111111111111111111111111111111111111111",
"participation_rate": "1.00000000000000000"
}' ]# T8 q! n5 c7 S7 l
创建钱包
任何发送到区块链的交易都需要由所有者持有的私钥进行签名。首先,我们需要一个钱包来储存和管理私钥,使用EOSC命令创建一个钱包。
docker exec docker_node1_1 eosc wallet create
Creating wallet: default0 [7 X5 w1 ^1 c8 s
Save password to use in the future to unlock this wallet.! ^0 [# U/ v5 i: i; z. a
Without password imported keys will not be retrievable.
"PW5JXSxkHqNEwRKCpG2JUTLqkR8SNCBXofkAwaFDLwQkNdqaSXwC8"( a$ V7 i( F* n4 e0 H7 O* N
命令执行完成,会在eos-walletd中创建一个名为‘default’的钱包,并返回钱包密码。
这时候可以查看钱包列表: k$ L8 \4 }0 f% B
docker exec docker_node1_1 eosc wallet list
Wallets:
[' X1 z" p$ D0 r
"default *"6 _" B9 f& b8 n
]$ w2 P+ B E. i' R; j' l
如果你没有指定钱包名称,默认都操作的是‘default’钱包
将私钥导入钱包* w* g5 ^/ R8 \ [, q/ s
如果你想授权某个钱包可以由某人来管理和控制,需要导入该授权者的私钥。
docker exec docker_node1_1 eosc wallet import 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD34 O# O8 G* d" E4 v" m
imported private key for:7 e6 f; n5 \) t* [6 q8 F: H% f, ~
EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV4 o, ^1 M0 [+ L$ l8 \
导入后,可以查询钱包已经导入的私钥和对应的公钥$ a6 c% L- [8 D- d
docker exec docker_node1_1 eosc wallet keys9 V+ w/ a& y8 q1 S
[[
"EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV",
"5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3"
]
]
锁定和解锁钱包& a3 t( V7 A6 n1 I. l8 E1 R
日常使用,为了保证私钥安全,可临时锁定钱包,锁定后查看钱包列表是不可见的2 K& r9 s8 @7 H8 ]8 n
docker exec docker_node1_1 eosc wallet lock
Locked: 'default'4 R/ \( P! h6 R% s
当想要使用时,可以用创建钱包时生成的密码来解锁钱包
docker exec docker_node1_1 eosc wallet unlock --password PW5KVWrn81Y8PLAb52gr2FyXCanVavcrj9d5TC9C3yKhqq1PJYRPk I& _6 H/ U9 O8 V# x: B+ k1 `
Unlocked: 'default'
解锁后,可以在列表重新看到default钱包了
docker exec docker_node1_1 eosc wallet list
Wallets: : @; e2 X i- i4 ~ E. ?2 _0 I; n
[
"default *"
]
创建账户2 _! S# I1 m: d. j* W
创建账户需要有两组密钥:owner和active。EOS使用EOSC工具来创建密钥对
1)owner key.
Private key:5JRc8XxvodWey4StZ2zzkUhCQhDaHvGMkABtfHzQR2ie4qaUFJ7
Public key: EOS5mFEdAzxvMkHLQXt2v4naUjnBrPGmzMUCikymqhSR6m7QLGSTB
2)active key
Private key:5KNzFCbToz2a9Hztz9Qen5cyJcM3x5Wpq4GFiTYZgGhzntXdmYo
Public key: EOS5EdsvESpibWLJxupTqod1nswJnbiXQZuUcLiAWEEsqcZskymeB
EOSC不会保存生成的私钥# P) q: c: M2 m6 o% p E
因为后续测试智能合约需要,我们创建一个名为currency的账号。目前这个版本,所有的账户都需要用已有账户来创建,所以我们用inita账户的owener key和active key来创建currency。 为了使inita获得发送交易的权限,需要先导入inita的私钥到钱包。(参见私钥导入钱包的步骤)1 O/ k; O$ K" C S( I& u+ p
docker exec docker_node1_1 eosc create account inita currency EOS6NpEqWi177VKQkuJQL9V6Y3LqAAp9C2j
执行成功,会输出一串json的交易信息,打印账户创建相关内容( E/ x* I; x0 p1 J, p& V
我们可以查询inita可以创建了哪些用户
docker exec docker_node1_1 eosc get servants inita
{
"controlled_accounts": [- r: t" H# ^0 J4 l& O$ o
"currency"
]0 Q& [9 t1 K8 V
}- p2 i; U, X4 N; f: k
内置转账
创建账户之后,可以查看当前账户的状态,可以看到创建的测试账号没有余额,这样不少功能无法测试,我们需要试着给创建账户添加一些余额
docker exec docker_node1_1 eosc get account currency- Y% N! B u4 Z# I, J+ m9 z- n* g
{$ g8 _ |. F1 ]% T2 k
"name": "currency",
"eos_balance": "0.0000 EOS",, S2 k" k, c# `# I/ [5 n" p
"staked_balance": "0.0001 EOS",$ J3 f: @( b1 D7 z2 D* u$ H
"unstaking_balance": "0.0000 EOS",
"last_unstaking_time": "1969-12-31T23:59:59",3 H5 m+ _7 D9 @3 V& V4 z5 X
"permissions": [{
"name": "active",- }# C1 G: X8 U+ N4 a
"parent": "owner",
"required_auth": { T8 d0 F( N2 U) r
"threshold": 1,
"keys": [{
"key": "EOS8ff42NMpJUybVj3nwUSnPpc3mMysKxyE4HVJy1E5o3fQv7knWf",* w+ }$ |% {7 s. a$ M
"weight": 1
}
],
"accounts": []
}
},{
"name": "owner",7 `# v# p* o. X7 z; p
"parent": "owner",( c, u9 Y- `" c) ~, m4 Z
"required_auth": {( y4 z' v' B8 X5 N" G
"threshold": 1,
"keys": [{4 s& s. Y7 m, i: U
"key": "EOS5fQ4saiHV426EQ7AKrGoD2AVMBYe77bnGSq42JjXBUfipv7o3E",4 |) j# p+ E7 W$ x2 R
"weight": 1
}
], @0 j! _% R, f0 u/ t# {
"accounts": []
}
}
]3 P! y9 k" L$ ^4 \1 p
}3 I4 Z; G$ I" g& Z& d4 G
保存全网余额的创世账号是eos,查询余额状态' {7 E! H3 ^% l7 x# ~) i: @
docker exec docker_node1_1 eosc get account eos
{
"name": "eos",, C! E% ?* D; b: _. ~1 G. f5 Y
"eos_balance": "69000000.0000 EOS",/ l# f( ]4 ^% W, C# Z% {) [5 r/ J
"staked_balance": "0.0000 EOS",9 M# J5 ~9 @! K- F m
"unstaking_balance": "0.0000 EOS",
"last_unstaking_time": "1969-12-31T23:59:59",8 i+ O; q5 m6 b+ F) u6 H- g. ~+ F4 [. n
"permissions": [{1 @" M. G, d- \" b! P/ d
"name": "active",$ E; P; G0 s' D) a; r
"parent": "owner",5 M7 ?2 `3 T" ^* h. i
"required_auth": {
"threshold": 1,4 s2 N6 l |* {- W# l3 h
"keys": [],
"accounts": []
}
},{: ?) k$ a* }/ I
"name": "owner",
"parent": "owner",
"required_auth": {
"threshold": 1,- d v1 Y; {( W1 M
"keys": [],
"accounts": []
}! ^3 r# T+ i1 G4 u$ Y9 \% ^
}5 g# W8 E6 K# w0 L) e
]; X2 Y8 ~( @1 s( G# J: @
}& L0 a: M9 o& [" m! D5 L$ C
我们可以通过创世块定义的创世账户使用EOSC给当前创建的账户转移余额- G9 ?: R& c* F Z! r0 I
docker exec docker_node1_1 eosc transfer inita currency 100000000; S' M. u& A8 r) U/ a a
{
"transaction_id": "59575b8caf08eac7c00eb7483c048f12d0e7abf1ede839c3b2ed41dc6c5c7c5f",2 Y" Q- t" _1 ?1 M) J
"processed": {
"refBlockNum": 24199,
"refBlockPrefix": 1485651173,
"expiration": "2017-09-29T02:31:03",
"scope": [
"currency",
"inita"8 C) [: x% E& B9 x1 W
],
"signatures": [3 |, V. J! _6 x/ b5 [0 v
"1f14229bdd4bfb927021bf96ff0651c8b0fa5666e9f5cf423a0270a1b91f2d2f690b573e179d8475ce2c6b160f5cd5507d58a44f8f6cf536348584efa8dd62ade0"
],; l& K2 `: {' G5 b4 P
"messages": [{+ ?1 b) o; Z, E; v. E
"code": "eos",
"type": "transfer",7 K6 o& k% D" T, n
"authorization": [{
"account": "inita",
"permission": "active"7 k c9 O- p1 _" }
}) i2 t4 X; t* f, x: G0 y$ t
],
"data": {$ ?8 e3 R" \1 V* y+ j, h$ b3 s9 X
"from": "inita",
"to": "currency",4 I5 R: n# {* N1 _/ g: f: K
"amount": 100000000,
"memo": ""4 s# k1 V- f% a1 e
},
"hex_data": "000000000093dd740000001e4d75af4600e1f5050000000000" N) t5 `; d& _+ A( `( D2 L C8 i
}
],
"output": [{
"notify": [{
"name": "currency",) D3 z1 R& m0 P; S: a1 p
"output": {+ B; Q$ v5 k- y. ]2 o
"notify": [],8 o+ _9 @# O9 L9 C
"deferred_transactions": []0 a) G$ V" {1 {+ e* y2 y7 k
}
},{- i7 Y; X$ I; e" ~0 |; s X: B
"name": "inita",
"output": {) y8 F0 ?5 z* A7 Q; D
"notify": [],1 H$ E' Z; K6 _" V
"deferred_transactions": []
}) a6 ?4 b- k0 ?, g# k4 U; Z
}
],) t9 b1 }- E. N5 l+ d9 c
"deferred_transactions": []" g* Q1 w. E4 t; c' t( O
}
]
}( J" s, K0 q+ n g/ c; ^' a% C7 z! z
}! x" H3 X7 V7 T& x* n7 I
再通过执行get account 命令,验证余额已经成功转移到创建的账户下% o. S7 p3 x& c( M- Z
查询交易历史
查询交易历史会使用到插件account_history_api_plugin,我们已经在config.ini中定义0 F1 [5 Q9 Z- n9 \
docker exec docker_node1_1 eosc get transaction
如果需要查询一个特定账户最近一次的交易记录
docker exec docker_node1_1 eosc get transaction inita
创建智能合约
官方提供了一个示例合约currency,我们依然使用EOSC来创建并部署智能合约,合约代码位置contracts/currency。
1)为合约创建一个所有者账户。前文已经创建了currency账户4 W+ s/ |0 o' T$ I7 t
2)检查区块链上有无同名合约4 g, T; P N- i8 M! K& R
docker exec docker_node1_1 eosc get code currency # f7 q" v5 C, K: _9 {4 U4 X0 U4 m
code hash: 0000000000000000000000000000000000000000000000000000000000000000
3)为了获得部署权限(发送交易请求)需要将currency的active key导入到钱包中$ P6 ]- N& G5 i e. U- @
4)部署合约(.wast后缀文件)和他的abi(.abi后缀文件). G% I1 }6 Q' v7 b/ O, }
docker exec docker_node1_1 eosc set contract currency ../../contracts/currency/currency.wast ../../contracts/currency/currency.abi, P. D6 H$ A; u: {
Reading WAST...
Assembling WASM.../ m* q! W6 Z1 `% ~& b
Publishing contract...
屏幕打印部署成功相关的信息,并查询合约hash
docker exec docker_node1_1 eosc get code currency
code hash: c4023f74b3c7a3321d1641e4111b13584078fa7265c6ab12e1c19ff7ee800faf
调用合约- z1 L- W4 Z2 ?8 o# L8 l! c7 d
在合约部署到区块链上之后,所有的currency余额会分配给我们创建的currency账户。我们可以调用合约测试做一些转账交易。
为了更好了解区块链合约的调用方式,我们可以通过.abi查看可以执行的操作列表和消息结构。
docker exec docker_node1_1 eosc get code -a currency.abi currency) G+ I) s9 K+ p6 J' z0 R- F' C# N0 d
code hash: c4023f74b3c7a3321d1641e4111b13584078fa7265c6ab12e1c19ff7ee800faf
saving abi to currency.abi
cat currency.abi #查看 f8 x$ K# e4 Z" t4 K3 I% w! E9 _
{) @% N1 B* v% l7 N' v
"types": [{: y1 q' \4 V5 t9 T* j1 D; C* ~
"newTypeName": "AccountName",. r6 e' u+ t* T* v3 d. S/ F; j7 t
"type": "Name"
}4 x% n! L; R4 _7 U+ a* u3 s
],
"structs": [{% D/ e6 j2 K- ~5 J3 S
"name": "transfer"," w& {' n, m* w: ?" i% @; o
"base": "",, g1 b6 i" H- G, F2 c
"fields": {# X+ Y1 Z0 T0 H3 h5 @" [- B: L" z
"from": "AccountName",
"to": "AccountName",
"amount": "UInt64"' i; z O; c# J" N# |3 f) G
}) R8 w4 K5 u E5 `4 |9 J
},{6 d$ P e) h. V0 y+ B% m o
"name": "account",
"base": "",. L( {; A! `, X) S* j2 I
"fields": {5 v. l: v. b" b9 L1 e* ^6 B- y! c
"account": "Name",
"balance": "UInt64"
}3 E. N# f3 p: G" ^! W! o2 p
}: T2 ^$ C" H& C) Q
],# G* g& K0 L( B5 r/ M
"actions": [{' s z, K& @- N
"action": "transfer",
"type": "transfer"8 Z x+ S/ k6 G* H7 M9 b2 @; e
}
],) e2 D( ]- {" ^3 r9 n5 N
"tables": [{
"table": "account",$ t: |' g) A, F' m4 s1 X m( B1 r
"type": "account",
"indextype": "i64",) G/ l* X# X `' x
"keynames" : ["account"],
"keytypes" : ["Name"]
}
]
}, o/ g9 K# n$ G& q7 A' X
通过上面的abi我们可以看到currency合约可以执行transfer操作,消息格式为from,to和amount。我们调用合约从currency账户转移50个余额到inita账户9 s2 ?! K9 _ x) c$ ?9 B6 `( `9 T. F
docker exec docker_node1_1 eosc push message currency transfer '{"from":"currency","to":"inita","amount":50}' --scop% {1 C* }5 x8 t! [7 }
执行完成,我们查询余额验证结果
docker exec docker_node1_1 eosc get table inita currency account4 {- r* ~9 R0 c- z, \7 u
{
"rows": [{
"account": "account",' l }1 V- j/ N5 E2 g5 q
"balance": 50
}
],$ l9 _, l3 P+ \# z }" P
"more": false
}
docker exec docker_node1_1 eosc get table currency currency account$ B! A5 |6 ?/ y1 u" l. A* ^% Q$ W
{
"rows": [{1 E5 S1 t! @* ^6 f
"account": "account",6 o+ q1 G0 f5 {
"balance": 999999950" e) N: n# {9 v
}
],+ b, L# t! {! W: n
"more": false" }4 |- E0 I1 h) v) X; X
}
余额不足的账户尝试转账,会提示失败
docker exec docker_node1_1 eosc push message currency transfer '{"from":"tester","to":"inita","amount":50}'-S inita -S tester -p tester@active3 T# w2 a. N5 g2 ]
3543610ms thread-0 main.cpp:271 operator() ] Converting argument to binary...$ X6 n7 ~# X$ M( R' `- @: S8 D
3543615ms thread-0 main.cpp:311 main ] Failed with error: 10 assert_exception: Assert Exception5 Y; {" b' P( _* H
status_code == 200: Error : 10 assert_exception: Assert Exception. N$ i5 U# U7 C3 G# I. b% b2 p; H
test: assertion failed: integer underflow subtracting token balance
{"s":"integer underflow subtracting token balance","ptr":176} thread-1 wasm_interface.cpp:248 assertnonei32i32 [...snipped...]; n# F e- ^% {: u. f
查询合约
如上文验证步骤,在调用完合约后,可以通过查询表来验证每个帐户持有的余额。6 k; z1 q) b, ^4 ?
docker exec docker_node1_1 eosc get table currency currency account
连接特定节点7 x. x; a2 S( |: F
默认情况下,EOSC连接本地端口8888的节点。可以通过指定主机地址和端口来连接其他EOSD节点。同样的,钱包服务也可以指定特定的主机地址和端口。! x, W5 n- N5 T0 g9 Y% Y
docker exec docker_node1_1 eosc --host --port 6 A% v# I5 k/ r Y
链接独立钱包服务" W: V( M3 R" t
除了使用EOSD内置的钱包服务,也可以独立部署钱包服务
docker exec docker_node1_1 eos-walletd --http-server-endpoint host:port, [) f" q& G( S) l$ f9 |
调用独立钱包服务需要添加如下选项+ j: H* }+ G- A6 g+ n' g2 J, o
docker exec docker_node1_1 eosc --wallet-host --wallet-port: X) |/ |+ T$ \5 z' h$ |
免签名验证
开发者如果需要快速测试功能,可以跳过节点签名的步骤,这样可以解耦密码学的问题而关注应用功能
启动时使用特定参数3 ^: D! u' N" ?6 e- X5 K6 |% |
eosd --skip-transaction-signatures- @/ h$ W9 U1 }7 o6 Q
EOSC调用时添加-s 选项
docker exec docker_node1_1 eosc -s
其他RPC调用
EOSD RPC 包含通过HTTP RPC与eosd和注册其上的插件进行调用的方式.
1)区块链API 配置
想要查询eosd信息需要启用plugin = eos::chain_api_plugin插件并添加至config.ini中
2)get_info接口用于查询区块链的基础信息* D; V0 l3 Z1 O; X; @, D
curl http://127.0.0.1:8888/v1/chain/get_info
返回结果如下:. @4 \ r- s* g
{"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接口用于查询区块相关信息
curl http://localhost:8888/v1/chain/get_block -X POST -d '{"block_num_or_id":5}'6 {8 s7 l( b7 M: h# n
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}
4)push_transaction接口,调用合约交易
该调用为JSON格式并会将结果更新到区块链上/ q( l' F; v: h2 i& L
执行正确的结果返回 K! Q/ z3 c4 ]6 M$ e5 ~
返回 HTTP 200 和交易ID号
{
'transaction_id' : "..." " {' y9 u7 B( G' J9 _3 \
}5 A0 N# F- z# ] E
执行错误的结果返回,一般为400错误(参数错误)或者500错误" n, t) |, l% D$ K8 z( N. B; v
HTTP/1.1 500 Internal Server Error
Content-Length: 1466$ o; A" h% E5 O7 b! x* G0 R7 L
...error message..
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":[]}'+ Q- @# k2 r7 V" I" z$ p+ X n
此示例模拟一个转账交易。 refBlockNum和refBlockPrefix使用的前例block查询的结果
成为第一个吐槽的人