Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

EOS纯技术上手学习

罗宾虚汉
120 0 0
EOS.IO 已发布黎明V1.0版本。EOS.IO 黎明V1.0版本是第一个预发布的 EOS.IO SDK(软件开发工具包)。EOS.IO黎明V1.0版本可以让我们体验下EOS一部分区块链特性和简单上手开发、测试。本篇主要是一个快速的review目前EOS黎明V1.0版本的功能上手。
6 p8 C: I0 p! d8 E& X主要内容:
% w% J: @7 J( O, p, J5 u: @+ z( h- G9 \
EOS Docker快速部署
2 ~/ B/ m( |; X3 y) _  T$ Z9 s
2 g( }0 _5 z) W- U1 \EOSC使用9 D; h7 h+ G4 O) G7 ]. E; j

' x$ j+ l+ x1 A, \/ e6 Z; F创建钱包9 k* q3 U& J3 e) z' l  w+ ?
) L' e$ l* g* M6 V. G# s. F! e+ d
将私钥导入钱包
" w! f9 U4 o: G! ?4 y& U" ^' F# |
锁定和解锁钱包
. Z3 }5 ?8 }& z6 m# h9 w( G' w, T) Q4 q
创建账户2 I" j; A8 M2 a7 v- ^- ]  b
" H- ]- [# A7 D
内置转账
7 i2 A" _2 a8 t3 V( _' S
: `1 _; V( s% t( ~2 f2 K查询交易历史
  a! L$ `7 e4 o' O8 ]) X, `6 ~9 W7 t4 r5 f6 Q4 q( J% H- D! W3 K
测试合约 - currency
& R; J& k9 |, A6 N: a6 ?
+ O* J' @9 {9 T8 o- H+ Q9 p调用合约
! [) V7 B. T4 y, I
$ g9 A' r. j" \' D查询合约8 q9 m# |6 [* e# a6 M' j

% v$ X) j$ H4 ^链接特定的节点
# }& p) w; V" p% ]& ?+ G/ S! Y" w/ c6 _+ J; s
链接独立钱包服务# {/ o: ^7 u4 e- Q. R
6 ^: C/ |& O+ n5 i3 g- ~
免签名验证
6 d0 K8 N6 C3 q1 `5 A; v6 S/ I7 @. J# _- t" ^
其他RPC调用
7 n% n- A- A+ Z, V; Q; h
* W- c% g7 F7 ^. [# ]; d' @8 w9 F) M9 _6 |* j5 `
EOS Docker快速部署* u# O" V. S: D  J  C/ ?
构建eos镜像
" q  c8 i; y4 M6 g/ Y: i- e6 ^git clone https://github.com/EOSIO/eos.git --recursive# c1 R3 O! @3 i9 s, P3 k
cd eos# y* M/ t$ O/ M' \- m  U5 v
cp genesis.json Docker ( G- m6 w5 K1 p; S/ q% f1 J9 Q  O
docker build -t eosio/eos -f Docker/Dockerfile .
' C0 J! C0 x. R; \! ]启动容器9 S4 K1 J% P; G5 \4 c3 U! Y0 F. D
sudo rm -rf /data/store/eos # options
; u* i9 R5 Q# H% j3 E/ D" jsudo mkdir -p /data/store/eos. M9 ^: B- }  W6 n6 x
docker-compose -f Docker/docker-compose.yml up
7 u/ l5 P! o% N! s! O  A1 Q如果 docker-compose 启动有报错, 可能需要给文件存储目录赋予用户读写权限
, {1 {  x% q" F: ysudo chown -R SYSTEM_USER /data/store/eos+ m$ O+ b# T# L9 T6 f$ p( N
验证,查询区块链状态信息: `, \) E0 h3 a/ q' J0 E
curl http://127.0.0.1:8888/v1/chain/get_info
. ]0 V: R$ h+ V' O如果想使用多节点环境,可使用yml文件启动
6 |7 `7 \: @" h  }version: "2"
& }6 L: V  [/ J; U* |! i4 gservices:
. d9 k& A4 r6 p  node1:+ ^+ T2 @; {, B5 A2 h$ E' p  }
    image: eosio/eos
$ [! R* ^1 A) P0 X; w5 p    ports:" w' l" V* w: _) D8 y
    - "8888:8888"" }4 D" [9 k! Z! S' O2 o
    - "9876:9876"
7 k& W7 r8 ]1 M$ [% W( |    volumes:7 W) F2 b: c! @) ?5 U, h
      - ./node1/data:/opt/eos/bin/data-dir: |" a9 E; G: b8 L- F- K* z
  node2:
: [' Y* w- `) d- N' a    image: eosio/eos
+ j" q8 Z2 p4 Z    ports:
& a& R4 u* [4 n. m6 @# G/ v! H    - "8889:8889"$ l9 R" |# k. c3 _
    - "9877:9877"' [: T; G$ r+ a4 R* a. N# U- p) l
    volumes:- n! ?" s  h3 W) u
      - ./node2/data:/opt/eos/bin/data-dir1 r& G" V# q& z2 c4 \
    depends_on:
+ l# w/ ?2 i; k0 z7 e: @5 b: l% x      - "node1"5 |$ t& l( x/ k2 `" h- T
EOSC使用
9 r$ `$ K0 y4 x5 F; V& mEOSC是EOS的核心进程EOSD对外暴露的RESTAPI命令行工具。EOSC的使用会利用到一些内置插件,插件在EOSD的配置文件config.ini中进行设置,如与链的交互需要使用’plugin = eos::chain_api_plugin’。为了签署交易并发送到区块链上,需要使用‘plugin = eos::wallet_api_plugin’。为了查询交易和历史记录,需要使用’eos::account_history_api_plugin’ 。
. e0 e) _& E# P% C3 \# Plugin(s) to enable, may be specified multiple times4 r% c# `* P' |9 ^/ S
plugin =  o; F+ ]7 W" z) D
eos::producer_plugin' _- g1 T' D5 U/ j, _3 S
plugin =
* C2 P: h* T6 t/ k7 \eos::chain_api_plugin# T: X7 f% h: ^: S5 H8 D0 Y
plugin =3 w  d/ N5 ~4 [" g
eos::wallet_api_plugin( C* x, r, B) ~5 W: K* l1 W
plugin =: z9 c( O  N9 G& J/ o
eos::account_history_api_plugin
" t; `8 K/ V  i$ ^# _启动eosd后,可以使用EOSC查询当前的区块链状态
/ u* ?: j6 K- B1 B# E9 M! B* ]/ \9 S2 {( X2 Cdocker exec docker_node1_1 eosc get info
4 K, S2 c& m2 \6 S{: ?* j$ y& v+ L; ^6 Y& ^1 x1 ]$ P' c
  "head_block_num": 23449,; n& B5 C% A, [& m
  "last_irreversible_block_num": 23432,' y/ p+ c2 d9 _
  "head_block_id": "00005b996cc85962b28537c3d72696a012d1071638f5e4bad1809cf9afc9abb6",
/ D4 Q8 ~5 x, q6 ^! l  "head_block_time": "2017-09-29T01:53:33",
7 U, M) o7 b/ P9 G. P  "head_block_producer": "initi"," Y7 g  d* j  U* D" E
  "recent_slots": "1111111111111111111111111111111111111111111111111111111111111111",
& m4 L. L. p3 y/ Y( _3 a) Y! j: G  "participation_rate": "1.00000000000000000"
' u: m. ~7 I  |1 u! c7 c. s* d}% A9 P+ J+ Y! V' d0 [, u; ?. e6 |, R
创建钱包
# N5 V0 r, ~0 V任何发送到区块链的交易都需要由所有者持有的私钥进行签名。首先,我们需要一个钱包来储存和管理私钥,使用EOSC命令创建一个钱包。
7 s9 k) {/ h2 j6 C/ cdocker exec docker_node1_1 eosc wallet create* ?7 L6 \8 `5 V+ L! r8 g$ Z6 g
Creating wallet: default& R9 a/ V/ t7 _$ W/ U; u$ W
Save password to use in the future to unlock this wallet.' p7 i  o2 M) H- A/ k2 B. L
Without password imported keys will not be retrievable.
% I  I& Z, n  X. @! V: Z"PW5JXSxkHqNEwRKCpG2JUTLqkR8SNCBXofkAwaFDLwQkNdqaSXwC8"
0 r5 i7 s, W" k6 d0 K, Q, X4 i, M命令执行完成,会在eos-walletd中创建一个名为‘default’的钱包,并返回钱包密码。8 h) [% o1 ?  F. B! ^1 H+ G
这时候可以查看钱包列表
# i; g; I( s. ?  V; k8 vdocker exec docker_node1_1 eosc wallet list& p) O# u7 I9 Q1 J' s6 d
Wallets: + ?& `6 {$ U4 f
[9 c4 W* k. d" ], B! o
  "default *"
, `: V7 {+ A2 L]3 Q1 Q; V1 C4 y) C
如果你没有指定钱包名称,默认都操作的是‘default’钱包! g" u4 y) V9 U0 j* r
将私钥导入钱包% b' Y, N, h4 u  d7 c) @# Y
如果你想授权某个钱包可以由某人来管理和控制,需要导入该授权者的私钥。: ^0 X6 ~) }  h: n5 W$ V9 R
docker exec docker_node1_1 eosc wallet import 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
4 ?4 ~( z  ^8 n  \imported private key for:0 T# m& x0 ^4 Y: c& q; E9 w
EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV+ |7 B  F. Y. P. u3 V: U
导入后,可以查询钱包已经导入的私钥和对应的公钥
: `8 M2 Y5 f' X. ?' p1 A2 r# udocker exec docker_node1_1 eosc wallet keys% A3 ^) @* S' H* \! Z" {* l# U
[[
0 D) |1 _# H* v4 p; J' r# O+ f"EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV",
" o5 f* y5 J- b"5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3"
$ r7 {! F: R6 ?) T]
- O7 ]7 Q6 o( J# r2 h]
5 m# E8 X4 ^) ]0 t# n锁定和解锁钱包+ @8 i& G. G+ `  A4 I3 ~1 g- |& [; y
日常使用,为了保证私钥安全,可临时锁定钱包,锁定后查看钱包列表是不可见的  W) V$ I1 f& c
docker exec docker_node1_1 eosc wallet lock, v2 d, S3 X, G  q* }
Locked: 'default'7 f9 u# r6 g  e1 p7 M* ?* p) z( g
当想要使用时,可以用创建钱包时生成的密码来解锁钱包/ _3 i5 O9 B1 o, V5 R8 `
docker exec docker_node1_1 eosc wallet unlock --password PW5KVWrn81Y8PLAb52gr2FyXCanVavcrj9d5TC9C3yKhqq1PJYRPk5 J  @8 z  E) y& O" ?# H7 ]
Unlocked: 'default'
' g$ J0 {1 {" m, ~& p1 c' N. h7 c; N解锁后,可以在列表重新看到default钱包了
# o+ r8 e  M. w6 ndocker exec docker_node1_1 eosc wallet list  q2 [! c  B/ w8 P( k1 `9 w! L
Wallets: ' {+ _' D- B8 E0 I7 q
[
% _$ u$ ]! N+ l  Q6 @( a. w  "default *"
! f" t' y! r. D4 ]]$ @, _- r7 N4 t' E7 x
创建账户
* s  M* g' X  g3 L: I; j# s创建账户需要有两组密钥:owner和active。EOS使用EOSC工具来创建密钥对
) J: @4 j2 `* o1 o1)owner key.! w* S7 D* l( K" n' G9 i3 `( Z
Private key:5JRc8XxvodWey4StZ2zzkUhCQhDaHvGMkABtfHzQR2ie4qaUFJ7
- t1 N/ X. u! {% K( oPublic key: EOS5mFEdAzxvMkHLQXt2v4naUjnBrPGmzMUCikymqhSR6m7QLGSTB
& v) V1 B5 T" F8 F2)active key6 Q9 r2 U. d7 N9 g/ A. x
Private key:5KNzFCbToz2a9Hztz9Qen5cyJcM3x5Wpq4GFiTYZgGhzntXdmYo" H* U3 w8 S* e$ ?( \. I$ A
Public key: EOS5EdsvESpibWLJxupTqod1nswJnbiXQZuUcLiAWEEsqcZskymeB3 i0 B. Z9 q( U3 R% {
EOSC不会保存生成的私钥
/ d* H/ f0 o0 L( e因为后续测试智能合约需要,我们创建一个名为currency的账号。目前这个版本,所有的账户都需要用已有账户来创建,所以我们用inita账户的owener key和active key来创建currency。 为了使inita获得发送交易的权限,需要先导入inita的私钥到钱包。(参见私钥导入钱包的步骤)8 l! k# ?2 `4 }2 f
docker exec docker_node1_1 eosc create account inita currency EOS6NpEqWi177VKQkuJQL9V6Y3LqAAp9C2j( l& \5 ^2 p# U+ w( o( f
执行成功,会输出一串json的交易信息,打印账户创建相关内容
8 Z' }. S* ?' M3 N我们可以查询inita可以创建了哪些用户
% i% ~/ {+ c& T, H5 @, p! qdocker exec docker_node1_1 eosc get servants inita
. ?4 ?7 V* b- y& {- V/ Q{1 ]1 R# m3 y7 f. z. G8 Q
"controlled_accounts": [
! `$ a8 d* f, N; i. Q" J# Q6 j"currency"7 M' K3 E7 a& K6 B- H* O
]- G( _, ]3 E, z$ d# H
}+ c: d  P3 Q" s" p4 }
内置转账
) i3 r- d  F! y6 k$ V% ]创建账户之后,可以查看当前账户的状态,可以看到创建的测试账号没有余额,这样不少功能无法测试,我们需要试着给创建账户添加一些余额
- N- d( `1 y$ D$ t' o& Q0 o: Hdocker exec docker_node1_1 eosc get account currency
$ }& O, b5 b& O6 a{8 z) V$ X) w  r; o6 p8 N: J( C
  "name": "currency",
, E/ K3 Q8 U& X! Z  "eos_balance": "0.0000 EOS",
' [, u* B' \2 o  I- i. f: N  "staked_balance": "0.0001 EOS",
9 T& `0 v; m* z( O  "unstaking_balance": "0.0000 EOS",% D" y" Z* b; x, l. u$ I
  "last_unstaking_time": "1969-12-31T23:59:59",
0 i. K# p1 m! t  R; t6 t1 x. @& |9 d  "permissions": [{: W3 T. q% U" R- t
      "name": "active",. Z/ }; T% `  X% i$ E/ Y: i5 c# _
      "parent": "owner",
, |5 {" ]+ n; g0 H$ j9 e' E, B& r      "required_auth": {2 S% b7 f' n2 J! ]6 p
        "threshold": 1,
, R: q" a, ^- U. X. u/ ~0 k; J) b  d        "keys": [{0 |+ I1 L7 F& ?( U+ m, q) X
            "key": "EOS8ff42NMpJUybVj3nwUSnPpc3mMysKxyE4HVJy1E5o3fQv7knWf",
! d  a4 B! w. t: U+ M) K0 U            "weight": 1
- j* B4 @+ B+ E5 o4 S' `) i          }' c8 o8 B$ a6 C, `! F: C; m) a
        ],2 G& y; B  G; w2 v2 c% n
        "accounts": []
" j3 r( R" O) A! |: ?      }1 `% @0 q; X; q, s2 f! l3 v! \
    },{
% y2 c( @" k; Z4 _3 T6 D      "name": "owner",( }: ]6 o/ ?6 O8 o
      "parent": "owner",* v+ x" u- J) L2 h' D; ?* z! b
      "required_auth": {$ K4 n' r# m6 L
        "threshold": 1,
% v1 f0 p8 p7 S2 X        "keys": [{
) e) H5 V" t9 O# `6 b# p2 z            "key": "EOS5fQ4saiHV426EQ7AKrGoD2AVMBYe77bnGSq42JjXBUfipv7o3E",
: V0 |  ~* W0 Q' c* k) U3 F/ S            "weight": 1
. p7 O' t9 O# ]" ]- J1 u1 I          }
/ N0 a) f" t  _# K/ Q* B        ],: O  N+ F0 B. c0 [: A
        "accounts": []
0 h* e1 p) j; A. e  ~$ _3 {2 M/ k      }. ]: w2 n4 W$ H: D+ r8 O! q, y
    }
, c2 A. t  d- g. J4 ^' O0 U4 s  ]
  c$ N4 m. g* t3 B7 D2 }% O' H}3 c8 u, M7 f# N  T3 _& ?. S
保存全网余额的创世账号是eos,查询余额状态
# m$ ?* j; o1 y" D! @1 t3 [docker exec docker_node1_1 eosc get account eos" k# ]- q( f  ~, d! B; n
{" w9 d, X+ d$ t( r& J" e( h
  "name": "eos",) p# f8 j# W  f; I, h* ^! i
  "eos_balance": "69000000.0000 EOS",8 w% g8 B$ f6 p+ B7 B* R- G
  "staked_balance": "0.0000 EOS",
, r; [7 Q3 Y; G2 ?2 u+ ^3 K. K9 b# t  "unstaking_balance": "0.0000 EOS",4 F1 O/ \8 h8 _6 o8 W, S# h! S
  "last_unstaking_time": "1969-12-31T23:59:59",
7 z* B  W' \8 ?/ D$ Y/ r/ r: {$ u  "permissions": [{9 b' y0 K5 m0 e: c# ?8 j
      "name": "active",
  H6 Y# J$ G' W1 [  o      "parent": "owner",/ w, [* `0 J! r8 C1 ]+ `
      "required_auth": {
( n1 m8 D3 Y- T0 l9 I7 f        "threshold": 1,
1 E  f& c+ b3 W# s: `- D; e  C        "keys": [],
. w4 O( @! v9 U  ?" Z+ o* N        "accounts": []  |  a+ W6 A* V" y4 D6 F
      }
8 m. v; N( H4 g0 e    },{
8 V: v% R- l% I1 _      "name": "owner",
- O$ p6 u9 Q  T* z: P8 H: K      "parent": "owner",8 N. P3 b% a0 A
      "required_auth": {, _, l- v8 `* ~7 Q  }) F. J& _( @: s9 g
        "threshold": 1,+ p4 M) r- M! l# ~  Q9 E& O
        "keys": [],, G* V- U6 W  A  [
        "accounts": []
5 v9 A1 _" X/ F9 j! w0 E, |/ _      }
3 v( b' c& v# v# q    }/ _& Y# L( ?  j& g# V
  ]- T7 y  d  t2 J# p, h$ x$ w
}, O" f7 l  ~) X! C2 U( g
我们可以通过创世块定义的创世账户使用EOSC给当前创建的账户转移余额; B* Y. t' g- b0 E# g
docker exec docker_node1_1 eosc transfer inita currency 100000000
6 D/ P% y5 x7 \; E{  S6 ]( z  A* Y
  "transaction_id": "59575b8caf08eac7c00eb7483c048f12d0e7abf1ede839c3b2ed41dc6c5c7c5f",
( d4 L% j! g" g# Q+ j1 a  "processed": {
* r# z, Z9 S- c4 m2 d    "refBlockNum": 24199,9 R: r- M( r1 c+ {* C! `* A
    "refBlockPrefix": 1485651173,8 K- q% o3 B0 A/ G7 E# U2 N  S
    "expiration": "2017-09-29T02:31:03",. b+ ], I/ J2 h  R& J' l. |
    "scope": [# ]6 e- i% S* I, E2 z, u. F
      "currency",
3 t& K5 G/ g: U0 m8 [      "inita"
( ]; F9 j8 @( n2 q; a    ],7 K6 f" v- @! c) U
    "signatures": [. L; u' f, [2 {7 e' g0 j
      "1f14229bdd4bfb927021bf96ff0651c8b0fa5666e9f5cf423a0270a1b91f2d2f690b573e179d8475ce2c6b160f5cd5507d58a44f8f6cf536348584efa8dd62ade0"7 b3 F% H+ v) @: m9 G+ Y2 ~
    ],% W  q" S% V) }) @; \
    "messages": [{/ X) c# R/ Q/ X" r' v! G2 B
        "code": "eos",
' y8 s! L* g& v* J/ ~6 x3 Z& `) J0 |        "type": "transfer",
! b( ?9 q! m2 U3 }! l        "authorization": [{3 t0 R; |% r( I6 D7 U6 _/ a! Z
            "account": "inita",
+ {2 I5 U4 k' O" e5 ^2 e) @( b3 F            "permission": "active"
) R$ F5 `  q5 e$ j          }1 I) P; `+ v  q6 l
        ],6 v7 v. ~* V3 u* y
        "data": {, M+ _" m6 C! f5 [$ q
          "from": "inita",
4 ^: \# P; {3 E6 u9 F1 V+ A8 P1 p          "to": "currency",( x/ m( D/ D! w" P! o
          "amount": 100000000,2 k$ t. ~$ _* e2 @" T8 }- T
          "memo": ""- P. f- l; K& b: V8 c8 L
        },7 N) T# O/ p* R( i0 r5 ~* I( M  n# }: ?
        "hex_data": "000000000093dd740000001e4d75af4600e1f5050000000000"0 e4 \  I: @8 E* n& \
      }
. v1 R4 n5 z8 E2 d9 M% _    ],  h/ G7 U% D& {* P; s9 O
    "output": [{
3 V3 I4 S$ w0 E6 ]        "notify": [{
, X- b4 l9 Y0 K& A& L1 q# s; y            "name": "currency",
2 r5 t* g( B3 l( q" E            "output": {% H+ D% L6 `2 w5 E# a
              "notify": [],
) n$ G9 j0 t$ [* @6 O9 {( N: y' n: m              "deferred_transactions": []
7 @' t( B, [# }4 _9 P  j            }
  A* ]3 x% L3 B          },{( i4 r/ V% {, C
            "name": "inita",. h- g# V" ~; a5 G+ q/ p; m" W
            "output": {' p) ^" p4 w  V1 W  F
              "notify": [],
+ X( k5 U" Q/ S1 a  c+ b% L. p              "deferred_transactions": []; W( j7 o7 \7 a+ x5 G
            }: D) d; U4 f7 q7 |( ?
          }) c5 f+ i( Z' V2 Y& R9 a. t
        ],
. A1 ^+ w, E8 v2 E* x        "deferred_transactions": []
/ y/ m* f9 f4 ^& ^7 i1 v0 R      }8 h" i" V) p8 _- [; O
    ]+ t/ I$ N. a: B9 k& g: c( z! d/ P
  }
( A+ R) ~6 }+ m+ N* g7 L}
# p2 o6 d  [$ I3 ]6 a' S再通过执行get account 命令,验证余额已经成功转移到创建的账户下
: P% J, G$ J9 _4 \! x/ V查询交易历史$ P$ E% S/ N, |
查询交易历史会使用到插件account_history_api_plugin,我们已经在config.ini中定义
1 ~# D) W1 l/ O! D8 D+ _* m/ Vdocker exec docker_node1_1 eosc get transaction + L  J  t  q7 U/ z$ K$ z: y
如果需要查询一个特定账户最近一次的交易记录& C2 J3 _9 r$ A' o6 n& F
docker exec docker_node1_1 eosc get transaction inita4 l2 n9 b- y7 b0 `  g
创建智能合约
' N% z% t2 S) ~- `4 K6 u5 a4 U& s官方提供了一个示例合约currency,我们依然使用EOSC来创建并部署智能合约,合约代码位置contracts/currency。! \" q& O3 }2 T
1)为合约创建一个所有者账户。前文已经创建了currency账户8 A$ o3 Y4 }( z' V4 X0 g& [
2)检查区块链上有无同名合约
! L. f( u9 o. p/ X2 I) v) Mdocker exec docker_node1_1 eosc get code currency
. K: `) W! k+ dcode hash: 0000000000000000000000000000000000000000000000000000000000000000
; H/ L+ F/ h% F& m" S+ `3)为了获得部署权限(发送交易请求)需要将currency的active key导入到钱包中7 p7 B0 @/ V$ p  ]8 l
4)部署合约(.wast后缀文件)和他的abi(.abi后缀文件): c7 C# R' ?% P) S
docker exec docker_node1_1 eosc set contract currency ../../contracts/currency/currency.wast ../../contracts/currency/currency.abi" Y. W* K) s; A  b9 \4 q* |5 o' a& w
Reading WAST...% l8 M* V  `! V4 T2 Z
Assembling WASM...7 W# Y) f5 Y# T* x' d% I# R8 ?
Publishing contract...* W2 I- e' W7 n- T0 v9 p4 b7 A; t
屏幕打印部署成功相关的信息,并查询合约hash
% h  F* o4 K4 d, `, h' k8 U1 {docker exec docker_node1_1 eosc get code currency
8 @. q: k- w' u$ k  d7 R& t! Jcode hash: c4023f74b3c7a3321d1641e4111b13584078fa7265c6ab12e1c19ff7ee800faf# k0 Q; s+ {" B9 `. T. T' w
调用合约
1 t( ~; m% ]! e" Y. U% A$ ^/ H! K在合约部署到区块链上之后,所有的currency余额会分配给我们创建的currency账户。我们可以调用合约测试做一些转账交易。
' j8 o/ y' s2 }5 }为了更好了解区块链合约的调用方式,我们可以通过.abi查看可以执行的操作列表和消息结构。  `& K( d: s$ ^: {
docker exec docker_node1_1 eosc get code -a currency.abi currency1 J& \) L/ g/ ]# G
code hash: c4023f74b3c7a3321d1641e4111b13584078fa7265c6ab12e1c19ff7ee800faf2 o  S5 ~! L+ w
saving abi to currency.abi8 D+ @) f. T5 K* }/ W
cat currency.abi #查看! M6 O. s+ T4 x' X$ z8 x/ A# k& z( X
{5 G. b$ B% C* g, c: x) v. }( g5 J
  "types": [{
: E5 E6 b' t: i      "newTypeName": "AccountName",
4 B8 W% o. u# |+ p3 `* k      "type": "Name"! }: i+ V1 v2 x0 ?% v
    }
2 [+ H0 _/ }$ {% T  ],
0 |% S6 p9 D0 A4 u/ q6 x  "structs": [{6 ~, u$ X( m* f( R$ U3 l
      "name": "transfer",
! `! {  s2 E6 @$ A1 q" t& X      "base": "",
5 |( l! r4 L1 z6 X: V: t9 F4 _9 L      "fields": {/ k" `/ [# k3 E) K4 H
        "from": "AccountName",8 ]6 ?8 ?2 z( A
        "to": "AccountName",
: |& o2 A, C  V( |3 U        "amount": "UInt64"
: I' K3 `* A) y5 Z. X& [      }
. O1 o1 y6 l$ P8 o; `2 h    },{
8 C, s9 D$ P3 N7 `, d7 ?* d      "name": "account",
5 }$ [8 g. @* Q* ?      "base": "",
7 a6 Q' q, _% W0 L. b5 @# @7 t# _      "fields": {. \# _+ ?+ \0 z2 f! R5 |( h
        "account": "Name",7 _+ `0 u# {2 i. R  E% k0 N
        "balance": "UInt64"
* o- u6 k2 v' @, e5 F: m# W      }
5 c, I7 u0 W/ k+ e' A7 S  A$ c    }
2 t  G7 L( @8 ^9 g9 s  ],9 P  Z8 I! c* r! f) N
  "actions": [{
) _4 \* p1 ~. J& ^) o      "action": "transfer",) Y  ^6 Q9 }, q  ~* \, j
      "type": "transfer"9 J2 p6 y% C; v
    }/ F% i* G# |% A
  ],
# j+ v$ z- x: i, u; }* A6 J$ X  "tables": [{4 q6 V' [, F1 ]# A
      "table": "account",
4 M+ ^+ u' ?: Q1 i      "type": "account",
9 j0 \( F2 k: ]! z7 K9 d      "indextype": "i64",, k$ _  J: [( q2 N3 X
      "keynames" : ["account"],) r. |0 T  K6 d' E: i: ?! r
      "keytypes" : ["Name"]
- [8 x3 Y; ^2 C/ \$ d/ c; S6 `    }
  d% Z( a% e1 ?' ?8 G8 a  ]0 z. h% G9 @. M
}
$ I" l/ ^% f* e' x- Z+ ?3 }. W通过上面的abi我们可以看到currency合约可以执行transfer操作,消息格式为from,to和amount。我们调用合约从currency账户转移50个余额到inita账户
& l2 k# w" Y  D* P  I! ddocker exec docker_node1_1 eosc push message currency transfer '{"from":"currency","to":"inita","amount":50}' --scop
, x; {0 k* d9 N. J$ G- B4 U执行完成,我们查询余额验证结果
# h6 ]4 X& c. ?2 d1 Ndocker exec docker_node1_1 eosc get table inita currency account
4 [% N; n6 d2 S4 Q1 Q/ o0 t6 T; U- r{
7 A& j, d4 Z) C5 Y$ d. `7 s7 O5 W" j  "rows": [{
( m5 E5 J% j, j      "account": "account",; o! M. `, |' l+ Y2 o& }8 o8 Q
      "balance": 50 9 i1 t* D3 {  Z) h5 `( m
       }% d8 u0 X! N# ^' C4 _
    ],
  v9 g# Y* |/ b+ m9 t  "more": false
1 y  s5 n' a3 h}9 _8 o+ y9 g2 W8 d( t, o* i, m
docker exec docker_node1_1 eosc get table currency currency account6 r4 W* M6 P' R3 n8 x1 L; F, y
{
. [$ _4 U9 h- a) O2 {6 ^! Q  "rows": [{' y) z  G" v6 K2 v. w
      "account": "account",
  x: V. L9 E$ v4 S7 k      "balance": 999999950
/ E+ q; Q: x8 b. p, P0 u    }
- Z5 w3 `( l5 G$ U: p' J4 C  ],/ i" s3 H. ~6 q$ [
  "more": false8 C  r8 v7 R4 n# ^  k# @4 D
}
6 ?) {6 e7 l6 J' h* T: I' Y" I7 J) J余额不足的账户尝试转账,会提示失败
# `4 O+ K7 j1 j  {- U: ]( Wdocker exec docker_node1_1 eosc push message currency transfer '{"from":"tester","to":"inita","amount":50}'-S inita -S tester -p tester@active/ Y4 ~  D/ R' s# X8 r& D( l( F7 J  A
3543610ms thread-0 main.cpp:271 operator() ] Converting argument to binary...
# N# U5 N* j: \3543615ms thread-0 main.cpp:311  main ] Failed with error: 10 assert_exception: Assert Exception; J" }* h5 e7 l7 E: H
status_code == 200: Error : 10 assert_exception: Assert Exception2 k- \& x5 A9 f! Q; a% I
test: assertion failed: integer underflow subtracting token balance
: s5 u8 V* S8 o. B{"s":"integer underflow subtracting token balance","ptr":176} thread-1 wasm_interface.cpp:248 assertnonei32i32 [...snipped...]
; O5 b6 b/ t9 E2 w查询合约
; j# O3 a: R8 p0 l$ }1 `如上文验证步骤,在调用完合约后,可以通过查询表来验证每个帐户持有的余额。3 [: ]! D( ~5 o: s0 U6 Q$ r
docker exec docker_node1_1 eosc get table currency currency account
9 K; C1 z( n8 C6 m连接特定节点
' r+ u8 U6 g5 n& X默认情况下,EOSC连接本地端口8888的节点。可以通过指定主机地址和端口来连接其他EOSD节点。同样的,钱包服务也可以指定特定的主机地址和端口。
) \, y: B* Z2 p5 N8 L  S; {( G: cdocker exec docker_node1_1 eosc --host  --port - _5 C" w( R% v. N
链接独立钱包服务
. N6 L( I7 P; O$ G除了使用EOSD内置的钱包服务,也可以独立部署钱包服务
/ W% h$ S( Z! Z$ ~) g: Y$ Edocker exec docker_node1_1 eos-walletd --http-server-endpoint host:port
% ^5 f0 D) L. }3 |( ~$ m调用独立钱包服务需要添加如下选项, B- E# Q5 J4 u2 `) ^0 g4 Y
docker exec docker_node1_1 eosc --wallet-host --wallet-port" u( Y0 e/ X4 F% A
免签名验证2 k9 c7 m; E" Z: T
开发者如果需要快速测试功能,可以跳过节点签名的步骤,这样可以解耦密码学的问题而关注应用功能* c* z5 ?8 D3 I: }; V
启动时使用特定参数
2 ~; Y: y) L; Z/ oeosd --skip-transaction-signatures
6 ~/ p5 S# U* }- b8 e& GEOSC调用时添加-s 选项  m  j/ [' w4 h+ `  I
docker exec docker_node1_1 eosc   -s
4 B/ U- Q9 G1 c其他RPC调用
5 ^+ ?, f6 V9 gEOSD RPC 包含通过HTTP RPC与eosd和注册其上的插件进行调用的方式.
: a5 s5 l" x" ]! x. h. E5 c2 \' c1)区块链API 配置
' ~9 G  J$ l: B' \9 _# y; K3 @想要查询eosd信息需要启用plugin = eos::chain_api_plugin插件并添加至config.ini中3 G$ a4 Z) t# N$ u
2)get_info接口用于查询区块链的基础信息( W: Z# w4 Q. j2 K9 r
curl http://127.0.0.1:8888/v1/chain/get_info
  W# W( w8 F$ ]9 M) V% I8 V/ y返回结果如下:
/ q% f0 G+ J. Q5 Z- S0 Y{"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"}0 w" P: B1 q/ k- y( w8 C  O  D+ i
get_block接口用于查询区块相关信息
3 U% A' h! {& c, q
, _/ G" O! \. @" X* c4 y) A, Jcurl  http://localhost:8888/v1/chain/get_block -X POST -d '{"block_num_or_id":5}'
8 t( F# D0 N/ B7 E+ v+ d* g+ Hcurl  http://localhost:8888/v1/chain/get_block -X POST -d '{"block_num_or_id":0000000445a9f27898383fd7de32835d5d6a978cc14ce40d9f327b5329de796b}'  w6 w& U+ f+ l; A8 l
返回结果如下:
; l; f" O; q  I; K7 m: j{"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}  e4 L* G1 y4 c1 d. U
4)push_transaction接口,调用合约交易7 V) ^! t! L1 P* E3 c1 }* Z, y
该调用为JSON格式并会将结果更新到区块链上
2 w9 ]8 U0 X& n" R2 m  ?% E$ {+ L执行正确的结果返回: R4 M  N5 x7 }6 O$ z5 w) v
返回 HTTP 200 和交易ID号" X7 s- C7 V, A  \- o  V
{ 2 V) q% O: k- |9 i9 K
'transaction_id' : "..."
/ M5 [" @) u9 w}( ^2 \! M7 j: Q
执行错误的结果返回,一般为400错误(参数错误)或者500错误
' J$ m# m' q! D, \) S+ Q7 YHTTP/1.1 500 Internal Server Error
) D# D  z9 n+ n. yContent-Length: 1466
4 ]4 q$ _& V7 d4 J8 C# ]. V/ O...error message..' |5 f4 _7 J) k9 H
push_transaction 调用方法
) `* K* R- ?/ J! ]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":[]}'
9 Z1 x# A6 U: Z3 O此示例模拟一个转账交易。 refBlockNum和refBlockPrefix使用的前例block查询的结果
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

罗宾虚汉 初中生
  • 粉丝

    3

  • 关注

    0

  • 主题

    16