调用合约

要调用一个已完成部署的合约,您需要指定被调用的方法,这个方法被称为合约接口,如 合约编译 示例中的 hi 方法。并非所有的方法都可以称为合约接口,将一个方法定义为合约接口需要满足下列条件:

  • 将方法定义为 public。

  • 使用 INTERFACE 宏修饰。

  • INTERFACE宏导出的方法,其返回值类型只支持 可序列化数据类型

  • 在合约外使用 INTERFACE_EXPORT 宏导出。

下面分别介绍 INTERFACEINTERFACE_EXPORT 宏的使用方式。

INTERFACE 宏

INTERFACE 的使用形式如下:

INTERFACE 返回值类型 函数名(参数列表){
    //函数体
}

示例如下:

INTERFACE int64_t add(int64_t x, int64_t y) {
  int64_t z = x + y;
  return z;
}

INTERFACE_EXPORT 宏

INTERFACE_EXPORT 的使用方式如下:

INTERFACE_EXPORT(合约名,(方法1)(方法2)...(方法n))

示例:

/*hello.cpp*/
#include <mychainlib/contract.h>
using namespace mychain;

class hello:public Contract {
public:
    INTERFACE int64_t add(int64_t x, int64_t y) {
        return x + y;
    }

    INTERFACE int64_t sub(int64_t x, int64_t y) {
        return x - y;
    }
};

INTERFACE_EXPORT( hello, (add)(sub))

INTERFACE_EXPORT 导出方法仅支持以下类型的参数:

  • int8_t

  • uint8_t

  • int16_t

  • uint16_t

  • int32_t

  • uint32_t

  • int64_t

  • uint64_t

  • bool

  • std::string

  • Identity

  • std::vector<T>(“T”仅限于上面的类型,如 std::vector<int8_t>

说明

注意:INTERFACE_EXPORT导出的方法,不允许重载。