Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
我们将介绍一个使用EOS智能合约构建hello World的例子。
& u. p: a# c. @9 H& B; z( t一般环境设置通过上一篇文章已经说明,这方面的问题大家可以看本博客上一篇文章,本文引用了官方EOS在Git上的示例。2 l1 d% O+ {( z9 y! `8 y
运行nodeos
* Q. f3 t. O: R8 O) g; ~- G: v/ y要通过Hello World日志进行验证,请使用contracts-console选项运行它。
5 i" }' s% M0 R6 Enodeos --contracts-console. b, Q/ W; j3 f! R
生成智能合约
# k, E+ R+ }0 e1 B6 o5 C让我们尝试通过一个不同的新的终端上(除了nodeos的终端之外)访问EOS目录,创建一个名为Hello的文件夹。命令如下:
8 ?* }3 |# ~( s8 j/ y" |' y$ cd eos
0 u" ^  [0 \: b. `$ cd mkdir hello+ ~9 b  n9 {5 B( _
$ cd hello
+ U- M9 D, U& L! w* P  o: H然后,创建hello.cpp文件并复制下面的示例。Hello合约继承了EOS.IO提供的合约,并具有打印出用户名Hello的功能。
4 X) E' z! R' i6 r编译代码
, D1 X$ u; r; c" L; _+ f/ i) N1 Y对于第一个命令,让我们用WebAssembly编译代码。编译时,可能会提示警告(但我们可以忽略它)。对于第二个命令,让我们创建ABI。* a0 q6 Q% ~4 ]. k3 B: o
: S; R1 s0 i1 _; f, d0 r. g0 D" y3 Y
# Compile webaassembly
( S- e! v( Y6 r% peosiocpp -o hello.wast hello.cpp
& [6 v: a6 w% J1 x4 J# Creating abi
$ N7 R. s' V/ v' O9 \7 Heosiocpp -g hello.abi hello.cpp
! E  l0 j5 {; U; W4 B+ V3 C9 W' j帐户创建和合约发布
" O( H: z8 |: s: m: G( a9 w创建一个名为Hello.Code的帐户。我们将进一步使用这个帐户发布Hello合约。. X0 \& a2 E: |- p
用cleos set contract ${account} ${path} -p ${permmition}命令发布合约。, K$ M4 t; ~$ [- G
$ cleos create account eosio hello.code EOS8QMGRoRPZ4uf3w8WACcrg3wKzLtXpCk5Gpia6pdFzSuftLigWT EOS8QMGRoRPZ4uf3w8WACcrg3wKzLtXpCk5Gpia6pdFzSuftLigWT( @7 ?# i0 H( v6 Y! _
executed transaction: e6847fc85c7733dd70a9ff27c2cad98ea0b50fb6c80c2b0c7ea1bf64f9917916  200 bytes  225 us0 ^4 S$ X3 Z& z! ~
#         eosio
' N7 m8 k- x# h: s4 }  V8 l调用函数+ n7 y' v/ _% u$ S- X
让我们调用hello类的hi函数。它可以用下面的命令来完成:) ?' r. ?% z; [
cleos push action ${contract_name} ${function} ${[argument]} -p ${permission}% t0 f% u0 w. m/ v$ z6 [( V
在下面的示例中,hello.code合约中的用户帐户调用hi函数。
$ \: C# @/ `' y$ cleos push action hello.code hi '["user"]' -p user
6 ?( m8 L+ `1 G3 a7 cexecuted transaction: d7932d1ee61ab6b0fed1f9e20d4a2e2607b029763aeaf1daea4ed718d2885797  104 bytes  500 us, ~/ ~% }3 p  k) u# K9 S* C
#    hello.code ! ]6 ~, f4 Y/ H) c( E# S
结果% x- m8 B  I, q3 Z
在nodeos终端中执行交易的块中添加了以下输出。hello是名为hi函数的用户的名字。
* V0 I+ m4 O# T& w0 @# i8 U: n2703777ms thread-0 apply_context.cpp:28 print_debug ]& I' S& D  K' U9 {) \/ p
[(hello.code,hi)->hello.code]: CONSOLE OUTPUT BEGIN =====================) s: L  z6 Q! d
Hello, user* L5 K5 \( \9 I. F; {
[(hello.code,hi)->hello.code]: CONSOLE OUTPUT END =====================# D4 p7 a9 H. \  p5 X7 F+ I3 o
授权运行请求
% r, H0 E6 s) o5 i! _替换为包含授权请求调用hi函数。% X' n7 p2 L; y' D
" a; u% [8 e* h. z7 F
结果
% I* g+ \: s/ H! [- z9 f8 p% V2 @当我们试图用一个未经授权的帐户调用它时,会出现一个错误(如下)。使用授权帐户,它正常输出无错误。
7 V0 B. P0 r6 c( _0 ]) P
/ b( o' {% H4 _  L& E8 Y2 o8 a- K
# Authorized# O1 b4 j( j: W4 ]$ V& {
$ cleos push action hello.code hi '["tester"]' -p user/ E3 r( J3 }) J. r9 u; H4 m
Error 3090004: missing required authority
$ L. V# B" |, t, g  m0 s: c# Unauthorized  E3 X* t- K  M  r: n( a  Q* C' I
$ cleos push action hello.code hi '["tester"]' -p tester$ e! i& p$ u0 {+ K
executed transaction: 16a34c27c7d162dc3940358197306df619911fb930cbddd6d208125a770886f4  104 bytes  243 us7 j  J$ p$ o6 Z! k/ G0 b
#    hello.code 3 T( O8 g7 E; b
可以在nodeos的块中按如下方式打印日志:! C  T- z* V7 H  c
2525788ms thread-0   http_plugin.cpp:405           handle_exception     ] FC Exception encountered while processing chain.push_transaction
  v. {& @9 g  |9 L1 l2525788ms thread-0   http_plugin.cpp:406           handle_exception     ] Exception Details: 3090004 missing_auth_exception: missing required authority2 j( S& m: t1 G/ _; i7 b& Q' ]+ Z/ I
missing authority of tester {"account":"tester"}9 s9 U0 L5 W: k9 z/ l( |
thread-0  apply_context.cpp:132 require_authorization {"_pending_console_output.str()":""}6 Z) U1 U& w8 I
thread-0  apply_context.cpp:62 exec_one
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

蓝天天使2017 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    10