Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

EOS纯技术上手学习

罗宾虚汉
121 0 0
EOS.IO 已发布黎明V1.0版本。EOS.IO 黎明V1.0版本是第一个预发布的 EOS.IO SDK(软件开发工具包)。EOS.IO黎明V1.0版本可以让我们体验下EOS一部分区块链特性和简单上手开发、测试。本篇主要是一个快速的review目前EOS黎明V1.0版本的功能上手。7 b' Z) V% c, [  P/ H' w
主要内容:
* ?6 M. s) v: J5 M$ V+ [) B
' ^  B- v( ~$ P# I+ Q( O2 C9 n6 @EOS Docker快速部署* O3 t) E( ~4 [! G6 Q

9 n& P1 e# c  u; m# C9 eEOSC使用
- S$ Y: u2 j3 V
" N. \- L+ d2 b0 t& h6 ?& e创建钱包! ]. 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
创建账户
% {  z3 _+ q$ r6 b$ M2 m- ?0 `0 d/ ?( I2 F( G
内置转账
" ]! T- s5 D% x
' f! K& ?4 ]  T, J7 v8 l: Q4 P查询交易历史) a& V5 z! W1 F3 x2 a% x

9 q, d/ n5 @8 |0 M8 k测试合约 - currency
" J5 z3 a' o1 y) u, q0 p0 r$ w- u$ A0 e: L7 u) `0 N' E; Y/ n
调用合约
0 v$ N! c( o+ q# K4 h7 ]' v$ b& e3 x! ?) {3 [" L
查询合约
5 \+ ?% t1 t" O" W3 q3 a& F3 W. 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调用
8 c$ H- R, j4 l- D4 \+ R- B
+ m% Q9 j) K. L9 ?
# Z5 P$ l6 R8 t) q  u& h1 K$ v# ?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
/ r/ |; X' H/ Z( ^cd eos6 ^8 t" k, x+ A' ]1 z
cp genesis.json Docker
; B" j: b) W  Udocker build -t eosio/eos -f Docker/Dockerfile ., y  V: g+ J' J1 n# j- m/ e$ s
启动容器
; M( b- p3 }. `# e/ c: V; S/ w& P1 ysudo rm -rf /data/store/eos # options
6 I0 ?6 L) Q# isudo mkdir -p /data/store/eos
, ^( n0 W5 P  h) Q8 x( }, rdocker-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
0 b; h8 f4 z9 Y2 D2 I2 U/ B" i验证,查询区块链状态信息
' v, h2 v/ o# [' U4 }' x( E9 D8 {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:
# O3 `. A1 [! x% [    - "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:
6 m/ M( j2 ]4 ^    - "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"
% c) p6 G+ F0 `0 n# g6 ]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’ 。
  y$ D9 Q  ^: a" w0 Z# Plugin(s) to enable, may be specified multiple times
5 O* D! ?5 T2 j( w3 z7 N% Lplugin =
' E& {$ u1 _! Q; {eos::producer_plugin
4 Y  C8 @- v, g) Oplugin =
) V5 B3 @% Q. N6 J7 F2 weos::chain_api_plugin* D  j  ^. I; x( q
plugin =
5 J9 Z( Q7 Y% e" X) Z, oeos::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,
0 n* w/ k- U& d& q- \9 k# g  "last_irreversible_block_num": 23432,
( K; I* J, n- @, ^! L  "head_block_id": "00005b996cc85962b28537c3d72696a012d1071638f5e4bad1809cf9afc9abb6",
+ f! f5 N9 d- u8 t3 o# j  "head_block_time": "2017-09-29T01:53:33",
* w$ R: {' e& E3 o" C# B2 i  "head_block_producer": "initi",7 L1 _2 b8 ^+ @2 x: Y/ b8 ]- N
  "recent_slots": "1111111111111111111111111111111111111111111111111111111111111111",
3 H  y5 @# I) e4 B6 L2 ?) r5 t" O2 E  "participation_rate": "1.00000000000000000"
" M$ y6 U* H( g}' ]# T8 q! n5 c7 S7 l
创建钱包
) E- I; R, H3 \  G* r2 k0 ]8 {2 I7 p任何发送到区块链的交易都需要由所有者持有的私钥进行签名。首先,我们需要一个钱包来储存和管理私钥,使用EOSC命令创建一个钱包。
6 y, ]: T( {2 V& u3 j0 Idocker exec docker_node1_1 eosc wallet create
2 e9 g8 m! A& e. o3 rCreating 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.
& q, ~$ W3 X. R& V% n"PW5JXSxkHqNEwRKCpG2JUTLqkR8SNCBXofkAwaFDLwQkNdqaSXwC8"( a$ V7 i( F* n4 e0 H7 O* N
命令执行完成,会在eos-walletd中创建一个名为‘default’的钱包,并返回钱包密码。
$ `( R1 Z6 {/ E* j7 O, x/ O$ y这时候可以查看钱包列表: k$ L8 \4 }0 f% B
docker exec docker_node1_1 eosc wallet list
4 J$ P5 ]1 Q, o  j; V0 @# OWallets:
  d( X8 Y; O5 s* E- _[' X1 z" p$ D0 r
  "default *"6 _" B9 f& b8 n
]$ w2 P+ B  E. i' R; j' l
如果你没有指定钱包名称,默认都操作的是‘default’钱包
+ v) ^) q8 v* M, m将私钥导入钱包* w* g5 ^/ R8 \  [, q/ s
如果你想授权某个钱包可以由某人来管理和控制,需要导入该授权者的私钥。
$ j/ k; N  X2 |( H% ^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
[[
2 U4 R7 g* i: x) f+ g  h"EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV",
$ e! l% D" n/ k+ n% q3 d+ A, q" T"5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3"
5 R# ~4 }7 v) [9 F]
* z9 _2 D6 M* M7 O1 b# h* t! A" p, D]
1 p3 T  g9 I* @; C锁定和解锁钱包& 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
9 n7 q% g' d' k2 O2 Z* `$ }, OLocked: 'default'4 R/ \( P! h6 R% s
当想要使用时,可以用创建钱包时生成的密码来解锁钱包
9 u+ m1 C. ~& w: u9 c0 _/ X" \& T7 @docker exec docker_node1_1 eosc wallet unlock --password PW5KVWrn81Y8PLAb52gr2FyXCanVavcrj9d5TC9C3yKhqq1PJYRPk  I& _6 H/ U9 O8 V# x: B+ k1 `
Unlocked: 'default'
6 V0 Y' D6 i* T% ?- R: J解锁后,可以在列表重新看到default钱包了
# K% u5 f: ?! Z2 a4 Gdocker exec docker_node1_1 eosc wallet list
9 s2 e1 Y2 F% M$ pWallets: : @; e2 X  i- i4 ~  E. ?2 _0 I; n
[
, G$ N# D# T) k( D  "default *"
0 I7 s( p" Z2 Z]
+ P' G5 ?4 G: l6 @+ q$ x2 n+ Q) x创建账户2 _! S# I1 m: d. j* W
创建账户需要有两组密钥:owner和active。EOS使用EOSC工具来创建密钥对
1 ~- n$ N8 o* I+ M1)owner key.
6 @6 q+ ?# E1 l% T2 J/ F3 d  [+ WPrivate key:5JRc8XxvodWey4StZ2zzkUhCQhDaHvGMkABtfHzQR2ie4qaUFJ7
7 i' [7 {9 V) X4 n* b& H& u3 l* ePublic key: EOS5mFEdAzxvMkHLQXt2v4naUjnBrPGmzMUCikymqhSR6m7QLGSTB
0 E1 M% ]! b3 Z( W, _2)active key
6 i: n) B: B" e* S" _Private key:5KNzFCbToz2a9Hztz9Qen5cyJcM3x5Wpq4GFiTYZgGhzntXdmYo
: q( X) }7 P6 N* T  K9 D: k) YPublic key: EOS5EdsvESpibWLJxupTqod1nswJnbiXQZuUcLiAWEEsqcZskymeB
0 @6 A* m8 M* ^2 c/ o# cEOSC不会保存生成的私钥# 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
7 z+ B9 L1 Q( s- k4 s" v5 a执行成功,会输出一串json的交易信息,打印账户创建相关内容( E/ x* I; x0 p1 J, p& V
我们可以查询inita可以创建了哪些用户
  n5 [+ M2 w, @2 E4 a: Edocker exec docker_node1_1 eosc get servants inita
: C; ~8 ~: W8 I% M{
+ n5 n$ l) a1 d, L( J/ X- U"controlled_accounts": [- r: t" H# ^0 J4 l& O$ o
"currency"
/ U$ I2 {! ^( p]0 Q& [9 t1 K8 V
}- p2 i; U, X4 N; f: k
内置转账
% \0 p" D, J( m* G5 ?: c创建账户之后,可以查看当前账户的状态,可以看到创建的测试账号没有余额,这样不少功能无法测试,我们需要试着给创建账户添加一些余额
. r9 F) ~' I! d' o9 M0 G* Qdocker 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",
5 c* O4 Y. N- Q1 c  "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",
0 @% X0 f) R& T* f  "last_unstaking_time": "1969-12-31T23:59:59",3 H5 m+ _7 D9 @3 V& V4 z5 X
  "permissions": [{
5 J2 g5 A: n8 q8 z( C' f5 @# e0 p      "name": "active",- }# C1 G: X8 U+ N4 a
      "parent": "owner",
5 x% @) q$ h: k! y7 Z6 }# {      "required_auth": {  T8 d0 F( N2 U) r
        "threshold": 1,
# k# p. Y0 K3 H+ j% x2 J& W        "keys": [{
5 y. t$ K: y/ \" w! Y/ y            "key": "EOS8ff42NMpJUybVj3nwUSnPpc3mMysKxyE4HVJy1E5o3fQv7knWf",* w+ }$ |% {7 s. a$ M
            "weight": 1
& m. X& W0 ]3 [4 Q( B& \          }
3 ]/ r2 J1 V, Z- h6 l, i        ],
8 i3 F6 {8 W) A$ m        "accounts": []
% E+ q$ b% F) o- c% ]      }
: {$ z: Y* ]) y1 ]3 g7 k    },{
9 K7 M6 E6 g: _# p0 q      "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,
( U' z3 k. \9 I+ c; Z2 ~7 h& w8 `3 @        "keys": [{4 s& s. Y7 m, i: U
            "key": "EOS5fQ4saiHV426EQ7AKrGoD2AVMBYe77bnGSq42JjXBUfipv7o3E",4 |) j# p+ E7 W$ x2 R
            "weight": 1
3 V" {! d# r! W( T" j" p          }
5 e' f1 H! b2 y3 X        ],  @0 j! _% R, f0 u/ t# {
        "accounts": []
, T$ [1 a4 W- q' P- Y      }
! `& L( K; a* G7 b0 `. M/ Z    }
$ c" V- a1 Y, l" [  ]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
* C$ s2 A8 `" i2 D) O( x! e) R{
/ b" E) L' C( ?. {  "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",
8 `. c4 H% L5 k% R- t  "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": {
# m" S  r6 q! h  F, w! R, z- r        "threshold": 1,4 s2 N6 l  |* {- W# l3 h
        "keys": [],
/ w  x% x# F! f, i        "accounts": []
' d; z  i$ {* W, d      }
' D# B' K! o1 l4 m2 L    },{: ?) k$ a* }/ I
      "name": "owner",
( i. D3 L. y! P: @3 [1 Q% ]5 \: ^      "parent": "owner",
/ L' s, ]( e" e# V- a      "required_auth": {
& e9 j+ q: n& ?4 r2 k  D        "threshold": 1,- d  v1 Y; {( W1 M
        "keys": [],
9 g# [% v6 C0 `- Z- W* i        "accounts": []
# i+ G. S3 `. a' U$ a      }! ^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
{
. V1 i1 o3 E& U+ p" o  "transaction_id": "59575b8caf08eac7c00eb7483c048f12d0e7abf1ede839c3b2ed41dc6c5c7c5f",2 Y" Q- t" _1 ?1 M) J
  "processed": {
& a% {3 I) F  o$ `$ ]; q3 c    "refBlockNum": 24199,
' m9 H; q/ U# B3 J    "refBlockPrefix": 1485651173,
2 M; ?) X6 k' N/ L/ q8 J: f) O    "expiration": "2017-09-29T02:31:03",
3 q& x& T, u1 D5 D    "scope": [
0 p. i0 v- j* r' c      "currency",
  P# v+ S( f! o1 u( q* B      "inita"8 C) [: x% E& B9 x1 W
    ],
: I! M2 _& S) A! R4 \+ |9 E    "signatures": [3 |, V. J! _6 x/ b5 [0 v
      "1f14229bdd4bfb927021bf96ff0651c8b0fa5666e9f5cf423a0270a1b91f2d2f690b573e179d8475ce2c6b160f5cd5507d58a44f8f6cf536348584efa8dd62ade0"
; o- k& M$ y) m( f* P4 A    ],; l& K2 `: {' G5 b4 P
    "messages": [{+ ?1 b) o; Z, E; v. E
        "code": "eos",
5 H- k& T/ r4 u        "type": "transfer",7 K6 o& k% D" T, n
        "authorization": [{
2 f4 a, ]& I7 i1 Y            "account": "inita",
1 \7 D6 ?0 l7 c            "permission": "active"7 k  c9 O- p1 _" }
          }) i2 t4 X; t* f, x: G0 y$ t
        ],
6 ~# ]/ Y9 P) q3 C* v- _5 I        "data": {$ ?8 e3 R" \1 V* y+ j, h$ b3 s9 X
          "from": "inita",
6 \( ]8 q+ s2 N          "to": "currency",4 I5 R: n# {* N1 _/ g: f: K
          "amount": 100000000,
4 V; {2 P& @$ H6 }0 r* \          "memo": ""4 s# k1 V- f% a1 e
        },
$ H& b) F: }3 P  W, A        "hex_data": "000000000093dd740000001e4d75af4600e1f5050000000000"  N) t5 `; d& _+ A( `( D2 L  C8 i
      }
9 ~4 p# h! {& j: U    ],
$ V% s' `' K* O8 I4 Q    "output": [{
1 A9 m: a1 Y/ P7 b( o  Q3 Z        "notify": [{
0 T) A7 F: v6 D8 H4 U" w            "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
            }
- W3 }: y1 g, n+ r4 s9 X3 j. R          },{- i7 Y; X$ I; e" ~0 |; s  X: B
            "name": "inita",
# l- l2 t$ e2 m  p2 m            "output": {) y8 F0 ?5 z* A7 Q; D
              "notify": [],1 H$ E' Z; K6 _" V
              "deferred_transactions": []
) N# Y( N' K) b4 s            }) a6 ?4 b- k0 ?, g# k4 U; Z
          }
  ]" s3 s- e# U5 N  w- T. d4 D        ],) t9 b1 }- E. N5 l+ d9 c
        "deferred_transactions": []" g* Q1 w. E4 t; c' t( O
      }
: ^* |8 D. a2 r# S; X- o8 `    ]
; `# c6 C) ^2 r/ m2 J+ P& u. N/ e  }( 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
查询交易历史
& \% D0 X# {! i! q查询交易历史会使用到插件account_history_api_plugin,我们已经在config.ini中定义0 F1 [5 Q9 Z- n9 \
docker exec docker_node1_1 eosc get transaction
! n9 T" y1 C+ C$ T  J如果需要查询一个特定账户最近一次的交易记录
4 S3 K+ T& O  I8 U. Z4 Mdocker exec docker_node1_1 eosc get transaction inita
  _: s9 e) C# O% ^创建智能合约
/ F$ b  o' ^# Z' O6 D# x( Z官方提供了一个示例合约currency,我们依然使用EOSC来创建并部署智能合约,合约代码位置contracts/currency。
, E- k6 B' D/ |- [3 y1)为合约创建一个所有者账户。前文已经创建了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
# j- p4 H' k9 z* o- G$ Z3)为了获得部署权限(发送交易请求)需要将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...
. Y5 X9 y' l$ X1 [Assembling WASM.../ m* q! W6 Z1 `% ~& b
Publishing contract...
8 T- W- S$ I  ^) V屏幕打印部署成功相关的信息,并查询合约hash
: ]. N' p' s- H8 {  pdocker exec docker_node1_1 eosc get code currency
  ~( G6 m, D- zcode hash: c4023f74b3c7a3321d1641e4111b13584078fa7265c6ab12e1c19ff7ee800faf
, U, Q" D3 b5 P调用合约- z1 L- W4 Z2 ?8 o# L8 l! c7 d
在合约部署到区块链上之后,所有的currency余额会分配给我们创建的currency账户。我们可以调用合约测试做一些转账交易。
4 F6 o: r" \! O: r* l' E为了更好了解区块链合约的调用方式,我们可以通过.abi查看可以执行的操作列表和消息结构。
/ e( }. a0 C1 X' k, o+ Sdocker 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
/ p" k/ J. B) g4 @saving abi to currency.abi
) ?9 b( C6 M$ h5 e9 J. U6 [2 E8 Dcat 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"
& _2 j3 Y# @" k. Z" h5 a+ y/ d- `    }4 x% n! L; R4 _7 U+ a* u3 s
  ],
: ~0 R% n' y9 ^) @  "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",
2 N: x0 h# r. R, X        "to": "AccountName",
1 z. u+ S) |$ n% ^6 y4 D        "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",
9 Y$ C. S. F4 N$ w: x- a      "base": "",. L( {; A! `, X) S* j2 I
      "fields": {5 v. l: v. b" b9 L1 e* ^6 B- y! c
        "account": "Name",
1 U$ l$ x1 `" h3 G) U        "balance": "UInt64"
( I8 P/ v6 ?3 T, j9 u! I! u      }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",
$ s! B3 L4 Y5 u8 L3 u      "type": "transfer"8 Z  x+ S/ k6 G* H7 M9 b2 @; e
    }
: v7 _# P) [3 U! I" d" S& l  ],) e2 D( ]- {" ^3 r9 n5 N
  "tables": [{
6 q5 x! @2 s, a3 A8 A; ?      "table": "account",$ t: |' g) A, F' m4 s1 X  m( B1 r
      "type": "account",
# D8 E" r  r1 Y: q      "indextype": "i64",) G/ l* X# X  `' x
      "keynames" : ["account"],
: ?8 p' ?$ h4 Q) v      "keytypes" : ["Name"]
! B! W' Z3 k! p' Z; g- I  J; e$ ]    }
& ^) X/ P* G6 q3 E  ]
2 J) t" \7 b, \2 \- l$ ^}, 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 }
执行完成,我们查询余额验证结果
& B0 [& c/ k" B7 [: \2 c" T: u: m/ @docker exec docker_node1_1 eosc get table inita currency account4 {- r* ~9 R0 c- z, \7 u
{
0 t# r& ~0 K/ I% Y+ y' E, p0 B  "rows": [{
& v( {3 |" u  Q5 ]+ v7 G      "account": "account",' l  }1 V- j/ N5 E2 g5 q
      "balance": 50
5 Y; M; `- p9 g* @! e+ R  Y       }
* s% p. J# I* A6 _1 K( [    ],$ l9 _, l3 P+ \# z  }" P
  "more": false
) {2 w; \  x& L9 M}
: v# W) w! q; D; ~7 C3 B1 f+ Udocker exec docker_node1_1 eosc get table currency currency account$ B! A5 |6 ?/ y1 u" l. A* ^% Q$ W
{
9 D& {8 X8 _5 n4 x0 H5 E( _  "rows": [{1 E5 S1 t! @* ^6 f
      "account": "account",6 o+ q1 G0 f5 {
      "balance": 999999950" e) N: n# {9 v
    }
" l$ q0 j$ @. o. B3 G* i  ],+ b, L# t! {! W: n
  "more": false" }4 |- E0 I1 h) v) X; X
}
; a2 i* {% l$ s$ s  @- x余额不足的账户尝试转账,会提示失败
6 z) i3 `+ {1 J; S! H1 rdocker 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
3 A& H, u/ k7 s9 r{"s":"integer underflow subtracting token balance","ptr":176} thread-1 wasm_interface.cpp:248 assertnonei32i32 [...snipped...]; n# F  e- ^% {: u. f
查询合约
0 y2 L( {4 `5 P! r如上文验证步骤,在调用完合约后,可以通过查询表来验证每个帐户持有的余额。6 k; z1 q) b, ^4 ?
docker exec docker_node1_1 eosc get table currency currency account
- c& J% Y. k% J" k  o连接特定节点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内置的钱包服务,也可以独立部署钱包服务
* N' X% [; k. P0 ^4 pdocker 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$ |
免签名验证
4 }7 J$ V" p/ h5 d" m4 ~6 Y: l: N2 b开发者如果需要快速测试功能,可以跳过节点签名的步骤,这样可以解耦密码学的问题而关注应用功能
5 k; N/ t  d2 K' T启动时使用特定参数3 ^: D! u' N" ?6 e- X5 K6 |% |
eosd --skip-transaction-signatures- @/ h$ W9 U1 }7 o6 Q
EOSC调用时添加-s 选项
8 N  S: U, P5 o( }9 k; O% Qdocker exec docker_node1_1 eosc   -s
, S3 J7 H% K* b. K其他RPC调用
0 _) W: `8 f7 p; w# XEOSD RPC 包含通过HTTP RPC与eosd和注册其上的插件进行调用的方式.
& n8 a$ L* Q1 H$ c5 H1)区块链API 配置
- Q. v1 z( g' ~  v想要查询eosd信息需要启用plugin = eos::chain_api_plugin插件并添加至config.ini中
. d0 z- R. X; ?' C+ p6 m. Z2)get_info接口用于查询区块链的基础信息* D; V0 l3 Z1 O; X; @, D
curl http://127.0.0.1:8888/v1/chain/get_info
6 I4 I" Z7 `* }9 p: `& m& A返回结果如下:. @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"}
$ I/ V2 D% t3 i& V- u7 ?get_block接口用于查询区块相关信息
/ E* R7 e* y2 L% ^  [5 O
3 [' u1 G. m) a9 l& v5 M$ Ucurl  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}'
4 ?0 O7 W- z) h; o1 ~; _) [- z返回结果如下:
1 t& W1 P6 k* ?2 z! g* v{"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}
2 Y# y/ N1 ]! P  S' C) n4)push_transaction接口,调用合约交易
6 ?& s1 k6 ?1 q# Z# y该调用为JSON格式并会将结果更新到区块链上/ q( l' F; v: h2 i& L
执行正确的结果返回  K! Q/ z3 c4 ]6 M$ e5 ~
返回 HTTP 200 和交易ID号
8 f! F! e, s( r. T5 Z{
: `" S, X, E3 O'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
/ P1 x' ~1 I+ q! rContent-Length: 1466$ o; A" h% E5 O7 b! x* G0 R7 L
...error message..
; \1 U9 {3 Z* Y6 \0 Y, Q/ tpush_transaction 调用方法
  Y* ?" E5 v& q6 a4 d9 tcurl  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查询的结果
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

罗宾虚汉 初中生
  • 粉丝

    3

  • 关注

    0

  • 主题

    16