Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
01 导语
! v& o' F+ w( @6 K) p& I% `上一期我们介绍了合约升级 API,讲述了如何销毁和迁移智能合约。本期我们讨论如何跨合约静态调用。API 只有一个,用法如下:+ G: T. H4 H8 z4 ]
+ G2 y. R+ f' Q/ q
下面我们具体讲述一下这个 API 的使用方法。在这之前,小伙伴们可以在本体智能合约开发工具 SmartX 中新建一个合约,跟着我们进行操作。同样,在文章中我们将给出这次讲解的所有源代码以及视频讲解。3 Z" i* r8 h/ e7 b" ]9 k& V. y! @
8 v/ ]8 M- D5 c  i  \
02 RegisterAppCall 使用方法
9 T9 J/ c8 V3 t7 L使用 RegisterAppCall 函数前同样需要引入,可以通过下面的语句实现:
0 J1 {& U, ]: v* sfrom ontology.interop.System.App import RegisterAppCall
: }1 W. E1 V7 \/ zRegisterAppCall API 有三个参数。分别对应目标合约、目标方法和方法需要的参数。我们准备两个智能合约——合约 A 与合约 B。接下来我们通过合约 A 来静态调用合约 B 的功能函数。
9 q+ F# Z3 }; j  s合约 A 的代码如下:! s: x8 {/ A$ [
  1. from ontology.interop.System.App import RegisterAppCall% r+ ?3 P2 D2 p8 R8 D, J$ A+ t
  2. from ontology.interop.System.Runtime import Notify
    6 T) m+ g, {  d+ T! J5 ?
  3. HelloWorld = RegisterAppCall('028de32923bcc21e8a5485e4b0e81eff2d9ba08e', 'operation', 'args') # 定位被调用的合约,执行静态调用
    2 ^8 a0 K; X" E( Z8 `! V, i
  4. def Main(operation, args):
    . t( f5 J# i$ c# r8 d7 I& y
  5.     if operation == "CallHello":
    # ?7 Q6 M% d! T! S1 J" A1 C+ W
  6.         opt = args[0]1 M- s, H- I7 Y. T+ T5 S
  7.         msg = args[1]' U4 S. K4 n2 O0 I' F
  8.         return CallHello(opt, msg)" Q9 e: r% ?7 f6 u# V6 G, G
  9.     return False7 [6 ?+ q' \- x' S6 }, U) P
  10. def CallHello(opt, msg):
    ; `/ @' ^* I- P3 P
  11.     return HelloWorld(opt, [msg])
复制代码
7 _( z7 }8 r, H, e% c5 N
合约 B 是最简单的 Hello World 合约,合约 A 将调用合约 B 中的 Hello 函数。
7 m( ]% o  {0 U% Y* O, t( [4 A特别注意:需要先部署合约 B,获取合约 B 的合约哈希,并当作合约 A 中RegisterAppCall 函数的参数写入。
" ~- R6 m* }" _3 b/ _) Z$ X
  1. def Main(operation, args):$ J8 A: [0 f, V8 U0 d
  2.     if operation == 'Hello':
    5 r+ @" ]0 f# c& x, t
  3.         msg = args[0]
      \9 C2 m" {7 g- V7 f
  4.         return Hello(msg)
    1 e5 X; ]1 t% L& W$ v
  5.     return False
    & R- c* t  B' l5 j! g/ X
  6. def Hello(msg):
    6 Q8 q" h6 t/ u  I- |3 N! x
  7.     return msg
复制代码

2 F+ G! L! J3 G03 SmartX 示例
( d; P2 V5 S/ [7 ?5 n4 h/ E9 _2 r部署合约 B,得到其合约哈希为028de32923bcc21e8a5485e4b0e81eff2d9ba08e;
' Z$ T# M/ \! c2 d4 k7 F6 |将合约哈希写入合约 A 中的 RegisterAppCall 参数中;
1 p2 \8 F& Z8 p$ C部署合约 A;/ {( X6 l7 l( d& f" m$ j
运行 CallHello 函数* M4 o; f8 n* a
点击「运行预执行」,返回68656c6c6f20776f726c64(Hello World 十六进制字符串),表示调用成功。. X3 F( v" z9 V  T9 O7 J
7 p) d+ m- u( A- X
04 总结
! [; h) O' t9 Q9 v: h本次技术视点中我们介绍了如何跨合约静态调用,开发者可以准备两个智能合约——合约 A 与合约 B,通过合约 A 来静态调用合约 B 的功能函数。: W, i* L  M/ X! d
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

蓝天天使2017 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    10