合约库样例:定义一个合约类,并导出该类作为合约库,供其它智能合约代码调用。
class Student2 { //定义一个类Student2
constructor(name, sex, age) {
this.name = name;
this.sex = sex;
this.age = age;
}
toString() { //自定义格式化输出,可供执行结果链上存储
return 'The Student v2 is ' + this.name + ', and sex is ' + this.sex + ',age is ' + this.age;
}
}
export {Student2} //声明Student2可被其它合约代码导入使用,关键语句。如果缺失,Student2无法被其他合约导入使用。
注:合约库编译后的字节码部署上链发布之后,发布者将获得该合约库的区块链地址(超块链区块地址三元组和区块哈希),调用合约可以通过该区块地址导入合约库。
合约过程样例:导入已部署在区块链上的合约库,调用执行创建Student2实例,调用另一个智能合约过程,最后输出运算结果。
contract.importas( //导入要调用的合约库
[443,1,1],
"d1cad57bab030f3e897f322242e8706591f3d1aff0757a555115372859cd762d",
"StudentEx"
);
let st1 = new StudentEx.Student2('Tom','male', 18);
let st2 = contract.call([3,2,6], '');//调用区块[3,2,6]中的合约过程
st1.toString() + "\n" + st2.toString();//执行结果格式化输出
注:contract合约类用于合约代码的模块化组织,是超块链智能合约语言的基础类之一,它提供importas方法导入合约库,call方法调用其它合约过程。
contract类的声明如下:
class contract {
JSValue importas(
vector<int> tripleaddr,
const std::string& localblkhash,
const string& modulename
);
JSValue call(
vector<int> tripleaddr,
const std::string& localblkhash
);
};
注:其中,importas方法的参数中,
- tripleaddr为超块链中子链区块的三元组地址,方法从指定的区块中获取合约模块导入到当前合约中供后续调用使用。
- localblkhash是三元组地址对应的区块hash,用于区块校验,也可以留空。
- modulename是导入合约库的别名,可任意设定为字符串,用于解决多个合约库间可能的名字冲突,避免执行结果异常。
其中,call方法,用于直接运行指定区块中的合约过程;
此外,合约过程执行完成后,执行结果可通过语句st1.toString() + “\n” + st2.toString();实现格式化输出,应用程序可通过Paralism节点接口将合约过程提交到Paralism节点的虚拟机中运行,提交的合约过程字节码和格式化输出的执行结果在执行完成后将由节点自动提交上链存储。