Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

EOS纯技术上手学习

罗宾虚汉
182 0 0
EOS.IO 已发布黎明V1.0版本。EOS.IO 黎明V1.0版本是第一个预发布的 EOS.IO SDK(软件开发工具包)。EOS.IO黎明V1.0版本可以让我们体验下EOS一部分区块链特性和简单上手开发、测试。本篇主要是一个快速的review目前EOS黎明V1.0版本的功能上手。
+ M+ Q2 g% X& j# o7 P7 t主要内容:5 E' Q8 L9 a3 v+ s; g
  y& I( \0 d+ _, k1 O* y
EOS Docker快速部署
7 ]! ~. ?# |9 P$ O- h
- d" V) i, V& N) J) gEOSC使用, g0 S2 |, u; o
* `+ B2 }" D! K0 X
创建钱包
0 ~; w2 @) w0 v4 u* t& ^- z2 a
& S! g/ L2 ]1 o将私钥导入钱包# m+ m$ q9 E4 e% }1 Q2 H* E$ Q

# G! ]4 f% q5 z/ Y$ U. ]# m锁定和解锁钱包
4 d& @1 ?# P$ {- a* M
5 C3 k4 A) o4 h5 v创建账户
. T. q/ L  ?' L2 I0 \+ q9 j* k2 G9 t, X: q4 P- x$ @8 k
内置转账  L# B8 B) T( X

  E- Y5 S- m- h' `3 D7 d( W查询交易历史5 q! ~! f3 \' F, r* b7 L; [( a
. ]7 Y& }5 Q/ K5 Y" ~9 L
测试合约 - currency4 z; K6 \' f6 b+ N; f# q

+ K! y: t; Y" |调用合约
3 r" r% C. i0 e( x3 @2 i/ g1 m
- p6 a9 w9 l8 S5 ^( N$ M查询合约) G: N+ S5 o1 R
* v+ V+ k- p/ A/ [5 ]& y
链接特定的节点
; I2 @7 i! k/ {" V
$ b7 I- t: u- W链接独立钱包服务7 n: B$ }4 M) u6 D/ s$ m1 d

: k! o  V4 B$ U  i7 M" ?! Y4 ?免签名验证
+ S8 d, R+ t6 e  p3 s  |, `6 t' h' r' W+ h/ C: e: }
其他RPC调用
$ {, ]+ S& k! D* }( v  h1 U+ B; Q" z) U9 _3 ]# P
8 a  W/ h" h$ ]$ C! B6 @3 [
EOS Docker快速部署
, l& W+ N7 K, F0 m6 z9 u3 R& F构建eos镜像& M) I% {. q) _/ }
git clone https://github.com/EOSIO/eos.git --recursive
4 x5 p1 I6 j- w( Y$ N  h2 d3 p$ t, [8 Rcd eos* Z' v$ I$ Y% A9 f1 R& C, Z
cp genesis.json Docker . u  f4 A* w% `- I, ^5 I% u* @8 @
docker build -t eosio/eos -f Docker/Dockerfile ." r0 g/ m1 [( o2 m; [
启动容器1 g% y4 q' I, N* Q0 F0 S2 l
sudo rm -rf /data/store/eos # options
; t/ d+ P6 n0 wsudo mkdir -p /data/store/eos* K4 K- V) S$ g- N9 c! w
docker-compose -f Docker/docker-compose.yml up3 j, ~! U3 j9 Y3 c" n
如果 docker-compose 启动有报错, 可能需要给文件存储目录赋予用户读写权限# x$ ?  |9 |6 j( ^: A3 p
sudo chown -R SYSTEM_USER /data/store/eos
4 S  }$ k$ p3 F  j7 u+ ~验证,查询区块链状态信息
6 L5 r% {" K1 k! S7 @0 g: vcurl http://127.0.0.1:8888/v1/chain/get_info
% w' S! d4 U+ N( r如果想使用多节点环境,可使用yml文件启动
5 x+ J. I) e! L5 k2 `0 L- mversion: "2"
+ N! D5 z) e6 [) j. G; D5 R) Iservices:
& j0 v* `: Z2 a" ~  node1:
  w, d- V$ G/ ]8 x    image: eosio/eos
1 R% ?; Q$ }. }    ports:
. O* d; Q& d: {' A    - "8888:8888"
& m1 P3 y) T: B8 k' _% [4 O: Y. S    - "9876:9876"
1 C# m% K' z% H7 U( a    volumes:/ {0 L  K8 r% g/ x2 v% s
      - ./node1/data:/opt/eos/bin/data-dir
, P" h. ^' s. Z/ `8 R5 h  node2:. {  S% I; ^% d
    image: eosio/eos
  t0 d% \1 Q% k6 W5 ~  j    ports:4 U. I3 R+ w  P) _( Z( @
    - "8889:8889"
. h8 ^3 N+ P. I  N. n3 y1 A; ~, \    - "9877:9877"
6 ~! S' u2 L+ i# R( K    volumes:
3 b- H8 t7 p0 d  @  {      - ./node2/data:/opt/eos/bin/data-dir
0 A9 H5 i& G& k1 }. z    depends_on:8 P$ M' _  ^: J" K0 H' a; w
      - "node1"( _) P3 z1 a; p9 F
EOSC使用/ ^3 Y+ A5 C1 K! ]7 M5 G; \: F
EOSC是EOS的核心进程EOSD对外暴露的RESTAPI命令行工具。EOSC的使用会利用到一些内置插件,插件在EOSD的配置文件config.ini中进行设置,如与链的交互需要使用’plugin = eos::chain_api_plugin’。为了签署交易并发送到区块链上,需要使用‘plugin = eos::wallet_api_plugin’。为了查询交易和历史记录,需要使用’eos::account_history_api_plugin’ 。
% z+ d) D2 r& |$ I3 _. t3 h$ Q# Plugin(s) to enable, may be specified multiple times
  q# v2 L$ l9 S' g4 pplugin =: \# G/ |1 N3 M( Z4 @$ D% l2 }
eos::producer_plugin$ |" q9 w, U* V) [
plugin =
0 [  O3 O# X! k( xeos::chain_api_plugin( _- A% D+ L4 M0 x& m  n# `9 H
plugin =
. M8 h( k, I6 Y, a- x( p4 Leos::wallet_api_plugin
+ j$ Q" j/ H0 t' Nplugin =3 n; W/ a9 h- U( q5 t
eos::account_history_api_plugin' j. V! A, y- y7 f& D7 W
启动eosd后,可以使用EOSC查询当前的区块链状态/ j4 _/ L2 C1 s# M, \# Q
docker exec docker_node1_1 eosc get info6 \# N$ V2 e' H/ v
{0 ^3 K2 h  G  B; R3 s
  "head_block_num": 23449,
. T/ ]) A5 b' w  "last_irreversible_block_num": 23432,9 c4 ?: G2 q3 F# y1 I
  "head_block_id": "00005b996cc85962b28537c3d72696a012d1071638f5e4bad1809cf9afc9abb6",
% J5 y: p7 {0 j- A4 ~3 M( t  "head_block_time": "2017-09-29T01:53:33",
* j' I9 |  g: z& [- e5 Y. u7 n" n  "head_block_producer": "initi"," f6 _! X) `* M$ f! o
  "recent_slots": "1111111111111111111111111111111111111111111111111111111111111111",
4 U& g# k9 _( I8 W8 {  "participation_rate": "1.00000000000000000"
( P  r. b" i9 c4 l}
0 M" R& k/ D- @- y# N4 H创建钱包) n" x$ H( @8 ~# A" W
任何发送到区块链的交易都需要由所有者持有的私钥进行签名。首先,我们需要一个钱包来储存和管理私钥,使用EOSC命令创建一个钱包。: t* l- }* r- W4 L) N* |6 Z3 S0 ?
docker exec docker_node1_1 eosc wallet create
8 G" o  u3 e/ nCreating wallet: default# m$ x  X! q& y3 H& a
Save password to use in the future to unlock this wallet.6 Y' j7 f/ M8 \- Z4 [/ a) _5 k- K# D
Without password imported keys will not be retrievable.
4 y# a" `( b$ ^8 u"PW5JXSxkHqNEwRKCpG2JUTLqkR8SNCBXofkAwaFDLwQkNdqaSXwC8"6 H( ]0 [9 J4 r1 P. v3 H4 j( _
命令执行完成,会在eos-walletd中创建一个名为‘default’的钱包,并返回钱包密码。
3 v! v1 p, s- E5 R( n0 y  S! ~# J这时候可以查看钱包列表
, a  i' e: u% z+ M: s2 sdocker exec docker_node1_1 eosc wallet list
& ?- W* ^  h( r- }% n# @1 VWallets:
/ W1 A) D& h7 w4 K% a# t[" t# g1 ~3 N1 i. ^0 E4 V  W4 S5 M
  "default *"& S* N& @# }' W& H- H( C! S3 X
]
- H+ W5 y# C7 O& R2 J( g如果你没有指定钱包名称,默认都操作的是‘default’钱包
: C& ]8 E: s# [8 K7 m将私钥导入钱包2 G8 c5 L" f0 p" I* X+ F- `5 W
如果你想授权某个钱包可以由某人来管理和控制,需要导入该授权者的私钥。" Q0 V! J0 @: i$ O0 i
docker exec docker_node1_1 eosc wallet import 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
! L- E- r, U! j% ^( N' M, C- bimported private key for:% z! t6 j! M) h$ k
EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
: W/ O" t* r7 x导入后,可以查询钱包已经导入的私钥和对应的公钥( p; K' k( y% C
docker exec docker_node1_1 eosc wallet keys: _" |3 `3 J& ~- B, z) P$ Z
[[. [1 {0 w; l! H0 u, H
"EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV",1 @, }  b+ X( C& @+ {$ e, o; y, V# }) r
"5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3"
3 E- k7 j. k- m. n]& T# w. {1 X* T; A( `: D! d
]
. }5 j8 E) w; @- Y6 Z$ f- R锁定和解锁钱包6 Q! y4 W- O) v8 L3 c
日常使用,为了保证私钥安全,可临时锁定钱包,锁定后查看钱包列表是不可见的" `: Z+ D4 p6 U- Q5 U. j# ^
docker exec docker_node1_1 eosc wallet lock! `  H) @; U& D9 ?; I% R6 Q# d% g" B, x
Locked: 'default'3 z! _5 l7 I) r, E2 \; t  |
当想要使用时,可以用创建钱包时生成的密码来解锁钱包
$ l( `: k: a: I" K5 S; u' qdocker exec docker_node1_1 eosc wallet unlock --password PW5KVWrn81Y8PLAb52gr2FyXCanVavcrj9d5TC9C3yKhqq1PJYRPk- s3 ~+ r) w: T1 q0 ^( |4 t+ M
Unlocked: 'default'9 O+ q0 d* H" m' V5 b5 u8 H! _0 x
解锁后,可以在列表重新看到default钱包了; D# L$ W. f' I" U. `
docker exec docker_node1_1 eosc wallet list/ L4 H, D! K  |! {* k
Wallets: 8 r" r9 P0 o1 b$ a( y
[; @5 Z. c- V- k( S. A; d
  "default *"
, n% q' E2 x. ~]
. I9 o/ R6 e/ y' q* f% A创建账户
1 l8 b! F. M$ P5 H* a7 h创建账户需要有两组密钥:owner和active。EOS使用EOSC工具来创建密钥对: t- K" k" @# U5 U( M( Y$ t8 I6 g
1)owner key.4 d3 w/ t+ v8 I) ~
Private key:5JRc8XxvodWey4StZ2zzkUhCQhDaHvGMkABtfHzQR2ie4qaUFJ7  L' `2 [% ]7 F& e, Q7 D& a3 d: ]
Public key: EOS5mFEdAzxvMkHLQXt2v4naUjnBrPGmzMUCikymqhSR6m7QLGSTB
5 O' z6 }& u' G7 ]+ W2)active key
0 |' `. c- i& N# c" d( M& Z* q8 q' JPrivate key:5KNzFCbToz2a9Hztz9Qen5cyJcM3x5Wpq4GFiTYZgGhzntXdmYo  `0 J$ A) u' o! N. d
Public key: EOS5EdsvESpibWLJxupTqod1nswJnbiXQZuUcLiAWEEsqcZskymeB
' M' u  _/ b- r; O! c9 {# c; i  f. kEOSC不会保存生成的私钥
% }* o9 p& O$ N6 q- D$ d% p因为后续测试智能合约需要,我们创建一个名为currency的账号。目前这个版本,所有的账户都需要用已有账户来创建,所以我们用inita账户的owener key和active key来创建currency。 为了使inita获得发送交易的权限,需要先导入inita的私钥到钱包。(参见私钥导入钱包的步骤)( R4 i: w& s; }4 c3 U% `; c7 F
docker exec docker_node1_1 eosc create account inita currency EOS6NpEqWi177VKQkuJQL9V6Y3LqAAp9C2j9 @- r/ U  |; m8 G4 T, B
执行成功,会输出一串json的交易信息,打印账户创建相关内容
, u; p4 `& v! b3 j" k3 ~我们可以查询inita可以创建了哪些用户
6 a. y9 r7 q( H" m$ A' T- pdocker exec docker_node1_1 eosc get servants inita7 g# e( O+ N0 S
{
( Z8 N1 @4 A( I: w# I8 c"controlled_accounts": [
  e9 b3 [; U4 |: P0 i# ?"currency"! i; D6 a% E' R% P
]
3 ^$ r" E5 Q/ s9 ]: m& A3 q}
3 N' w$ x& v$ I/ T8 T* a% ^内置转账* y3 l; _1 J1 e: j& X
创建账户之后,可以查看当前账户的状态,可以看到创建的测试账号没有余额,这样不少功能无法测试,我们需要试着给创建账户添加一些余额
( q  \, f( W9 i( C' t0 r* xdocker exec docker_node1_1 eosc get account currency5 o4 n; p: @% b* k( L+ Y7 j5 a
{
. y# ]( |7 x- B4 U  "name": "currency",
5 g* g9 t5 \# Q5 ^$ d- ?  "eos_balance": "0.0000 EOS",
0 F/ ~5 d% Y- k( a) G+ X5 W  "staked_balance": "0.0001 EOS",
6 q: [# S1 T( ]1 [4 O0 M% I  "unstaking_balance": "0.0000 EOS",
" e/ `1 U: }0 }0 T  "last_unstaking_time": "1969-12-31T23:59:59",% h5 k/ y# Q. P2 d7 J7 _
  "permissions": [{
! M7 j! c# ?7 d4 g/ c0 ?      "name": "active",
0 z* F! J! f2 g  t+ ^! Z$ t      "parent": "owner",2 N! b6 f# s) J4 j
      "required_auth": {
% r! r1 a6 w/ n! ]  x3 o, i        "threshold": 1,6 o0 z! y: h. a  j* t- q
        "keys": [{* E1 @% |7 d. y! @* X/ q
            "key": "EOS8ff42NMpJUybVj3nwUSnPpc3mMysKxyE4HVJy1E5o3fQv7knWf",
/ V: [/ d, ~1 [$ v            "weight": 1
* _' Z* i) ]6 X2 R0 Y- k+ A          }6 v/ s. H7 a2 Z4 g2 d& m$ \
        ],6 _: e$ O6 {' T% F) Z( N
        "accounts": []
1 Z5 c7 S( _1 T$ h3 c2 {      }( Y8 @  G6 h: x$ L
    },{
6 w1 I7 L, G: X; X. Z      "name": "owner",
* w8 R+ O4 Q- k7 ~4 m      "parent": "owner",, D, {! S0 B+ R6 x/ J
      "required_auth": {
4 j' i6 |+ d. B- @5 c  n5 N9 V        "threshold": 1,
  C$ h; F8 b) h% n. i4 p, |        "keys": [{' P* j" K% k8 g9 A5 ^1 U' [
            "key": "EOS5fQ4saiHV426EQ7AKrGoD2AVMBYe77bnGSq42JjXBUfipv7o3E",0 w9 p4 R4 {# U. u
            "weight": 1
; _$ ^9 n: C1 U0 l- }1 E1 A8 L          }
/ d  I% u; V' p1 ^        ],* P. o5 H, ]  P- q% [# P5 M: j9 W
        "accounts": []
9 T7 j8 q+ O; Z  |      }
3 G2 V9 }8 x' p0 p    }- z" s. T; W1 C1 q0 z1 m) S& j
  ]# {/ Y) Z% c2 ]/ p/ [
}
% v, H; K2 |, B) ^+ k保存全网余额的创世账号是eos,查询余额状态2 D6 i3 d( N& S7 r0 j1 R* b5 H  I# ^4 J
docker exec docker_node1_1 eosc get account eos5 i2 x* B. e6 P3 C5 ?
{
( g' {. K4 I: s9 \5 Z: F$ L  "name": "eos",
+ B; j+ ?7 X/ \$ x5 b  G  "eos_balance": "69000000.0000 EOS",
4 N) s% d7 V0 u8 V# e0 P# G1 ]$ Q  "staked_balance": "0.0000 EOS",
/ ^% u8 G0 l+ q  "unstaking_balance": "0.0000 EOS",! O# ?+ R, H& S1 `
  "last_unstaking_time": "1969-12-31T23:59:59",- G4 ^9 z+ Q" q) B6 I# j' Z
  "permissions": [{
) u% I% P/ i4 U  S- U1 H# v      "name": "active",
4 J- c6 h1 ^3 x      "parent": "owner",; G( @: D7 G+ ~$ }- V+ W4 N
      "required_auth": {5 }: ^$ z; \, C
        "threshold": 1,/ c* I4 A9 N& V2 M, R
        "keys": [],* ?0 p' K% Q! R% ]/ Z
        "accounts": []4 O+ H; u& N0 E* A
      }
8 v7 W  E9 t5 L5 A# ]* A    },{
' p2 i! ~- P; ]& a# ?      "name": "owner",
8 p* j; o/ @" ^& @- q& y% e+ R7 ^9 P5 g      "parent": "owner",
+ X+ |/ k  D3 F* C) W* ]      "required_auth": {
0 x* |0 o+ t: q6 w+ a: f. f        "threshold": 1,
$ G/ ?( Q1 R, j4 ?: o0 P) [+ |- B/ q' D        "keys": [],- v2 A  f0 C3 C  V% e! n" Y0 u
        "accounts": []
2 }- u9 ]) j& B' t" N, Y1 F      }
5 S9 z! D9 A8 }# x    }
+ Z1 Z" j2 S# v( R( `; j+ p  ]
4 }& ^" q$ ~0 l: l% {}
- p( \# D( ?0 o; M5 s& s4 U我们可以通过创世块定义的创世账户使用EOSC给当前创建的账户转移余额
9 P2 c+ r. ]# F1 c: }4 Ndocker exec docker_node1_1 eosc transfer inita currency 100000000' H( L4 I. K% d( R6 l
{* o) L1 Q  }  U2 w
  "transaction_id": "59575b8caf08eac7c00eb7483c048f12d0e7abf1ede839c3b2ed41dc6c5c7c5f",; F/ X! L6 ]( I! x) e" {# g
  "processed": {5 |  }8 v/ g5 `% u) ?, @0 ^* J
    "refBlockNum": 24199,. s7 P# s7 g* G
    "refBlockPrefix": 1485651173,( v! r4 i9 k9 M' Q3 A6 w. [
    "expiration": "2017-09-29T02:31:03",
) ?' ~  X! D# {2 K# \9 c3 \+ {    "scope": [
% w  f5 m- w( _/ c/ P      "currency",
1 H6 R+ v1 F( t2 V; B      "inita"
" M" A" n' y8 @    ],
3 h7 T' \- u+ G) ?. O- f    "signatures": [6 {* p" Z) Y% E% B% y
      "1f14229bdd4bfb927021bf96ff0651c8b0fa5666e9f5cf423a0270a1b91f2d2f690b573e179d8475ce2c6b160f5cd5507d58a44f8f6cf536348584efa8dd62ade0"1 ]3 M. ~& n& b  M) X
    ],
2 s- x7 c# }4 b1 E! E    "messages": [{6 v) o- ^1 I- k
        "code": "eos",
* n" B4 g/ K, A5 V# B        "type": "transfer",
# L- G) f0 i& @3 O  H+ {" Q) l        "authorization": [{
  D' t1 N! S+ A: v/ P            "account": "inita",$ G/ A- Y9 }  G/ z  G0 H" t! @
            "permission": "active"
  Q" R( d5 h% W* o. |0 v, d* e& Q          }7 Z7 |, s! ~" x" m' s
        ],
4 U, P+ Y0 y( [/ P% D2 X9 F+ t$ e        "data": {7 Q" B' W- u6 o0 T% A
          "from": "inita",
5 M7 ]6 G* U0 P, G) a$ i( k          "to": "currency",0 O# i4 V7 F2 J0 @
          "amount": 100000000,
& f) x5 Q3 X- N1 Q/ Y' _$ R2 ~# `          "memo": ""
  D" X+ B! b3 G/ J+ z  V: c  y/ H        },' D3 \9 \* l$ P* g2 ~0 C' ]
        "hex_data": "000000000093dd740000001e4d75af4600e1f5050000000000"6 ^6 \; g9 ~4 ^! a
      }
8 A. A2 q  e- _4 W9 e    ],
1 A( }, n/ M* Z6 L4 r, }( Y+ ^    "output": [{! f1 h  d$ W* I& F5 C, B, |
        "notify": [{
  E3 e! ~; {6 ?) [  \  X& n7 n! R            "name": "currency",3 P" R& a- w/ B3 q. Z$ s9 l
            "output": {
5 ~6 Z: q) u5 i4 w              "notify": [],% x5 c) v) l2 x+ G, H& t
              "deferred_transactions": []8 T* X3 ]& r- y# b' \/ _
            }* ?. V% Z6 O6 a
          },{
, f+ j1 C! n  x            "name": "inita",
0 X. w, ~2 f, g0 S. x            "output": {
. [' F" p7 n! }: {) ]6 T              "notify": [],
9 u0 g3 |+ h' \2 J2 P# D0 M2 |0 M9 q              "deferred_transactions": []- J6 u) S/ D! [3 f
            }
; O6 I4 I, [% @: q6 m/ H! ~5 ?          }
# [& n/ H0 I3 [- h        ],9 x! t3 P& A$ r8 d# d! O4 v4 l
        "deferred_transactions": []
8 O8 j, c6 B4 @4 b/ M# M      }) C4 l7 _9 V3 H0 ]6 k, N; J% c2 ~
    ]
* z) G3 V6 m& V' _  }
4 \$ r  a! _2 I' ?3 P7 P}
7 q  p0 B9 Q6 f* i1 t1 a; p* T+ e再通过执行get account 命令,验证余额已经成功转移到创建的账户下
# c2 b( \3 U. M2 r  E3 \查询交易历史
5 c' z3 J: z3 C9 Z查询交易历史会使用到插件account_history_api_plugin,我们已经在config.ini中定义* e2 a! n! o, Z; T" g% H. i
docker exec docker_node1_1 eosc get transaction 6 N: b  l1 b' v, G7 p( d" i* s
如果需要查询一个特定账户最近一次的交易记录
1 s) q0 t7 D( o' pdocker exec docker_node1_1 eosc get transaction inita6 D7 D8 ^  {" E8 t$ r3 @  w
创建智能合约1 t  p6 z3 A8 y2 F" T
官方提供了一个示例合约currency,我们依然使用EOSC来创建并部署智能合约,合约代码位置contracts/currency。1 D! T; c& h0 Q0 `* N
1)为合约创建一个所有者账户。前文已经创建了currency账户: n% ~3 m$ |: p0 @& B* R3 T
2)检查区块链上有无同名合约
* w- B- E5 a8 n  wdocker exec docker_node1_1 eosc get code currency 8 ?6 H4 B# i: N1 r
code hash: 0000000000000000000000000000000000000000000000000000000000000000
, s2 j' y* i! S* U7 @# Z, Q3)为了获得部署权限(发送交易请求)需要将currency的active key导入到钱包中3 K# Z9 Y( w1 m
4)部署合约(.wast后缀文件)和他的abi(.abi后缀文件); E* k/ O% `4 `+ H$ Z
docker exec docker_node1_1 eosc set contract currency ../../contracts/currency/currency.wast ../../contracts/currency/currency.abi6 m" u7 Y  K* d6 H* J9 _
Reading WAST.... [4 F/ {3 y# t9 ~. K
Assembling WASM...' y* x3 {$ o, B7 Z/ E8 W) b* o$ x" j
Publishing contract...
! J: ~  t  L$ c4 ?$ K3 p* Z1 S屏幕打印部署成功相关的信息,并查询合约hash4 k" W% d) F( ?/ p( v
docker exec docker_node1_1 eosc get code currency
6 D# T2 T2 ^( ?) M. y  [code hash: c4023f74b3c7a3321d1641e4111b13584078fa7265c6ab12e1c19ff7ee800faf
; l! g# [* n3 B8 Q调用合约
% z; d- u4 l! H, ]$ R在合约部署到区块链上之后,所有的currency余额会分配给我们创建的currency账户。我们可以调用合约测试做一些转账交易。+ U0 N5 V; I% m$ G" ^) f/ ^
为了更好了解区块链合约的调用方式,我们可以通过.abi查看可以执行的操作列表和消息结构。
8 X  z! J+ u  Ydocker exec docker_node1_1 eosc get code -a currency.abi currency4 ^7 R, k* x* h  L2 G7 O
code hash: c4023f74b3c7a3321d1641e4111b13584078fa7265c6ab12e1c19ff7ee800faf: n+ o( w( ]1 C% X- U' d# W/ g
saving abi to currency.abi
* C7 R) S; _5 [/ P5 S1 w, |cat currency.abi #查看
& Y% b  ]9 G7 r. [{: B' z' `% e3 a! U1 @. f
  "types": [{
5 n9 N* L3 `8 y0 J! D  f0 {      "newTypeName": "AccountName",
) \, T" E  k7 }7 q+ l; Q0 ?      "type": "Name"* E. V+ P4 {, a3 i
    }
1 P8 }; D& }( {  m  ],
0 ?1 I4 V* p# V: q  "structs": [{
6 Y, s2 g- @& k, |# ]) o9 e4 z      "name": "transfer",, \% s5 |3 V2 [8 |5 M, M( `# k0 F0 t
      "base": "",
. G  U! E' |$ r# ~& w      "fields": {
% F. e2 o2 \# L. N7 a. e        "from": "AccountName",
! n) c, P( F( g4 R* n8 q        "to": "AccountName",
" I3 K1 M) o& O8 H& p* W        "amount": "UInt64"
/ [0 A+ f8 ?2 n      }
/ R! R: }  z, V( y( n7 W    },{; @5 l: Y- G- d' i. b+ k1 K
      "name": "account",
# Y& S) j# r+ W      "base": "",+ J( L/ [+ W( k" K7 Y
      "fields": {
' m$ K4 |1 ?7 X  @4 a        "account": "Name",$ d4 l1 w- q/ k7 N! E
        "balance": "UInt64"
$ r* X  S# A' J+ o" _/ K+ M      }
' u3 [, d: H8 F2 b    }
4 E, D  V/ Y% p0 Q  i. G  ]," s8 m# \/ Z9 z# ]
  "actions": [{' }( m# ~6 z. h: N! o# V
      "action": "transfer",
+ {. D/ Y; f6 T8 v0 f4 p      "type": "transfer"
0 w7 X7 D" _9 c' z8 m$ n) e2 q$ a/ Y2 k    }
9 |' Y& k# C; L' k% j  ],5 {& a4 p8 i, U8 {9 |; N5 V+ P
  "tables": [{2 P+ M  H) n. e+ ]1 ~9 @
      "table": "account",
" @  Z1 Y1 v" o      "type": "account",
2 I5 F( s, _% o5 g9 g' i3 D9 y+ S      "indextype": "i64",! M7 R/ }3 S5 r
      "keynames" : ["account"],
* J8 I& W" O) _  _      "keytypes" : ["Name"]
5 T) Y/ [! K9 V    }
3 ?& e6 M: s, i8 _  ]
" G% j/ v( O' o}$ F$ T, v% n' m
通过上面的abi我们可以看到currency合约可以执行transfer操作,消息格式为from,to和amount。我们调用合约从currency账户转移50个余额到inita账户5 Z; w8 y# Q/ n1 `" q
docker exec docker_node1_1 eosc push message currency transfer '{"from":"currency","to":"inita","amount":50}' --scop5 S, P/ f& v) _3 [# u1 G
执行完成,我们查询余额验证结果
' r7 G7 |* R1 a5 D2 qdocker exec docker_node1_1 eosc get table inita currency account: a  g1 Q1 _8 [
{
6 f% s1 w, B: c/ s+ w! n  "rows": [{- a  k, X1 X2 R& y8 ?9 \0 u
      "account": "account",
) |. Z( B3 W- p3 V5 F      "balance": 50
% y; |* {- |: ?/ d/ D9 M) P6 N% c       }
! S) |! r9 y3 G) z1 x8 W8 o    ],: _" W- b5 z  w9 E
  "more": false
& b$ ]& K# h9 ]7 K* E3 F, t}! W- b2 Z; h6 G5 x0 n
docker exec docker_node1_1 eosc get table currency currency account) T( k# I$ E3 T7 l  I' e- W* K2 c& c; H
{
' W8 m# W4 y0 Z* s. ~* R  "rows": [{3 M5 H5 q7 o# `0 q) c
      "account": "account",
  Q( X. f' Y4 `( i& \# O1 b! B      "balance": 999999950
$ v9 w. o+ ^1 u( D    }
. {* S- \$ Y6 X; P& Q  ],
1 q7 t! N+ ?1 F  "more": false
& \! \2 r3 e1 f  |1 ~6 m}( W- S) P/ O5 m( \2 b
余额不足的账户尝试转账,会提示失败' E3 ]: `, G$ W' f1 ~
docker exec docker_node1_1 eosc push message currency transfer '{"from":"tester","to":"inita","amount":50}'-S inita -S tester -p tester@active" d) f" P1 U) {/ z# _( j
3543610ms thread-0 main.cpp:271 operator() ] Converting argument to binary...
, v/ u4 m8 r) d! U) L3543615ms thread-0 main.cpp:311  main ] Failed with error: 10 assert_exception: Assert Exception
' q  I4 P* H4 x+ }% c2 D  Qstatus_code == 200: Error : 10 assert_exception: Assert Exception
. ?" X7 x% O7 D# C. ntest: assertion failed: integer underflow subtracting token balance2 }1 X. F3 @; x
{"s":"integer underflow subtracting token balance","ptr":176} thread-1 wasm_interface.cpp:248 assertnonei32i32 [...snipped...]  e) P# m1 f" Y. [8 H
查询合约
# u% l) D5 p& Q0 L9 s$ W+ x' }8 {! U如上文验证步骤,在调用完合约后,可以通过查询表来验证每个帐户持有的余额。
( O1 b0 k+ X: a  Mdocker exec docker_node1_1 eosc get table currency currency account
; s" T, C8 m7 x2 k2 [6 x连接特定节点0 r! q& q" Q: t. p
默认情况下,EOSC连接本地端口8888的节点。可以通过指定主机地址和端口来连接其他EOSD节点。同样的,钱包服务也可以指定特定的主机地址和端口。( G. O  G9 D' b: Q
docker exec docker_node1_1 eosc --host  --port 1 H. C4 Y6 A, Q; G4 S( W
链接独立钱包服务
8 }3 a+ G) A/ U) E* c) k! F; S, A% _1 k除了使用EOSD内置的钱包服务,也可以独立部署钱包服务
# A: P1 _1 V2 j! w/ i; Udocker exec docker_node1_1 eos-walletd --http-server-endpoint host:port% `9 _3 j4 ?$ L" p
调用独立钱包服务需要添加如下选项! d: ~/ \; j" J$ I5 [+ _
docker exec docker_node1_1 eosc --wallet-host --wallet-port
' v( ~" L3 ]$ ?3 p* [: y9 E免签名验证  X6 b/ p$ S+ B7 W1 f9 x) T
开发者如果需要快速测试功能,可以跳过节点签名的步骤,这样可以解耦密码学的问题而关注应用功能/ X& o. K8 [6 P. C3 i5 L
启动时使用特定参数5 @. B6 i1 B. A* q! ^' R" X
eosd --skip-transaction-signatures
1 [2 u+ i: E5 ~5 a- h3 GEOSC调用时添加-s 选项
+ x4 J2 [, N. N  o/ sdocker exec docker_node1_1 eosc   -s
9 `* y  d/ f5 G其他RPC调用; B% q* I( o- i. D+ r1 h
EOSD RPC 包含通过HTTP RPC与eosd和注册其上的插件进行调用的方式.8 p1 \5 N: n! h" P& I
1)区块链API 配置* r+ }8 v3 O  J0 C
想要查询eosd信息需要启用plugin = eos::chain_api_plugin插件并添加至config.ini中
2 B( L3 E" z% b  l, \+ X2)get_info接口用于查询区块链的基础信息5 Z8 R" |$ W4 ?! C; T
curl http://127.0.0.1:8888/v1/chain/get_info # @5 M& J& Z( ]) Y' Y
返回结果如下:9 ^$ B4 o! z/ Q# L/ l
{"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"}
& D* p' O0 C! s1 X1 n0 t: j. Nget_block接口用于查询区块相关信息
+ s0 v0 k) \* s7 b% s; r% `4 O% v
2 Z! N- ]2 o1 w. zcurl  http://localhost:8888/v1/chain/get_block -X POST -d '{"block_num_or_id":5}'
" c+ \) ~  P* L1 s1 i1 C0 `curl  http://localhost:8888/v1/chain/get_block -X POST -d '{"block_num_or_id":0000000445a9f27898383fd7de32835d5d6a978cc14ce40d9f327b5329de796b}'" j- u4 `  D. A. q, ~, L. ^$ S
返回结果如下:
! J" x# G" a) S3 I; W! a% t; y{"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}
( K' B) `1 Q$ e( h! R$ I' m: B  p4)push_transaction接口,调用合约交易1 ]5 ~" z, @: X3 A7 ~
该调用为JSON格式并会将结果更新到区块链上
* n# ^) O2 M4 e$ Q执行正确的结果返回
: d% r! u9 [, I; {5 A返回 HTTP 200 和交易ID号! I1 z3 V. J# e' ^2 Q/ X$ w) c9 m
{
4 ^  ~( H) I1 n'transaction_id' : "..." 1 S  D2 ^! t# c1 N6 e
}
) B5 a; k8 {3 P) f执行错误的结果返回,一般为400错误(参数错误)或者500错误
2 ?9 y/ D  L0 R9 V8 [# bHTTP/1.1 500 Internal Server Error
( _& h, K4 ^: p% ~9 @4 x: bContent-Length: 1466
( f6 `/ p, J% f, b. ?...error message..1 I' {- L. N0 N7 l: p$ j
push_transaction 调用方法
; R" o  v! L4 d6 j: qcurl  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":[]}'6 |$ n) P5 x; f
此示例模拟一个转账交易。 refBlockNum和refBlockPrefix使用的前例block查询的结果
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

罗宾虚汉 初中生
  • 粉丝

    3

  • 关注

    0

  • 主题

    16