Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
我们将介绍一个使用EOS智能合约构建hello World的例子。
0 Z: T, d; {% Q% n一般环境设置通过上一篇文章已经说明,这方面的问题大家可以看本博客上一篇文章,本文引用了官方EOS在Git上的示例。2 c2 j. F6 F% o+ e& Z/ H
运行nodeos4 @7 b' r5 ?/ a
要通过Hello World日志进行验证,请使用contracts-console选项运行它。
* x/ ]4 q$ z" Z- Wnodeos --contracts-console, S5 q2 T5 y% B# \* F% [
生成智能合约
" q  c  E. L& P4 T+ h) p让我们尝试通过一个不同的新的终端上(除了nodeos的终端之外)访问EOS目录,创建一个名为Hello的文件夹。命令如下:/ N2 p8 L  P: \
$ cd eos" V# H' b% v. }9 t/ v) O! j
$ cd mkdir hello5 s# B/ U- G# u
$ cd hello8 F% F. N: G5 b3 K
然后,创建hello.cpp文件并复制下面的示例。Hello合约继承了EOS.IO提供的合约,并具有打印出用户名Hello的功能。& a7 W9 l; H: p& O
编译代码; x# K) U9 a+ W5 V- U+ \
对于第一个命令,让我们用WebAssembly编译代码。编译时,可能会提示警告(但我们可以忽略它)。对于第二个命令,让我们创建ABI。
3 n; ]+ B( M0 i6 K( L4 n4 ?7 Q2 s) ^
$ n$ d  S7 O$ V. I
# Compile webaassembly( e) @; t! p& w
eosiocpp -o hello.wast hello.cpp
; L7 b# o" ?: v- _" X. E# Creating abi. E6 T& D+ D+ e, @5 f
eosiocpp -g hello.abi hello.cpp
" j3 z$ j% f% P/ X$ [7 T8 W7 G- Q帐户创建和合约发布
- P  }$ ~+ m7 y创建一个名为Hello.Code的帐户。我们将进一步使用这个帐户发布Hello合约。/ p0 @3 i2 S' Q1 N3 D9 y, q6 s
用cleos set contract ${account} ${path} -p ${permmition}命令发布合约。
7 P0 l3 _6 h, Z0 ?$ cleos create account eosio hello.code EOS8QMGRoRPZ4uf3w8WACcrg3wKzLtXpCk5Gpia6pdFzSuftLigWT EOS8QMGRoRPZ4uf3w8WACcrg3wKzLtXpCk5Gpia6pdFzSuftLigWT$ ]9 P0 j3 T1 n  V3 j& a$ z* X3 @( p
executed transaction: e6847fc85c7733dd70a9ff27c2cad98ea0b50fb6c80c2b0c7ea1bf64f9917916  200 bytes  225 us
$ w9 {' D. F& }#         eosio   Y5 A5 E& R5 F( K
调用函数
2 }) k+ x5 f1 \4 R0 {) Z! y让我们调用hello类的hi函数。它可以用下面的命令来完成:
2 F# s+ v: }) k2 M3 v  L) qcleos push action ${contract_name} ${function} ${[argument]} -p ${permission}
0 I' l' ^( ]+ F* K0 Y" a' S# g在下面的示例中,hello.code合约中的用户帐户调用hi函数。# T8 L' Q* c: d2 r
$ cleos push action hello.code hi '["user"]' -p user" @3 L* ?, x9 h, I. J- e9 F
executed transaction: d7932d1ee61ab6b0fed1f9e20d4a2e2607b029763aeaf1daea4ed718d2885797  104 bytes  500 us2 t4 I" L  B- X9 l( m
#    hello.code
# |8 V* B$ U7 Z' @( {* K9 s结果0 Z$ f& s( I# a7 r
在nodeos终端中执行交易的块中添加了以下输出。hello是名为hi函数的用户的名字。
8 C( h$ t& u, f# b, A7 g! m2703777ms thread-0 apply_context.cpp:28 print_debug ]
. r$ a, t0 w5 B! F, a7 l6 p5 @7 [[(hello.code,hi)->hello.code]: CONSOLE OUTPUT BEGIN =====================' C  t, N+ `) S% {1 k
Hello, user. j+ u8 n/ C2 ^8 V: f
[(hello.code,hi)->hello.code]: CONSOLE OUTPUT END =====================9 p& x; e8 X+ S6 a3 H) X
授权运行请求) w! v  m0 {: r1 [/ |3 f) `. V2 f
替换为包含授权请求调用hi函数。6 @, x9 X) y% o. H
9 D' R  C7 l; y% P6 G
结果
* c  T: G5 n1 z当我们试图用一个未经授权的帐户调用它时,会出现一个错误(如下)。使用授权帐户,它正常输出无错误。; @$ T: e; I# C6 f9 I

  {! l3 o( ?& K( `; P/ A# Authorized
# W3 Z* ~4 v+ E6 g( L$ cleos push action hello.code hi '["tester"]' -p user
7 I) B, q$ A' w1 Q9 @Error 3090004: missing required authority
  q7 t$ `6 Q' W# Unauthorized
& x8 X* y" D8 F6 Q: g$ cleos push action hello.code hi '["tester"]' -p tester* A0 k, @; H0 r" o' w! K/ v% w; Z
executed transaction: 16a34c27c7d162dc3940358197306df619911fb930cbddd6d208125a770886f4  104 bytes  243 us
+ M' G. r; v6 K#    hello.code ' D* k, J) Y* h, i. u  c
可以在nodeos的块中按如下方式打印日志:: ?4 q$ w* C; w8 {" F( z
2525788ms thread-0   http_plugin.cpp:405           handle_exception     ] FC Exception encountered while processing chain.push_transaction' w) B/ y  J. [% O7 ]% f3 P
2525788ms thread-0   http_plugin.cpp:406           handle_exception     ] Exception Details: 3090004 missing_auth_exception: missing required authority4 z& m+ e/ j6 ]& ^
missing authority of tester {"account":"tester"}
1 M9 u$ E) M( |) {8 [& ithread-0  apply_context.cpp:132 require_authorization {"_pending_console_output.str()":""}
: c' c  F! ?! d5 b: o' ithread-0  apply_context.cpp:62 exec_one
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

蓝天天使2017 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    10