Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
01 导语, S" S6 F7 G% ?+ f. Z6 c" r2 _
上一期我们介绍了合约升级 API,讲述了如何销毁和迁移智能合约。本期我们讨论如何跨合约静态调用。API 只有一个,用法如下:- c5 u4 Q6 S9 T
$ x* P& ^; S2 d1 w$ t
下面我们具体讲述一下这个 API 的使用方法。在这之前,小伙伴们可以在本体智能合约开发工具 SmartX 中新建一个合约,跟着我们进行操作。同样,在文章中我们将给出这次讲解的所有源代码以及视频讲解。
; m( X$ L, c/ F6 i& ^
: i' u- r, e# P. ^% _4 Z02 RegisterAppCall 使用方法
! K8 a! G& G8 I* x$ D0 N7 g# F使用 RegisterAppCall 函数前同样需要引入,可以通过下面的语句实现:
  r- K8 y6 a- [, `from ontology.interop.System.App import RegisterAppCall) \4 R4 c! F; v. u
RegisterAppCall API 有三个参数。分别对应目标合约、目标方法和方法需要的参数。我们准备两个智能合约——合约 A 与合约 B。接下来我们通过合约 A 来静态调用合约 B 的功能函数。6 }: M/ X& m3 C) ~8 [* D1 Q9 y
合约 A 的代码如下:
6 ~! G2 h+ J3 o! `2 l8 H2 Y
  1. from ontology.interop.System.App import RegisterAppCall
    6 D; a4 q! n9 s) e1 E/ U% y4 v; b
  2. from ontology.interop.System.Runtime import Notify0 x% Z7 Y8 W" N5 b' C1 d" x8 h
  3. HelloWorld = RegisterAppCall('028de32923bcc21e8a5485e4b0e81eff2d9ba08e', 'operation', 'args') # 定位被调用的合约,执行静态调用
    % Z: D; s9 Z0 H+ ]% K$ g% Q" K4 r
  4. def Main(operation, args):  D+ w' w& B8 \# @# N1 L( u% I0 D
  5.     if operation == "CallHello":  ?; `/ S! t1 l/ l0 F* y
  6.         opt = args[0]- l7 G0 f% q8 q. U; Q1 c
  7.         msg = args[1]
    * |3 d' F9 E, ]1 k8 K6 ]% \
  8.         return CallHello(opt, msg)3 C' A: |) ]4 Y+ K6 S! q) G
  9.     return False
    9 R6 b: P+ r- c1 |) ^; F! L
  10. def CallHello(opt, msg):
    6 J  C" s$ T, l' Y; l/ j
  11.     return HelloWorld(opt, [msg])
复制代码
  s1 y5 S$ T8 a# S
合约 B 是最简单的 Hello World 合约,合约 A 将调用合约 B 中的 Hello 函数。
# R8 R# Y# t8 k6 Y' y: L特别注意:需要先部署合约 B,获取合约 B 的合约哈希,并当作合约 A 中RegisterAppCall 函数的参数写入。
1 \& i, z  N, h
  1. def Main(operation, args):7 b$ x9 o  f  K( e( N$ {
  2.     if operation == 'Hello':0 M6 e- S* j% g% m( \) l5 z) n' |: ]
  3.         msg = args[0]
    3 n0 w: {+ }9 Q
  4.         return Hello(msg)1 Z# q9 x" J. R, l3 ?
  5.     return False5 ?' T: y+ W% ^( q% T
  6. def Hello(msg):6 y' l% H+ M2 A4 x3 e
  7.     return msg
复制代码

3 u) X) w6 n: K5 V  y6 K+ _$ y03 SmartX 示例
4 E0 b) z0 v" r: R) o# B部署合约 B,得到其合约哈希为028de32923bcc21e8a5485e4b0e81eff2d9ba08e;( T3 [" T; G) g# {3 ]5 A5 S
将合约哈希写入合约 A 中的 RegisterAppCall 参数中;
& [! l7 X  V! h( [" L部署合约 A;+ A% L0 N' y0 x$ i1 ?/ [
运行 CallHello 函数
: }8 Z2 P2 z* @2 B7 L点击「运行预执行」,返回68656c6c6f20776f726c64(Hello World 十六进制字符串),表示调用成功。
! t& g  M/ J' N$ X
$ v  h4 ]& q/ R% N04 总结+ i9 p, q. B; R& [* C4 s
本次技术视点中我们介绍了如何跨合约静态调用,开发者可以准备两个智能合约——合约 A 与合约 B,通过合约 A 来静态调用合约 B 的功能函数。7 O/ G! v/ b. F, K9 J
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

蓝天天使2017 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    10