Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
01 导语3 [" @) f8 E2 H2 s
上一期我们介绍了合约升级 API,讲述了如何销毁和迁移智能合约。本期我们讨论如何跨合约静态调用。API 只有一个,用法如下:' p/ {2 O  D, p
* w( x- A6 j, E3 F5 O
下面我们具体讲述一下这个 API 的使用方法。在这之前,小伙伴们可以在本体智能合约开发工具 SmartX 中新建一个合约,跟着我们进行操作。同样,在文章中我们将给出这次讲解的所有源代码以及视频讲解。& O5 K4 E" \+ z% X9 ?* u* Y
) T9 R' U5 S( V4 K. X. S
02 RegisterAppCall 使用方法
1 j: x$ U2 M# D使用 RegisterAppCall 函数前同样需要引入,可以通过下面的语句实现:
3 S' K( y4 a- z' Sfrom ontology.interop.System.App import RegisterAppCall
3 W+ h+ w, a7 Z9 K4 N3 Y$ A( Q; aRegisterAppCall API 有三个参数。分别对应目标合约、目标方法和方法需要的参数。我们准备两个智能合约——合约 A 与合约 B。接下来我们通过合约 A 来静态调用合约 B 的功能函数。3 t5 E4 A0 b7 N# o8 h' A
合约 A 的代码如下:9 z' n& M; x0 P9 `: M/ n
  1. from ontology.interop.System.App import RegisterAppCall
    - N9 G: O7 `: g6 @) N9 B
  2. from ontology.interop.System.Runtime import Notify; L1 v4 n& l& B8 X. V! \: I) y
  3. HelloWorld = RegisterAppCall('028de32923bcc21e8a5485e4b0e81eff2d9ba08e', 'operation', 'args') # 定位被调用的合约,执行静态调用
    9 o- K& B' ^7 n- l5 E! D
  4. def Main(operation, args):
    % K9 P. _. P9 S. G6 m; a. \
  5.     if operation == "CallHello":
    - d' j& M" Z9 Q3 v0 [
  6.         opt = args[0]8 g: Z8 U' R% W' z" I4 L
  7.         msg = args[1]' Q3 e& d' V# c$ G
  8.         return CallHello(opt, msg)
    ; ~- `1 t' ~9 B3 _6 \) {
  9.     return False
    % ^0 o5 S. r5 {# j! \
  10. def CallHello(opt, msg):
    # r: `& d7 W8 B  d
  11.     return HelloWorld(opt, [msg])
复制代码
/ ]9 P$ v. r0 p. \, ]+ ?; u+ D
合约 B 是最简单的 Hello World 合约,合约 A 将调用合约 B 中的 Hello 函数。
0 v7 j9 b& S2 J/ d- P特别注意:需要先部署合约 B,获取合约 B 的合约哈希,并当作合约 A 中RegisterAppCall 函数的参数写入。1 v7 J- a4 W7 W
  1. def Main(operation, args):+ e6 P  u* m) ^, ?9 b. L' i+ h
  2.     if operation == 'Hello':
    * `8 l! o* a+ }* _2 ]
  3.         msg = args[0]
    , I; Z2 Q) ~, q/ h, M6 A7 i& J3 A
  4.         return Hello(msg)
    5 c8 O. W& h) l7 L
  5.     return False
    5 Q4 E+ Z/ W; M1 s' d
  6. def Hello(msg):$ i% e5 P, Y5 H' x8 X
  7.     return msg
复制代码

1 @. N% y) u5 s) D1 A03 SmartX 示例
$ E1 G0 j" T6 F- u+ d! v部署合约 B,得到其合约哈希为028de32923bcc21e8a5485e4b0e81eff2d9ba08e;" Y; }" _+ x8 d0 T
将合约哈希写入合约 A 中的 RegisterAppCall 参数中;" x! I) N1 G7 q, T  w. ?8 Z' N2 t
部署合约 A;
4 @+ Z/ f! I4 Q' s/ f7 t运行 CallHello 函数: B# M0 w0 A  W7 b. n. u+ [
点击「运行预执行」,返回68656c6c6f20776f726c64(Hello World 十六进制字符串),表示调用成功。) D7 [2 d, H% V
* q2 m8 y- q4 A0 Y
04 总结
$ u0 r% E$ I. w  i$ U) u本次技术视点中我们介绍了如何跨合约静态调用,开发者可以准备两个智能合约——合约 A 与合约 B,通过合约 A 来静态调用合约 B 的功能函数。: D+ O7 u. _9 o* R6 h/ b+ ^
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

蓝天天使2017 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    10