上一期我们介绍了合约升级 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 使用方法
使用 RegisterAppCall 函数前同样需要引入,可以通过下面的语句实现:
from ontology.interop.System.App import RegisterAppCall
RegisterAppCall API 有三个参数。分别对应目标合约、目标方法和方法需要的参数。我们准备两个智能合约——合约 A 与合约 B。接下来我们通过合约 A 来静态调用合约 B 的功能函数。3 t5 E4 A0 b7 N# o8 h' A
合约 A 的代码如下:9 z' n& M; x0 P9 `: M/ n
- from ontology.interop.System.App import RegisterAppCall
- from ontology.interop.System.Runtime import Notify; L1 v4 n& l& B8 X. V! \: I) y
- HelloWorld = RegisterAppCall('028de32923bcc21e8a5485e4b0e81eff2d9ba08e', 'operation', 'args') # 定位被调用的合约,执行静态调用
- def Main(operation, args):
- if operation == "CallHello":
- opt = args[0]8 g: Z8 U' R% W' z" I4 L
- msg = args[1]' Q3 e& d' V# c$ G
- return CallHello(opt, msg)
- return False
- def CallHello(opt, msg):
- return HelloWorld(opt, [msg])
合约 B 是最简单的 Hello World 合约,合约 A 将调用合约 B 中的 Hello 函数。
特别注意:需要先部署合约 B,获取合约 B 的合约哈希,并当作合约 A 中RegisterAppCall 函数的参数写入。1 v7 J- a4 W7 W
- def Main(operation, args):+ e6 P u* m) ^, ?9 b. L' i+ h
- if operation == 'Hello':
- msg = args[0]
- return Hello(msg)
- return False
- def Hello(msg):$ i% e5 P, Y5 H' x8 X
- return msg
03 SmartX 示例
部署合约 B,得到其合约哈希为028de32923bcc21e8a5485e4b0e81eff2d9ba08e;" Y; }" _+ x8 d0 T
将合约哈希写入合约 A 中的 RegisterAppCall 参数中;" x! I) N1 G7 q, T w. ?8 Z' N2 t
部署合约 A;
运行 CallHello 函数: B# M0 w0 A W7 b. n. u+ [
点击「运行预执行」,返回68656c6c6f20776f726c64(Hello World 十六进制字符串),表示调用成功。) D7 [2 d, H% V
* q2 m8 y- q4 A0 Y
04 总结
本次技术视点中我们介绍了如何跨合约静态调用,开发者可以准备两个智能合约——合约 A 与合约 B,通过合约 A 来静态调用合约 B 的功能函数。: D+ O7 u. _9 o* R6 h/ b+ ^