Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
我们将介绍一个使用EOS智能合约构建hello World的例子。8 e6 ?9 v7 f, h4 j6 S, n
一般环境设置通过上一篇文章已经说明,这方面的问题大家可以看本博客上一篇文章,本文引用了官方EOS在Git上的示例。
  I! E6 J6 R  X: e" ^2 T$ g运行nodeos
' a: y% H, }- _要通过Hello World日志进行验证,请使用contracts-console选项运行它。; L8 i" @' Y/ v4 O! C5 F9 L' J
nodeos --contracts-console0 C$ R2 \% k6 ?( `* P  x, f0 Y
生成智能合约
# @5 l, B  t0 @6 m! @5 G让我们尝试通过一个不同的新的终端上(除了nodeos的终端之外)访问EOS目录,创建一个名为Hello的文件夹。命令如下:: {4 N9 J, H  h/ I
$ cd eos
# t$ j% U" e/ \' b2 j4 I2 N% V$ cd mkdir hello
, X* C, X4 Z9 j) ]8 s$ cd hello. c. E# D& g. e. i* k  i
然后,创建hello.cpp文件并复制下面的示例。Hello合约继承了EOS.IO提供的合约,并具有打印出用户名Hello的功能。
/ A( |: b& y4 W; w# E! U1 E! P编译代码
. q$ i) w* N( W  o# u对于第一个命令,让我们用WebAssembly编译代码。编译时,可能会提示警告(但我们可以忽略它)。对于第二个命令,让我们创建ABI。
7 C3 A$ _: t% l9 k! Z% R2 f7 K) l
4 T" g: x% s+ [
# Compile webaassembly' s$ g: d7 K, ^/ u8 Y0 A+ u
eosiocpp -o hello.wast hello.cpp. v1 o8 J9 A3 A
# Creating abi
" ?' s/ \( z$ ^, |: d7 Eeosiocpp -g hello.abi hello.cpp( u" V' r' N0 o! t/ Z
帐户创建和合约发布
/ ]  v. ~9 m  @7 L7 X创建一个名为Hello.Code的帐户。我们将进一步使用这个帐户发布Hello合约。9 `" O5 T) ~6 F6 g% m
用cleos set contract ${account} ${path} -p ${permmition}命令发布合约。( q5 ]  e: g) W2 @8 B6 A/ q
$ cleos create account eosio hello.code EOS8QMGRoRPZ4uf3w8WACcrg3wKzLtXpCk5Gpia6pdFzSuftLigWT EOS8QMGRoRPZ4uf3w8WACcrg3wKzLtXpCk5Gpia6pdFzSuftLigWT
( C: z) t6 {$ {' Y* iexecuted transaction: e6847fc85c7733dd70a9ff27c2cad98ea0b50fb6c80c2b0c7ea1bf64f9917916  200 bytes  225 us
& C2 R( b# U+ E2 ]( |5 }3 a4 d$ Q#         eosio " v/ [; @/ \! z" V7 J
调用函数
4 I& s/ c7 i( G, R让我们调用hello类的hi函数。它可以用下面的命令来完成:
8 F$ H( W1 y$ o) M6 Pcleos push action ${contract_name} ${function} ${[argument]} -p ${permission}
! z9 a. T& Y8 H3 g在下面的示例中,hello.code合约中的用户帐户调用hi函数。
. D: J  s& @" Y, k' t" Y$ cleos push action hello.code hi '["user"]' -p user! n) C# l6 U, z; d& Y
executed transaction: d7932d1ee61ab6b0fed1f9e20d4a2e2607b029763aeaf1daea4ed718d2885797  104 bytes  500 us( D# i! H0 C! r7 D( C9 d+ f9 t
#    hello.code 0 m+ p8 k, ~5 ~; c7 r3 X$ Q
结果1 I+ M6 W+ r$ `
在nodeos终端中执行交易的块中添加了以下输出。hello是名为hi函数的用户的名字。3 e: I8 g* [. ?( A* M6 a# c
2703777ms thread-0 apply_context.cpp:28 print_debug ]2 p! O2 Z7 X& L. R( |
[(hello.code,hi)->hello.code]: CONSOLE OUTPUT BEGIN =====================
5 Z2 \1 Q6 m) p+ _1 Z; ?, pHello, user
8 M/ V1 u/ t0 @1 n* e[(hello.code,hi)->hello.code]: CONSOLE OUTPUT END =====================; {2 H/ l# b- I. V
授权运行请求* h& ?1 J# C' K# L7 ~
替换为包含授权请求调用hi函数。# P2 e; h( ?9 Q; X( C( i

* O( n1 m; F: \: l( n结果0 i( E0 w, i+ Z+ K  V; A& D# P
当我们试图用一个未经授权的帐户调用它时,会出现一个错误(如下)。使用授权帐户,它正常输出无错误。! A& V; R2 v, e1 N4 W0 k) T

% s8 h3 r+ w& b5 j8 O# Authorized, R; \' C- ]9 c& k5 I9 _' C
$ cleos push action hello.code hi '["tester"]' -p user) r; D( O) d- @
Error 3090004: missing required authority
9 W) R( S: T2 }% Y0 u. y( D' r( x# Unauthorized
. G0 a' y. T" l! p4 J9 W5 Z0 k& X  F$ cleos push action hello.code hi '["tester"]' -p tester
  A& q" c4 G4 R6 d  [; J+ j8 Rexecuted transaction: 16a34c27c7d162dc3940358197306df619911fb930cbddd6d208125a770886f4  104 bytes  243 us
1 ^( J1 M8 @! o3 T; d) N#    hello.code " `. e" {/ \; ~- p/ r' c
可以在nodeos的块中按如下方式打印日志:
' g- v' I5 i% E. t) B( W( H6 G2525788ms thread-0   http_plugin.cpp:405           handle_exception     ] FC Exception encountered while processing chain.push_transaction
, T  M) l! H5 e5 P" Q0 i- F2 n* E2525788ms thread-0   http_plugin.cpp:406           handle_exception     ] Exception Details: 3090004 missing_auth_exception: missing required authority8 F# D2 J' l. }6 P! j; p
missing authority of tester {"account":"tester"}2 Z+ E! ^7 t7 H# T' P' r) H% f
thread-0  apply_context.cpp:132 require_authorization {"_pending_console_output.str()":""}. \( Y/ X) }9 B' c4 n$ H/ j* e. b
thread-0  apply_context.cpp:62 exec_one
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

蓝天天使2017 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    10