EOS纯技术上手学习
罗宾虚汉
发表于 2022-11-4 20:37:25
168
0
0
主要内容:, m/ u/ O) ?8 d5 r7 A7 k6 `
EOS Docker快速部署
0 I3 O0 r/ A: U+ A$ h$ Z6 j
EOSC使用! X, H6 Y/ a/ T# j' [
0 p. b0 T# o" s7 X) N
创建钱包
将私钥导入钱包* V0 |! r+ p: ^! \3 _$ B
锁定和解锁钱包) a- I/ V+ d% w' s6 f: f2 Q
' r/ a, b- e1 s0 H" w
创建账户
内置转账
查询交易历史" W; V1 c. V5 C) C
测试合约 - currency" \- s y2 G L/ w1 r0 S7 t
调用合约2 f9 ]* r) |- i
) v+ J3 C3 \& V8 A; Q7 W$ ?
查询合约
链接特定的节点
4 _! C# B- D; c/ M% I# t$ c) c
链接独立钱包服务( h& \' g" D6 c8 _" a$ a- M, A t
* {, L: [1 T& n% s
免签名验证
, j% z8 f+ o1 t2 Z
其他RPC调用
EOS Docker快速部署- V) H: `+ f0 A- H" U
构建eos镜像
git clone https://github.com/EOSIO/eos.git --recursive" U( h. t1 p, J0 l
cd eos0 Z6 h/ M, X6 H# m/ n
cp genesis.json Docker 9 l6 p0 `# [+ z9 A% n% G5 k1 J
docker build -t eosio/eos -f Docker/Dockerfile .
启动容器- q& o$ x z9 r+ `7 M8 d% H* o
sudo rm -rf /data/store/eos # options ( r" K: F3 F$ j
sudo mkdir -p /data/store/eos
docker-compose -f Docker/docker-compose.yml up1 W6 ^* n5 G' j. u. Q9 d# W
如果 docker-compose 启动有报错, 可能需要给文件存储目录赋予用户读写权限
sudo chown -R SYSTEM_USER /data/store/eos
验证,查询区块链状态信息/ b- l0 H% b7 }
curl http://127.0.0.1:8888/v1/chain/get_info5 m/ T) a# V2 \4 ^/ w
如果想使用多节点环境,可使用yml文件启动' o* t D5 ~/ H5 ^( p) p
version: "2"" O- s, L$ ]+ Z% f
services:* v! E2 c: f5 G! P9 R5 W2 o
node1:
image: eosio/eos 2 C; b3 m' u: y) j
ports: j. k+ N, h" j1 A: }' W/ b
- "8888:8888") c7 W- v8 o. Z% f
- "9876:9876"
volumes:
- ./node1/data:/opt/eos/bin/data-dir" _; k2 I2 n3 ?5 `
node2:
image: eosio/eos
ports:
- "8889:8889"! _+ c. c. J. T( l
- "9877:9877") K6 @" l6 G" g
volumes:
- ./node2/data:/opt/eos/bin/data-dir2 K% T' h" t# V$ Z; R' Z3 `1 g
depends_on:
- "node1"
EOSC使用
EOSC是EOS的核心进程EOSD对外暴露的RESTAPI命令行工具。EOSC的使用会利用到一些内置插件,插件在EOSD的配置文件config.ini中进行设置,如与链的交互需要使用’plugin = eos::chain_api_plugin’。为了签署交易并发送到区块链上,需要使用‘plugin = eos::wallet_api_plugin’。为了查询交易和历史记录,需要使用’eos::account_history_api_plugin’ 。4 D2 D% R. f' N3 w
# Plugin(s) to enable, may be specified multiple times
plugin =
eos::producer_plugin
plugin =
eos::chain_api_plugin
plugin =% x7 p$ @8 c& u
eos::wallet_api_plugin
plugin =
eos::account_history_api_plugin. k) a( ?- K4 R" Y) c3 K
启动eosd后,可以使用EOSC查询当前的区块链状态
docker exec docker_node1_1 eosc get info! v6 ?8 Z. r6 T( ~7 l0 M
{7 L4 ?2 y& `$ |3 e& \9 k( M7 y
"head_block_num": 23449,
"last_irreversible_block_num": 23432,( q' ?+ M# h: N
"head_block_id": "00005b996cc85962b28537c3d72696a012d1071638f5e4bad1809cf9afc9abb6",* o5 o% \9 O) d( X$ D& @) H( ]
"head_block_time": "2017-09-29T01:53:33",5 R$ i, S& M( d2 `3 s: K: h4 x
"head_block_producer": "initi",# i* [. N0 G6 B; ]' c7 i
"recent_slots": "1111111111111111111111111111111111111111111111111111111111111111",1 B! N+ i, q# n# E4 W
"participation_rate": "1.00000000000000000"0 g/ u s7 ` f) Y a# R1 j
}( _2 z* I" W# r+ e- q; F8 f% V* w& v, r
创建钱包7 o/ F2 \" q* Z
任何发送到区块链的交易都需要由所有者持有的私钥进行签名。首先,我们需要一个钱包来储存和管理私钥,使用EOSC命令创建一个钱包。
docker exec docker_node1_1 eosc wallet create1 v+ e% C8 }& ~' U, J4 n
Creating wallet: default9 b$ {, @; J3 C6 L8 K
Save password to use in the future to unlock this wallet.6 x# w6 x* v- M7 H3 {6 f
Without password imported keys will not be retrievable.7 g* @0 }$ k* M0 n/ l7 K+ M. t# f# v) S
"PW5JXSxkHqNEwRKCpG2JUTLqkR8SNCBXofkAwaFDLwQkNdqaSXwC8"
命令执行完成,会在eos-walletd中创建一个名为‘default’的钱包,并返回钱包密码。
这时候可以查看钱包列表* N: S: p, O& T
docker exec docker_node1_1 eosc wallet list
Wallets:
[( }* `: N: Y; [" P
"default *"
]
如果你没有指定钱包名称,默认都操作的是‘default’钱包. Y. e. Z- B5 Q* z5 p
将私钥导入钱包
如果你想授权某个钱包可以由某人来管理和控制,需要导入该授权者的私钥。
docker exec docker_node1_1 eosc wallet import 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD39 I6 |% y5 y ~9 G6 [! i) O9 u
imported private key for:/ n9 Y# ^# B) ~( p9 d
EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV' Y1 D! a, d, J0 Z/ d$ u0 P
导入后,可以查询钱包已经导入的私钥和对应的公钥
docker exec docker_node1_1 eosc wallet keys& y1 P6 y$ z7 V, D% g
[[/ @2 [; D: T4 O- U- U' ^/ E
"EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV",
"5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3"$ G6 y3 V+ d; Z" \9 L3 p
]! g7 w# |9 \0 J
], w6 X# p7 w b$ W8 |* D8 q
锁定和解锁钱包
日常使用,为了保证私钥安全,可临时锁定钱包,锁定后查看钱包列表是不可见的
docker exec docker_node1_1 eosc wallet lock
Locked: 'default'3 X; f8 K: T' s7 l* G% N; f
当想要使用时,可以用创建钱包时生成的密码来解锁钱包3 z" P1 ?6 F2 V* M4 x( Y! f
docker exec docker_node1_1 eosc wallet unlock --password PW5KVWrn81Y8PLAb52gr2FyXCanVavcrj9d5TC9C3yKhqq1PJYRPk- \& J' `0 x5 D( x4 | u
Unlocked: 'default'! e, N, n8 B- w& c8 X
解锁后,可以在列表重新看到default钱包了
docker exec docker_node1_1 eosc wallet list
Wallets: 5 I6 x; |" m; J' d
[
"default *"' I* I$ g% \/ ?: x# a- a, Z( i
]
创建账户: P+ Q8 K+ {; D' l
创建账户需要有两组密钥:owner和active。EOS使用EOSC工具来创建密钥对
1)owner key.
Private key:5JRc8XxvodWey4StZ2zzkUhCQhDaHvGMkABtfHzQR2ie4qaUFJ71 x' ^) S: R2 n! ^; t7 j/ C
Public key: EOS5mFEdAzxvMkHLQXt2v4naUjnBrPGmzMUCikymqhSR6m7QLGSTB5 \0 O6 k y( W, h0 Z n1 V
2)active key
Private key:5KNzFCbToz2a9Hztz9Qen5cyJcM3x5Wpq4GFiTYZgGhzntXdmYo) u, }1 k) ] a5 w5 _+ ~8 a& U
Public key: EOS5EdsvESpibWLJxupTqod1nswJnbiXQZuUcLiAWEEsqcZskymeB
EOSC不会保存生成的私钥8 ]! |8 y: ^3 r0 ^1 H* K) T% E
因为后续测试智能合约需要,我们创建一个名为currency的账号。目前这个版本,所有的账户都需要用已有账户来创建,所以我们用inita账户的owener key和active key来创建currency。 为了使inita获得发送交易的权限,需要先导入inita的私钥到钱包。(参见私钥导入钱包的步骤)0 T* u# v# F+ t+ W
docker exec docker_node1_1 eosc create account inita currency EOS6NpEqWi177VKQkuJQL9V6Y3LqAAp9C2j" [7 V4 ] T! M* h/ n
执行成功,会输出一串json的交易信息,打印账户创建相关内容- e' I( K: R" A( ?/ ?$ u
我们可以查询inita可以创建了哪些用户; g3 {; g* ]4 V8 A; E
docker exec docker_node1_1 eosc get servants inita
{8 n0 y+ O& X( R1 H$ w6 E: \
"controlled_accounts": [
"currency"
], n8 Q9 T3 {( C6 L
}
内置转账
创建账户之后,可以查看当前账户的状态,可以看到创建的测试账号没有余额,这样不少功能无法测试,我们需要试着给创建账户添加一些余额+ L. W6 H* t2 S# R4 ~% z" t |
docker exec docker_node1_1 eosc get account currency* R; E5 ^) E- F" S& ?% v2 [
{( C) S! d$ Q J, N5 o
"name": "currency",1 j; \6 o: K! q, K1 s
"eos_balance": "0.0000 EOS",
"staked_balance": "0.0001 EOS",
"unstaking_balance": "0.0000 EOS",
"last_unstaking_time": "1969-12-31T23:59:59",
"permissions": [{) B7 e, ^ H8 Q2 B- P" p! O
"name": "active",! a" [4 z8 D, c9 }% E& ~" y
"parent": "owner",
"required_auth": {
"threshold": 1,
"keys": [{
"key": "EOS8ff42NMpJUybVj3nwUSnPpc3mMysKxyE4HVJy1E5o3fQv7knWf",& x% f8 H5 G9 N& V- m
"weight": 1- U/ a* G' M& M& ^, o
}
],
"accounts": []
}: C" i H0 q. n
},{
"name": "owner",. g7 m/ O2 E8 b
"parent": "owner",
"required_auth": {7 u0 _- E, q; R$ l% B, {
"threshold": 1,
"keys": [{( ~3 \8 o5 w/ l. V5 X- @
"key": "EOS5fQ4saiHV426EQ7AKrGoD2AVMBYe77bnGSq42JjXBUfipv7o3E",
"weight": 17 |" ]* C6 p. z, }/ Z& S
}! H+ k" L; ~' r7 V6 x& J
],
"accounts": []
}) |& l/ t/ e9 f& P) f. k6 A
}0 l9 Q/ D, A. d5 A
]& N* }/ T& G& ]( R
}
保存全网余额的创世账号是eos,查询余额状态
docker exec docker_node1_1 eosc get account eos
{
"name": "eos",
"eos_balance": "69000000.0000 EOS",
"staked_balance": "0.0000 EOS",
"unstaking_balance": "0.0000 EOS",! x1 f3 A. z8 d4 A& v- g
"last_unstaking_time": "1969-12-31T23:59:59",8 X0 I" t1 @1 @# a& G
"permissions": [{
"name": "active",* S0 T1 N7 T+ ?" R5 Q
"parent": "owner",) J' i y$ }9 a' u+ L* h$ K0 {
"required_auth": {3 Q n+ E; z% N
"threshold": 1,
"keys": [],2 G+ M1 w5 V' C2 z3 |/ Z* q' o1 N
"accounts": []7 e! E; y# b: s( p5 l( s
}
},{2 b: C1 {' c* O3 _2 O* K0 a
"name": "owner",
"parent": "owner",! b6 f0 p' z% p2 ^" i1 S* U$ Q: y
"required_auth": {
"threshold": 1,* t) e% E; w+ ]
"keys": [],
"accounts": []
}
}
]. Y/ @9 j4 F f& r+ n
}
我们可以通过创世块定义的创世账户使用EOSC给当前创建的账户转移余额+ p! u+ f1 N0 F2 j2 q7 R3 p3 r5 ^
docker exec docker_node1_1 eosc transfer inita currency 100000000* b' Z3 i1 j, H; u6 Y V
{
"transaction_id": "59575b8caf08eac7c00eb7483c048f12d0e7abf1ede839c3b2ed41dc6c5c7c5f",
"processed": {
"refBlockNum": 24199,
"refBlockPrefix": 1485651173,
"expiration": "2017-09-29T02:31:03",$ Q/ k- O1 x" k' v4 P
"scope": [
"currency",
"inita": i, q2 u, N' b
],% x1 g8 C% t* j3 C( f+ C0 u
"signatures": [0 k2 n: N c, h) T
"1f14229bdd4bfb927021bf96ff0651c8b0fa5666e9f5cf423a0270a1b91f2d2f690b573e179d8475ce2c6b160f5cd5507d58a44f8f6cf536348584efa8dd62ade0" L) Q7 C$ G8 P" [* e4 w
],4 ]! {$ C+ q3 ]+ g; Y7 T c" o
"messages": [{4 r+ B& `+ y9 ^" E) i$ W& w
"code": "eos",
"type": "transfer",
"authorization": [{9 H" I/ b; k" F0 ^ m! I0 l
"account": "inita",
"permission": "active"; h7 f4 K) W5 d* y! p+ [/ K
}
],, v5 _" X) w8 l3 J
"data": {
"from": "inita",7 u# U4 d$ H0 q' X! T, Q* c. m
"to": "currency",
"amount": 100000000, ~6 _2 X+ ^" W5 c
"memo": ""
},
"hex_data": "000000000093dd740000001e4d75af4600e1f5050000000000"
}! z8 M5 h5 J# k; C
],; }! p1 t2 ^" K: ^
"output": [{+ h% S6 z, { Z6 M4 T+ d+ j
"notify": [{6 U6 f5 B' m2 \8 Q. r: I
"name": "currency",. E# s& l" c @+ F/ e! S
"output": {. V1 g3 v# k) D5 p! K3 J( ]8 L& h
"notify": [],
"deferred_transactions": []$ m# d- e0 ~) O4 t \$ W# e
}
},{
"name": "inita",, x6 T! C) H" O6 B
"output": {
"notify": [],
"deferred_transactions": []' c, G) n& ~7 s/ m% h, b* J
}
}
],
"deferred_transactions": []
}. w/ H+ o* M0 ~% r6 X
]9 g' X7 n. o0 w) _6 [
}
}5 F, b1 l+ ?) k5 ^
再通过执行get account 命令,验证余额已经成功转移到创建的账户下
查询交易历史3 d8 I( H& S5 m; s2 g5 i% j
查询交易历史会使用到插件account_history_api_plugin,我们已经在config.ini中定义
docker exec docker_node1_1 eosc get transaction / ? j- ]; N |! D
如果需要查询一个特定账户最近一次的交易记录" Z: T, k5 C0 r& O1 Y/ Y
docker exec docker_node1_1 eosc get transaction inita
创建智能合约4 F, S4 H2 c, W( E3 w
官方提供了一个示例合约currency,我们依然使用EOSC来创建并部署智能合约,合约代码位置contracts/currency。
1)为合约创建一个所有者账户。前文已经创建了currency账户
2)检查区块链上有无同名合约
docker exec docker_node1_1 eosc get code currency
code hash: 0000000000000000000000000000000000000000000000000000000000000000
3)为了获得部署权限(发送交易请求)需要将currency的active key导入到钱包中1 y" {4 k4 T; Q/ o& ~; I
4)部署合约(.wast后缀文件)和他的abi(.abi后缀文件)2 t% F$ K* `, |3 }" K
docker exec docker_node1_1 eosc set contract currency ../../contracts/currency/currency.wast ../../contracts/currency/currency.abi
Reading WAST...8 i( @5 {3 T0 y* J+ Y& h; h4 q
Assembling WASM...6 R) t* q2 s( C; {
Publishing contract...- ~, F) g' b' C; E: b. E; g$ L
屏幕打印部署成功相关的信息,并查询合约hash L6 T3 Q) g; ~9 G5 q) N
docker exec docker_node1_1 eosc get code currency
code hash: c4023f74b3c7a3321d1641e4111b13584078fa7265c6ab12e1c19ff7ee800faf, U: }( a; O1 }8 m7 \. ^8 z) R
调用合约 m; }0 \% m* j* @3 J @
在合约部署到区块链上之后,所有的currency余额会分配给我们创建的currency账户。我们可以调用合约测试做一些转账交易。5 Q2 Q/ K+ [0 X" w1 E) x9 @7 `1 ?
为了更好了解区块链合约的调用方式,我们可以通过.abi查看可以执行的操作列表和消息结构。
docker exec docker_node1_1 eosc get code -a currency.abi currency
code hash: c4023f74b3c7a3321d1641e4111b13584078fa7265c6ab12e1c19ff7ee800faf
saving abi to currency.abi% ^. B* O$ O+ u- U$ h8 J& V
cat currency.abi #查看
{
"types": [{- q5 |# x$ f. ]: G h# W
"newTypeName": "AccountName",+ z( T! n0 w. J) ^2 A) C3 X
"type": "Name"
}: M5 I; f' E8 [/ V
],
"structs": [{" h! h- [4 d( O7 l. {' H4 `( k3 N5 x
"name": "transfer",
"base": "",$ G s1 H( F# f! ?
"fields": {- E; i& ~( W6 t: G( }
"from": "AccountName",
"to": "AccountName",
"amount": "UInt64"
}; u/ {, l5 v9 N% w0 h6 w9 a: _& D
},{
"name": "account",' e2 u; x3 r3 d8 f* p7 Q& X
"base": "",
"fields": {
"account": "Name",6 T1 c! K8 t/ ^% N Y
"balance": "UInt64"
}
}* g6 |; c9 X n: |
],# W3 P( j$ u9 m! z
"actions": [{9 D/ e: W+ ~ ]: ~
"action": "transfer",
"type": "transfer"
}6 ` g; T+ M" a0 u9 J; |1 F+ Y
],7 H6 w' q, G' [ f4 W
"tables": [{9 ~+ B8 o1 W5 s9 l
"table": "account",% t7 @3 U/ T8 b- v9 @
"type": "account",. ~2 {% v! Z9 i3 g# i) }
"indextype": "i64",0 s" m0 Z) i+ r) g9 F
"keynames" : ["account"],! R# r- g0 u- w" @' h
"keytypes" : ["Name"]
}& b* v- }! ^- H- r- u4 ]( o
]
}$ C" g9 x. b B# x" R
通过上面的abi我们可以看到currency合约可以执行transfer操作,消息格式为from,to和amount。我们调用合约从currency账户转移50个余额到inita账户: @& w3 Q9 g& [3 g9 E9 P0 L6 O" [
docker exec docker_node1_1 eosc push message currency transfer '{"from":"currency","to":"inita","amount":50}' --scop+ S; b# Q2 J; ^) f( j" Q V: L
执行完成,我们查询余额验证结果
docker exec docker_node1_1 eosc get table inita currency account
{: C4 r) F! C+ v
"rows": [{
"account": "account",3 r+ ?! E( Y! N7 N1 z
"balance": 50 7 } p# S3 i/ M( Y
}5 Z( ^5 t. x, b9 O
],' R9 W: z) l& I; a
"more": false$ B- W* Q/ d" ?/ M% h1 @, \
}
docker exec docker_node1_1 eosc get table currency currency account; N( x% ?' ?' K" {8 L# M/ Q
{
"rows": [{ ~9 q$ |8 P: \" P7 R, N7 C0 S5 [
"account": "account",
"balance": 999999950
}4 C, E/ Y- p; N
],' ? l% K. ]% C- p
"more": false
}
余额不足的账户尝试转账,会提示失败( ~. W8 a0 d+ Y1 J8 J5 ?
docker exec docker_node1_1 eosc push message currency transfer '{"from":"tester","to":"inita","amount":50}'-S inita -S tester -p tester@active) U4 h8 d( q8 n
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' }4 K; \- s9 D
status_code == 200: Error : 10 assert_exception: Assert Exception p( w6 G2 }% ?
test: assertion failed: integer underflow subtracting token balance
{"s":"integer underflow subtracting token balance","ptr":176} thread-1 wasm_interface.cpp:248 assertnonei32i32 [...snipped...]
查询合约
如上文验证步骤,在调用完合约后,可以通过查询表来验证每个帐户持有的余额。9 x* S5 C7 z8 q7 r0 G/ ^+ n1 G
docker exec docker_node1_1 eosc get table currency currency account
连接特定节点1 w6 u6 L0 B1 U6 G' ~
默认情况下,EOSC连接本地端口8888的节点。可以通过指定主机地址和端口来连接其他EOSD节点。同样的,钱包服务也可以指定特定的主机地址和端口。 U; M+ L* g. ^- P7 x" t
docker exec docker_node1_1 eosc --host --port 3 ]) Q+ D! M" g0 S( T5 @
链接独立钱包服务: t ]- L9 r1 T& A( E
除了使用EOSD内置的钱包服务,也可以独立部署钱包服务
docker exec docker_node1_1 eos-walletd --http-server-endpoint host:port8 L" S9 L U J8 T& J
调用独立钱包服务需要添加如下选项
docker exec docker_node1_1 eosc --wallet-host --wallet-port' s; u- J/ v# P, `4 S) i
免签名验证3 T1 u7 i' n% j! X3 C
开发者如果需要快速测试功能,可以跳过节点签名的步骤,这样可以解耦密码学的问题而关注应用功能9 f% u- c3 _# T, A7 Z( o
启动时使用特定参数, O1 d6 ]# x8 c! I. X* D
eosd --skip-transaction-signatures( [1 H5 ^4 q6 z- m/ Q. g7 k. @
EOSC调用时添加-s 选项
docker exec docker_node1_1 eosc -s
其他RPC调用# Y. G$ U* z; t
EOSD RPC 包含通过HTTP RPC与eosd和注册其上的插件进行调用的方式.
1)区块链API 配置
想要查询eosd信息需要启用plugin = eos::chain_api_plugin插件并添加至config.ini中$ t! v2 D8 U/ q( F9 H; z7 D0 l+ {
2)get_info接口用于查询区块链的基础信息
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"}
get_block接口用于查询区块相关信息! g/ \2 D6 _- E7 m7 M
curl http://localhost:8888/v1/chain/get_block -X POST -d '{"block_num_or_id":5}'! G; g/ q( S0 o1 U* p
curl http://localhost:8888/v1/chain/get_block -X POST -d '{"block_num_or_id":0000000445a9f27898383fd7de32835d5d6a978cc14ce40d9f327b5329de796b}'4 q/ A; @" ~& j) _& k' J. b
返回结果如下:, K: z4 j4 U" C8 B
{"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接口,调用合约交易- P# M9 g8 G0 P
该调用为JSON格式并会将结果更新到区块链上
执行正确的结果返回: P* U/ ]. M/ }% I) `
返回 HTTP 200 和交易ID号
{
'transaction_id' : "..."
}" d z. z! ]4 ^9 }% _- P& h! F
执行错误的结果返回,一般为400错误(参数错误)或者500错误/ l2 v$ ^) e5 [2 r5 q% W
HTTP/1.1 500 Internal Server Error) E! M3 }9 {% O7 r, a
Content-Length: 14665 f b) l% i) D# J7 p( T+ y
...error message..
push_transaction 调用方法8 W r3 |: s8 ~! H6 {- e% ^- ~
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查询的结果
成为第一个吐槽的人