Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
01 导语- E9 c6 |& N, o+ @8 L. \+ C& a! v
上一期我们介绍了合约升级 API,讲述了如何销毁和迁移智能合约。本期我们讨论如何跨合约静态调用。API 只有一个,用法如下:
- ^) S1 u5 y( l0 i. h
( p3 q& e% l0 D# u+ \下面我们具体讲述一下这个 API 的使用方法。在这之前,小伙伴们可以在本体智能合约开发工具 SmartX 中新建一个合约,跟着我们进行操作。同样,在文章中我们将给出这次讲解的所有源代码以及视频讲解。
- p* w. B/ p3 G! f
& h  _7 Q) H. C! b) c. U02 RegisterAppCall 使用方法
, K' V5 s. ^7 ]7 q( d) A3 Q使用 RegisterAppCall 函数前同样需要引入,可以通过下面的语句实现:% y) \, h  T# f/ q7 G4 A) s
from ontology.interop.System.App import RegisterAppCall
7 o( g7 D* n: a, ?RegisterAppCall API 有三个参数。分别对应目标合约、目标方法和方法需要的参数。我们准备两个智能合约——合约 A 与合约 B。接下来我们通过合约 A 来静态调用合约 B 的功能函数。5 w1 G" O& o+ i6 n/ \
合约 A 的代码如下:
$ g0 `* e5 s: r6 @
  1. from ontology.interop.System.App import RegisterAppCall
    4 G3 ?4 {! }, g1 P* a
  2. from ontology.interop.System.Runtime import Notify
    , U# C: x& U/ m" R* x+ g
  3. HelloWorld = RegisterAppCall('028de32923bcc21e8a5485e4b0e81eff2d9ba08e', 'operation', 'args') # 定位被调用的合约,执行静态调用
    & \3 Q9 x9 k( m4 n8 e( E
  4. def Main(operation, args):. @* h1 [# e# h+ u+ P& Q9 h1 i
  5.     if operation == "CallHello":9 d4 \5 D  T* B
  6.         opt = args[0]
    # `+ {6 P' N, _( u0 h  t5 P
  7.         msg = args[1]2 R1 s3 e# T9 w5 L- l4 ^8 ~3 J% q
  8.         return CallHello(opt, msg)/ A. b* t; f: }5 r
  9.     return False! V- S6 T& y& M' E1 A6 p
  10. def CallHello(opt, msg):
    7 R: O) @/ G% u& s6 n& ]5 f
  11.     return HelloWorld(opt, [msg])
复制代码
5 q7 V0 T6 @) m) \9 }! v/ b
合约 B 是最简单的 Hello World 合约,合约 A 将调用合约 B 中的 Hello 函数。  B: G& `) b+ c% X  L
特别注意:需要先部署合约 B,获取合约 B 的合约哈希,并当作合约 A 中RegisterAppCall 函数的参数写入。
$ j- H; F2 P, s: e  b
  1. def Main(operation, args):
    8 y) i4 k9 y+ u2 E# Y; x2 X$ N. B
  2.     if operation == 'Hello':! h" a- z/ A3 c
  3.         msg = args[0]: H; L, Y" I) z, R7 _' c4 i/ z
  4.         return Hello(msg)8 H/ ]0 |, }' V% M; h' \
  5.     return False
    0 a" `6 A! S8 f# T3 ^' _) V
  6. def Hello(msg):( @* g4 n/ |$ p- O' R" ]/ D! `
  7.     return msg
复制代码
2 A2 ?" P. D7 f* p. a. n
03 SmartX 示例
! S' |2 B4 r) f% P部署合约 B,得到其合约哈希为028de32923bcc21e8a5485e4b0e81eff2d9ba08e;
- z& {( k# C* Z+ h/ Q将合约哈希写入合约 A 中的 RegisterAppCall 参数中;( y  m3 L+ ?. B+ _2 y
部署合约 A;
: ?/ x9 [1 L/ L4 Q( S运行 CallHello 函数
4 b# j3 h& U! `# i* B! s' l" |点击「运行预执行」,返回68656c6c6f20776f726c64(Hello World 十六进制字符串),表示调用成功。
4 L8 }6 n* g/ U& G9 Q& q3 O. ~
' q$ S: ]- k( R) i3 f5 S. X04 总结1 G% E/ `- [/ W% {4 R  J& [
本次技术视点中我们介绍了如何跨合约静态调用,开发者可以准备两个智能合约——合约 A 与合约 B,通过合约 A 来静态调用合约 B 的功能函数。4 o/ Z: U! J) B9 A4 c- l1 u$ L0 h5 O
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

蓝天天使2017 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    10