1.本发明涉及区块链技术领域,特别是指一种跨区块链引擎的智能合约生成方法及系统。
背景技术:
2.联盟链是一种带有权限控制和准入控制的区块链,它由多个组织或机构共同管理,对等记录交易数据,只有加入的组织机构和其成员才能访问账本。因联盟链带有权限及准入控制,在企业及组织应用中比较广泛。在区块链中,业务逻辑代码通常被称为智能合约。智能合约是运行在区块链网络上的一种以编程方式定义和执行交易的代码,它们自动执行合约中设定的规则和条件。不同的联盟链都有自己的设计理念和架构体系,在各自的实现层面存在差异。如区块链开源底层软件平台和开源的企业级许可分布式账本平台,都有各自的智能合约接口约束,无法兼容对方。如果用户需要同时使用这两个联盟链,则需要分别开发智能合约,以适应不同的联盟链。
3.这种针对单一联盟链智能合约的开发方式具有时间成本高、适应性低的缺点。
技术实现要素:
4.本发明要解决的技术问题是提供一种跨区块链引擎的智能合约生成方法及系统,以解决针对单一联盟链的智能合约的开发方式具有的时间成本高、适应性低的问题。
5.为解决上述技术问题,本发明的技术方案如下:
6.一种跨区块链引擎的智能合约生成方法,包括:
7.接收业务智能合约,所述业务智能合约是根据通用抽象层智能合约接口和用户提交的通用智能合约依赖包生成的;
8.获取多个区块链引擎中的目标区块链引擎的实现依赖包;
9.根据编译指令和所述实现依赖包,对所述业务智能合约进行编译处理,生成与所述目标区块链引擎匹配的智能合约部署包;
10.将所述智能合约部署包部署于所述目标区块链引擎运行。
11.进一步地,所述通用抽象层智能合约接口包括:智能合约业务接口以及智能合约访问上下文接口;所述智能合约业务接口和所述智能合约访问上下文接口分别具有:统一的智能合约请求响应数据格式,统一的区块信息格式,统一的交易者发起者数据格式以及统一的交易格式。
12.进一步地,所述智能合约业务接口包括:初始化接口、升级接口以及调用接口;
13.所述智能合约访问上下文接口包括:账本的读写接口、历史数据的操作接口、交易发起人信息查询接口和区块信息解析接口。
14.进一步地,获取多个区块链引擎中的目标区块链引擎的实现依赖包,包括:
15.获取多个区块链引擎中的目标区块链引擎的区块链引擎名称和对应的部署包名称。
16.进一步地,根据编译指令和所述实现依赖包,对所述业务智能合约进行编译处理,生成与所述目标区块链引擎匹配的智能合约部署包,包括:
17.根据目标区块链引擎名称和对应的部署包名称、编译指令中的编译参数,对所述业务智能合约的业务代码进行编译处理,生成与所述目标区块链引擎匹配的智能合约部署包。
18.进一步地,根据目标区块链引擎名称和对应的部署包名称、编译指令中的编译参数,对所述业务智能合约的业务代码进行编译处理,生成与所述目标区块链引擎匹配的智能合约部署包,包括:
19.若目标区块链为开源的区块链引擎,根据所述开源的区块链引擎的编译参数,对所述业务智能合约的业务代码进行编译处理,得到智能合约部署包。
20.进一步地,将所述智能合约部署包部署于所述目标区块链引擎运行,包括:
21.将所述智能合约部署包通过区块链即服务平台部署于开源的区块链引擎上运行。
22.根据本发明的另一个方面,提供了一种跨区块链引擎的智能合约生成系统,包括:
23.接收模块,用于接收业务智能合约,所述业务智能合约是根据通用抽象层智能合约接口和用户提交的通用智能合约依赖包生成的;
24.获取模块,用于获取多个区块链引擎中的目标区块链引擎的实现依赖包;
25.处理模块,用于根据编译指令和所述实现依赖包,对所述业务智能合约进行编译处理,生成与所述目标区块链引擎匹配的智能合约部署包;
26.部署模块,用于将所述智能合约部署包部署于所述目标区块链引擎运行。
27.本发明的上述方案至少包括以下有益效果:
28.本发明的上述方案,根据业务智能合约、编译指令和目标区块链引擎的实现依赖包,得到与目标区块链引擎匹配的智能合约部署包,将该部署包部署于目标区块链引擎运行,可以让智能合约开发者更聚焦于业务的实现,不用关心具体的区块链引擎细节,具有节约成本和提高效率的优点。
附图说明
29.图1是本发明实施例的跨区块链引擎的智能合约生成方法的步骤图;
30.图2是本发明一个实施例中统一智能合约实现的示意图;
31.图3是本发明一个实施例中统一智能合约实现架构的使用步骤图;
32.图4是本发明实施例中跨区块链引擎的智能合约生成系统的示意图。
具体实施方式
33.下面将参照附图更详细地描述本发明的示例性实施例。虽然附图中显示了本发明的示例性实施例,然而应当理解,可以以各种形式实现本发明而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本发明,并且能够将本发明的范围完整的传达给本领域的技术人员。
34.如图1所示,本发明的实施例提出一种跨区块链引擎的智能合约生成方法,包括以下步骤:
35.s1、接收业务智能合约,所述业务智能合约是根据通用抽象层智能合约接口和用
户提交的通用智能合约依赖包生成的;
36.s2、获取多个区块链引擎中的目标区块链引擎的实现依赖包;
37.s3、根据编译指令和所述实现依赖包,对所述业务智能合约进行编译处理,生成与所述目标区块链引擎匹配的智能合约部署包;
38.s4、将所述智能合约部署包部署于所述目标区块链引擎运行。
39.本发明实施例的上述方案,根据业务智能合约、编译指令和目标区块链引擎的实现依赖包,得到与目标区块链引擎匹配的智能合约部署包,将该部署包部署于目标区块链引擎运行,可以让智能合约开发者更聚焦于业务的实现,不用关心具体的区块链引擎细节,具有节约成本和提高效率的优点。
40.具体实施时,业务智能合约只需要实现通用接口的三个接口:初始化接口、升级接口和、调用接口。通过定义通用接口,可以确保业务智能合约的实现类按照规定的方法进行实现,以满足业务智能合约的初始化、升级和调用需求。同时,通过接口的多态性,可以方便地切换和扩展业务智能合约的实现类,以适应不同的业务场景和需求。智能合约开发者使用机器语言包提供的与运行环境进行交互包编写业务智能合约,用于操作账本,如保存数据、溯源数据、获取交易提交者信息等。用户可以根据业务需求操作账本等数据。
41.一个业务智能合约的具体实施例为:导入与运行环境进行交互包等,这些包提供了哈希、加密算法计算和交易提交等功能。定义结构体,用于实现业务智能合约的功能。通过通用接口的三个接口:初始化接口、升级接口和调用接口,在业务智能合约部署时调用初始化函数、业务智能合约升级时调用升级函数、根据不同的调用函数名称执行相应的逻辑。
42.本发明的一可选实施例中,s1中,所述通用抽象层智能合约接口包括:智能合约业务接口以及智能合约访问上下文接口;所述智能合约业务接口和所述智能合约访问上下文接口分别具有:统一的智能合约请求响应数据格式,统一的区块信息格式,统一的交易者发起者数据格式以及统一的交易格式。
43.具体实施时,所述智能合约业务接口包括:初始化接口、升级接口以及调用接口;
44.所述智能合约访问上下文接口包括:账本的读写接口、历史数据的操作接口、交易发起人信息查询接口和区块信息解析接口。
45.通用抽象层智能合约接口是一种标准化的接口,用于与不同的智能合约进行交互和通信。通用抽象层智能合约接口提供一种通用的方式,使用户能够在不同的区块链平台上编写智能合约,并且能够在这些平台上进行跨链操作和互操作性。通用智能合约依赖包包含了智能合约的核心功能,例如加密算法、统一交互数据格式、合约部署和调用等。业务智能合约根据通用抽象层智能合约接口和用户提交的通用智能合约依赖包生成,能够使最终得到的智能合约部署包部署于区块链网络中,实现不同区块链引擎的切换。
46.根据通用抽象层智能合约接口,用户可以编写符合接口规范的业务智能合约。这些业务智能合约可以使用通用智能合约依赖包中提供的工具和库来实现智能合约的核心功能,例如账本管理、日志输出、事件触发和权限控制等。但是,业务智能合约的具体实现方式可以根据区块链业务系统而改变,不仅仅依赖于通用抽象层智能合约接口和通用智能合约依赖包,还可以使用特定平台或框架提供的工具和库。
47.不同的联盟链引擎使用的证书密码学体系及其类型、证书相关接口有所不同,联盟链引擎的身份验证和访问控制是基于密钥体系,主要包括对称加密算法、非对称加密算
法和数字签名、哈希算法和密码学安全协议。联盟链引擎的账本数据格式不同,故支持的接口也不同;智能合约管理和生命周期不同,故智能合约的接口也不同。但是采集这两种区块链引擎包含证书密码学体系的证书结构数据,包含账本数据格式和账本数据接口等的智能合约操作逻辑数据,并进行抽象提取,得到通用的智能合约业务接口以及智能合约访问上下文接口,如统一的智能合约请求响应数据格式,统一的区块信息格式,统一的交易者发起者数据格式以及统一的交易格式,为后续生成与目标区块链引擎匹配的智能合约部署包做基础。
48.这里,智能合约依赖包可通过以下过程生成:
49.编译并启动区块链框架节点;设置该区块链框架节点的环境变量;
50.根据所述环境变量启动区块链框架节点;在区块链框架节点上创建合约帐号;基于该合约帐号创建合约工程;编译该合约工程,得到智能合约依赖包。
51.本发明的一可选实施例中,s2,包括:
52.获取多个区块链引擎中的目标区块链引擎的区块链引擎名称和对应的部署包名称。
53.每个区块链引擎的区块链引擎名称和对应的部署包名称是不同的,获取目标区块链引擎的区块链引擎名称和对应的部署包名称,是为了生成与目标区块链引擎匹配的智能合约部署包。如区块链开源底层软件平台的区块链引擎名称为chainmaker,对应的部署包可以从官方网站或官方包发布管理平台获取,得到依赖包和相关配置文件。
54.本发明的一可选实施例中,s3,包括:
55.根据目标区块链引擎名称和对应的部署包名称、编译指令中的编译参数,对所述业务智能合约的业务代码进行编译处理,生成与所述目标区块链引擎匹配的智能合约部署包。
56.不同的区块链引擎可能有不同的编译参数,如调试模式、性能优化、安全性配置、插件支持等。这些编译参数的具体设置和使用方式可能因不同的区块链引擎而异。需要根据与目标区块链引擎名称对应的编译参数生成智能合约部署包,保证部署包运行时的准确性和有效性。
57.本发明的一可选实施例s3中,若目标区块链为开源的区块链引擎,根据所述开源的区块链引擎的编译参数,对所述业务智能合约的业务代码进行编译处理,得到智能合约部署包。
58.对业务智能合约的业务代码进行编译处理时,首选需要选择编译器,具体是根据业务代码的编程语言,选择相应的编译器或解释器。区块链开源底层软件平台和开源的企业级许可分布式账本平台都可以使用go语言编写逻辑代码,因此,对业务代码进行编译处理时,可以选择go语言对应的编译器或解释器。然后设置编译参数,如区块链开源底层软件平台的编译参数可能包括调试模式、性能优化、安全性配置和插件支持等,开源的企业级许可分布式账本平台的编译参数可能包括编译模式、调试模式、支持的机器编写语言、安全性配置和网络配置等。之后执行编译命令,使用go语言对应的编译器,执行相应的编译命令来处理业务代码。之后处理编译错误,如果编译过程中出现错误,需要仔细检查错误信息并进行修正,常见的编译错误包括语法错误、类型错误、依赖错误等。最后生成智能合约部署包。
59.本发明的一可选实施例中,s4,包括:
60.将所述智能合约部署包通过区块链即服务平台部署于开源的区块链引擎上运行。
61.具体实施时,也可以将所述智能合约部署包通过区块链服务平台部署于区块链平台上运行。
62.具体实施时,可以将智能合约部署包发布到区块链服务平台进行部署,用户就可以实现在不同的联盟链引擎之间的无成本切换,且同步适配账本和证书体系,可以无感知进行区块链引擎切换。
63.如图2所示,以chainmaker(长安链)和fabric hyperledger(一个联盟链引擎)为例,本发明实施例中统一智能合约实现包括:
64.通用智能合约sdk接口(一组用于与智能合约进行交互的编程接口,提供了一系列方法和函数,用于连接、部署、调用和查询智能合约,使用通用智能合约sdk接口,用户可以根据自己的需求,连接到区块链网络,部署和调用智能合约,并与智能合约进行数据交互和事件监听):接口抽象层,为上层提供统一的智能合约实现和访问接口。主要有两个方向,一是智能合约接口,上层业务智能合约必须实现此接口;二是智能合约访问上下文接口,提供账本的读写,历史数据的操作,交易发起人信息查询,区块信息解析等接口。提供统一智能合约请求响应数据格式,无差异性的为上层智能合约提供更符合业务需求的数据格式; 统一区块信息格式,屏蔽了两种引擎的复杂底层区块信息定义,提供对业务智能合约更为友好易用的数据格式;统一交易者发起者数据格式,定义交易者信息,而不是直接提供底层的交易者证书信息,屏蔽了底层有差异的证书格式;统一交易格式,屏蔽复杂的底层交易数据格式,提供易用的交易数据格式。
65.chainmaker通用智能合约实现:通用智能合约sdk接口层的chainmaker链实现。
66.hyperledger通用智能合约实现:通用智能合约sdk接口层的fabric hyperledger链实现。
67.编译工具链:主要有两部分组成,一是编译工具,用于不同区块链引擎的智能合约部署包的编译,二是区块链引擎启动代码管理工具,不同的引擎及启动参数,提供不同的链启动代码,管理工具用于自动生成引擎依赖的启动代码。
68.如图3所示,统一智能合约实现架构的使用步骤包括:
69.安装工具链;
70.创建业务智能合约golang项目,并添加通用智能合约sdk包等依赖;
71.编写区块链业务代码,实现sdk定义的智能合约接口;
72.指定底层链类型,运行编译工具链生产部署包;
73.将部署包发布到baas(区块链服务平台)或者其他区块链环境进行部署。
74.本发明的上述实施例的一具体实现实例如下:
75.基于golang语言,核心层提供了通用智能合约sdk接口及数据格式定义。
76.智能合约接口,业务智能合约必须实现定义的接口,其定义如下:
77.type contract interface {
78.ꢀꢀꢀ
// init 智能合约初始化时被调用
79.ꢀꢀꢀ
init(stub contractstub) *response
80.ꢀꢀꢀ
// upgrade 智能合约升级时被调用
81.ꢀꢀꢀ
upgrade(stub contractstub) *response
82.ꢀꢀꢀ
// invoke 智能合约调用分发器
83.ꢀꢀꢀ
invoke(stub contractstub) *response
84.}
85.所有的智能合约响应都符合此格式:
86.type response struct {
87.ꢀꢀꢀ
//智能合约业务调用是否成功
88.ꢀꢀꢀ
success bool
ꢀꢀꢀ
`json:"success"`
89.ꢀꢀꢀ
//失败时的信息
90.ꢀꢀꢀ
message string `json:"message"`
91.ꢀꢀꢀ
//业务自定义错误码
92.ꢀꢀꢀ
code
ꢀꢀꢀꢀ
int
ꢀꢀꢀꢀ
`json:"code"`
93.ꢀꢀꢀ
//业务响应数据
94.ꢀꢀꢀ
data
ꢀꢀꢀꢀ
any
ꢀꢀꢀꢀ
`json:"data"`
95.}
96.交易发起者格式:
97.// committer 交易提交者数据
98.type committer struct {
99.ꢀꢀꢀ
//信息颁布者
100.ꢀꢀꢀ
issuer string
101.ꢀꢀꢀ
//名字
102.ꢀꢀꢀ
commonname string
103.ꢀꢀꢀ
//组织单位
104.ꢀꢀꢀ
orgtype string
105.ꢀꢀꢀ
//提交者归属的组织
106.ꢀꢀꢀ
org string
107.ꢀꢀꢀ
//提交者公钥
108.ꢀꢀꢀ
publickey crypto.publickey
109.}
110.交易数据格式:
111.// transaction 交易信息
112.type transaction struct {
113.ꢀꢀꢀ
key
ꢀꢀꢀꢀꢀꢀꢀ
string `json:"key"`
114.ꢀꢀꢀ
txid
ꢀꢀꢀꢀꢀꢀ
string `json:"tx_id"`
115.ꢀꢀꢀ
timestamp string `json:"timestamp"`
116.ꢀꢀꢀ
value
ꢀꢀꢀꢀꢀ
[]byte `json:"value"`
[0117]
}
[0118]
账本操作接口:
[0119]
type contractstub interface {
[0120]
ꢀꢀꢀ
// getfunction 获取当前的请求函数
[0121]
ꢀꢀꢀ
getfunction() string
[0122]
ꢀꢀꢀ
// getargs 获取请求函数的参数
[0123]
ꢀꢀꢀ
getargs() map[string][]byte
[0124]
ꢀꢀꢀ
// getstate 从状态数据库中查询给定键值的数据
[0125]
ꢀꢀꢀ
getstate(key string) ([]byte, error)
[0126]
ꢀꢀꢀ
// putstate 向状态数据库中写入给定键值的数据
[0127]
ꢀꢀꢀ
putstate(key string, value []byte) error
[0128]
ꢀꢀꢀ
// getcommitter 获取交易提交者
[0129]
ꢀꢀꢀ
getcommitter() (*committer, error)
[0130]
ꢀꢀꢀ
// gethistory 从账本中查询给定键值的历史交易数据
[0131]
ꢀꢀꢀ
gethistory(key string) ([]*transaction, error)
[0132]
ꢀꢀꢀ
// logger 返回日志对象
[0133]
ꢀꢀꢀ
logger() logger
[0134]
}
[0135]
一种具体fabric hyperledger联盟链contractstub接口 实现实例如下:
[0136]
type fabricstub struct {
[0137]
stub
ꢀꢀꢀ
shim2.chaincodestubinterface
[0138]
logger shim.logger
[0139]
}
[0140]
func newstub(stub shim2.chaincodestubinterface) shim.contractstub {
[0141]
return &fabricstub{
[0142]
stub:
ꢀꢀꢀ
stub,
[0143]
logger: &fabriclogger{level: shim.loglevelall},
[0144]
}
[0145]
}
[0146]
func (fabric *fabricstub) getfunction() string {
[0147]
fn, _ := fabric.stub.getfunctionandparameters()
[0148]
return fn
[0149]
}
[0150]
func (fabric *fabricstub) getargs() map[string][]byte {
[0151]
args := fabric.stub.getargs()
[0152]
if len(args) == 0 {
[0153]
return map[string][]byte{}
[0154]
}
[0155]
data := make(map[string][]byte)
[0156]
_ = json.unmarshal(args[0], data)
[0157]
return data
[0158]
}
[0159]
func (fabric *fabricstub) getstate(key string) ([]byte, error) {
[0160]
return fabric.stub.getstate(key)
[0161]
}
[0162]
func (fabric *fabricstub) putstate(key string, value []byte) error {
[0163]
return fabric.stub.putstate(key, value)
[0164]
}
[0165]
func (fabric *fabricstub) getsender() (*shim.sender, error) {
[0166]
clientid, err := cid.new(fabric.stub)
[0167]
if err != nil {
[0168]
return nil, err
[0169]
}
[0170]
cert, err := clientid.getx509certificate()
[0171]
if err != nil {
[0172]
return nil, err
[0173]
}
[0174]
committer := &shim.sender{
[0175]
name:
ꢀꢀꢀꢀꢀꢀ
cert.subject.commonname,
[0176]
type:
ꢀꢀꢀꢀꢀꢀ
"",
[0177]
orgname:
ꢀꢀꢀ
strings.join(cert.subject.organization, ","),
[0178]
publickey: cert.publickey,
[0179]
}
[0180]
return committer, nil
[0181]
}
[0182]
func (fabric *fabricstub) gethistory(key string) ([]*shim.transaction, error) {
[0183]
iter, err := fabric.stub.gethistoryforkey(key)
[0184]
if err != nil {
[0185]
return nil, err
[0186]
}
[0187]
defer iter.close()
[0188]
trans := make([]*shim.transaction, 0)
[0189]
for iter.hasnext() {
[0190]
tran, err0 := iter.next()
[0191]
if err0 != nil {
[0192]
return nil, err
[0193]
}
[0194]
trans = append(trans, &shim.transaction{
[0195]
key:
ꢀꢀꢀꢀꢀꢀꢀ
key,
[0196]
txid:
ꢀꢀꢀꢀꢀꢀ
tran.txid,
[0197]
timestamp: tran.timestamp.string(),
[0198]
value:
ꢀꢀꢀꢀꢀ
tran.value,
[0199]
})
[0200]
}
[0201]
return trans, nil
[0202]
}
[0203]
func (fabric *fabricstub) logger() shim.logger {
[0204]
return fabric.logger
[0205]
}
[0206]
type fabriclogger struct {
[0207]
level shim.loglevel
[0208]
}
[0209]
func (f *fabriclogger) setlevel(level shim.loglevel) {
[0210]
f.level = level
[0211]
}
[0212]
func (f *fabriclogger) debug(fmt string, args ...any) {
[0213]
if f.level 》 shim.logleveldebug {
[0214]
return
[0215]
}
[0216]
log.printf(fmt, args...)
[0217]
}
[0218]
func (f *fabriclogger) info(fmt string, args ...any) {
[0219]
if f.level 》 shim.loglevelinfo {
[0220]
return
[0221]
}
[0222]
log.printf(fmt, args...)
[0223]
}
[0224]
func (f *fabriclogger) warn(fmt string, args ...any) {
[0225]
if f.level 》 shim.loglevelwarn {
[0226]
return
[0227]
}
[0228]
log.printf(fmt, args...)
[0229]
}
[0230]
func (f *fabriclogger) error(fmt string, args ...any) {
[0231]
if f.level 》 shim.loglevelerror {
[0232]
return
[0233]
}
[0234]
log.printf(fmt, args...)
[0235]
}
[0236]
一种具体chainmaker联盟链contractstub接口实现实例如下:
[0237]
type chainmakerstub struct {
[0238]
method string
[0239]
logger shim.logger
[0240]
}
[0241]
func newstub(method string) *chainmakerstub {
[0242]
return &chainmakerstub{
[0243]
method: method,
[0244]
logger: &chainmakerlogger{level: shim.loglevelinfo},
[0245]
}
[0246]
}
[0247]
func (c *chainmakerstub) getfunction() string {
[0248]
return c.method
[0249]
}
[0250]
func (c *chainmakerstub) getargs() map[string][]byte {
[0251]
return sdk.instance.getargs()
[0252]
}
[0253]
func (c *chainmakerstub) getstate(key string) ([]byte, error) {
[0254]
val, err := sdk.instance.getstatefromkeybyte(key)
[0255]
if err != nil {
[0256]
return nil, err
[0257]
}
[0258]
if val == nil {
[0259]
return nil, errors.new("key not exits")
[0260]
}
[0261]
return val, nil
[0262]
}
[0263]
func (c *chainmakerstub) putstate(key string, value []byte) error {
[0264]
return sdk.instance.putstatefromkeybyte(key, value)
[0265]
}
[0266]
func (c *chainmakerstub) getsender() (*shim.sender, error) {
[0267]
org, _ := sdk.instance.getsenderorgid()
[0268]
role, _ := sdk.instance.getsenderrole()
[0269]
pk, _ := sdk.instance.getsenderpk()
[0270]
origin, _ := sdk.instance.origin()
[0271]
return &shim.sender{
[0272]
name:
ꢀꢀꢀꢀꢀꢀ
origin,
[0273]
type:
ꢀꢀꢀꢀꢀꢀ
role,
[0274]
orgname:
ꢀꢀꢀ
org,
[0275]
publickey: pk,
[0276]
}, nil
[0277]
}
[0278]
func (c *chainmakerstub) gethistory(key string) ([]*shim.transaction, error) {
[0279]
rs, err := sdk.instance.newhistorykviterforkey(key, "")
[0280]
if err != nil {
[0281]
return nil, err
[0282]
}
[0283]
trans := make([]*shim.transaction, 0)
[0284]
for rs.hasnext() {
[0285]
km, err0 := rs.next()
[0286]
if err0 != nil {
[0287]
return nil, err0
[0288]
}
[0289]
trans = append(trans, &shim.transaction{
[0290]
key:
ꢀꢀꢀꢀꢀꢀꢀ
km.key,
[0291]
txid:
ꢀꢀꢀꢀꢀꢀ
km.txid,
[0292]
timestamp: km.timestamp,
[0293]
value:
ꢀꢀꢀꢀꢀ
km.value,
[0294]
})
[0295]
}
[0296]
return trans, nil
[0297]
}
[0298]
func (c *chainmakerstub) logger() shim.logger {
[0299]
return c.logger
[0300]
}
[0301]
type chainmakerlogger struct {
[0302]
level shim.loglevel
[0303]
}
[0304]
func (dl chainmakerlogger) setlevel(level shim.loglevel) {
[0305]
dl.level = level
[0306]
}
[0307]
func (dl chainmakerlogger) debug(fmt string, args ...any) {
[0308]
if dl.level 》 shim.logleveldebug {
[0309]
return
[0310]
}
[0311]
sdk.instance.debugf(fmt, args...)
[0312]
}
[0313]
func (dl chainmakerlogger) info(fmt string, args ...any) {
[0314]
if dl.level 》 shim.loglevelinfo {
[0315]
return
[0316]
}
[0317]
sdk.instance.infof(fmt, args...)
[0318]
}
[0319]
func (dl chainmakerlogger) warn(fmt string, args ...any) {
[0320]
if dl.level 》 shim.loglevelwarn {
[0321]
return
[0322]
}
[0323]
sdk.instance.warnf(fmt, args...)
[0324]
}
[0325]
func (dl chainmakerlogger) error(fmt string, args ...any) {
[0326]
if dl.level 》 shim.loglevelerror {
[0327]
return
[0328]
}
[0329]
sdk.instance.errorf(fmt, args...)
[0330]
}
[0331]
智能合约开发者使用shim包提供的contractstub接口,用于操作账本,如保存数据、溯源数据、获取交易提交者信息等。用户可以根据业务需求操作账本等数据。
[0332]
智能合约开发者通过okresponse和nokresponse接口得到统一格式的返回响应。使用编译工具链第一参数是区块链引擎名称,如chainmaker和fabric,和第二参数是部署包名称,生成部署包,该部署包可以直接部署到区块链网络中。
[0333]
本发明的上述使用示例中,展示了如何屏蔽了区块链智能合约、区块链信息及证书信息的复杂性,为上层提供统一的智能合约接口,及各种数据格式定义。这样做的优势可以让智能合约开发者更聚焦于业务的实现,不用关心具体的区块链引擎细节。
[0334]
同时,baas平台一般会支持多种区块链,基于本方案的智能合约可以无成本的区块链引擎切换,同步适配账本和证书体系,可以无感知进行区块链引擎切换。无论是chainmaker,或是fabric hyperledger,或其他区块链,只要增加实现层就可以自由的切换区块链引擎,提供了适配多区块链引擎的智能合约统一实现规范。
[0335]
如图4,本发明实施例提供一种跨区块链引擎的智能合约生成系统,包括:
[0336]
接收模块,用于接收业务智能合约,所述业务智能合约是根据通用抽象层智能合约接口和用户提交的通用智能合约依赖包生成的;
[0337]
获取模块,用于获取多个区块链引擎中的目标区块链引擎的实现依赖包;
[0338]
处理模块,用于根据编译指令和所述实现依赖包,对所述业务智能合约进行编译处理,生成与所述目标区块链引擎匹配的智能合约部署包;
[0339]
部署模块,用于将所述智能合约部署包部署于所述目标区块链引擎运行。
[0340]
本发明实施例的上述方案,根据业务智能合约、编译指令和目标区块链引擎的实现依赖包,得到与目标区块链引擎匹配的智能合约部署包,将该部署包部署于目标区块链引擎运行,可以让智能合约开发者更聚焦于业务的实现,不用关心具体的区块链引擎细节,
具有节约成本和提高效率的优点。
[0341]
具体实施时,业务智能合约只需要实现通用接口的三个接口:初始化接口、升级接口和、调用接口。通过定义通用接口,可以确保业务智能合约的实现类按照规定的方法进行实现,以满足业务智能合约的初始化、升级和调用需求。同时,通过接口的多态性,可以方便地切换和扩展业务智能合约的实现类,以适应不同的业务场景和需求。智能合约开发者使用机器语言包提供的与运行环境进行交互包编写业务智能合约,用于操作账本,如保存数据、溯源数据、获取交易提交者信息等。用户可以根据业务需求操作账本等数据。
[0342]
一个业务智能合约的具体实施例为:导入与运行环境进行交互包等,这些包提供了哈希、加密算法计算和交易提交等功能。定义结构体,用于实现业务智能合约的功能。通过通用接口的三个接口:初始化接口、升级接口和调用接口,在业务智能合约部署时调用初始化函数、业务智能合约升级时调用升级函数、根据不同的调用函数名称执行相应的逻辑。
[0343]
本发明的一可选实施例中,所述通用抽象层智能合约接口包括:智能合约业务接口以及智能合约访问上下文接口;所述智能合约业务接口和所述智能合约访问上下文接口分别具有:统一的智能合约请求响应数据格式,统一的区块信息格式,统一的交易者发起者数据格式以及统一的交易格式。
[0344]
具体实施时,所述智能合约业务接口包括:初始化接口、升级接口以及调用接口;
[0345]
所述智能合约访问上下文接口包括:账本的读写接口、历史数据的操作接口、交易发起人信息查询接口和区块信息解析接口。
[0346]
本发明的一可选实施例中,获取模块具体用于:
[0347]
获取多个区块链引擎中的目标区块链引擎的区块链引擎名称和对应的部署包名称。
[0348]
每个区块链引擎的区块链引擎名称和对应的部署包名称是不同的,获取目标区块链引擎的区块链引擎名称和对应的部署包名称,是为了生成与目标区块链引擎匹配的智能合约部署包。
[0349]
本发明的一可选实施例中,处理模块具体用于:
[0350]
根据目标区块链引擎名称和对应的部署包名称、编译指令中的编译参数,对所述业务智能合约的业务代码进行编译处理,生成与所述目标区块链引擎匹配的智能合约部署包。
[0351]
不同的区块链引擎可能有不同的编译参数,如调试模式、性能优化、安全性配置、插件支持等。这些编译参数的具体设置和使用方式可能因不同的区块链引擎而异。需要根据与目标区块链引擎名称对应的编译参数生成智能合约部署包,保证部署包运行时的准确性和有效性。
[0352]
本发明的一可选实施例中,处理模块具体用于:
[0353]
若目标区块链为开源的区块链引擎,根据所述开源的区块链引擎的编译参数,对所述业务智能合约的业务代码进行编译处理,得到智能合约部署包。
[0354]
对业务智能合约的业务代码进行编译处理时,首选需要选择编译器,具体是根据业务代码的编程语言,选择相应的编译器或解释器。区块链开源底层软件平台和开源的企业级许可分布式账本平台都可以使用go语言编写逻辑代码,因此,对业务代码进行编译处理时,可以选择go语言对应的编译器或解释器。然后设置编译参数,如区块链开源底层软件
平台的编译参数可能包括调试模式、性能优化、安全性配置和插件支持等,开源的企业级许可分布式账本平台的编译参数可能包括编译模式、调试模式、支持的机器编写语言、安全性配置和网络配置等。之后执行编译命令,使用go语言对应的编译器,执行相应的编译命令来处理业务代码。之后处理编译错误,如果编译过程中出现错误,需要仔细检查错误信息并进行修正,常见的编译错误包括语法错误、类型错误、依赖错误等。最后生成智能合约部署包。
[0355]
本发明的一可选实施例中,部署模块具体用于:
[0356]
将所述智能合约部署包通过区块链即服务平台部署于开源的区块链引擎上运行。
[0357]
将智能合约部署包包发布到区块链服务平台进行部署,用户就可以实现在不同的联盟链引擎之间的无成本切换,且同步适配账本和证书体系,可以无感知进行区块链引擎切换。
[0358]
本发明实施例提供一种计算设备,包括:处理器、存储有计算机程序的存储器,所述计算机程序被处理器运行时,执行如上述实施例中任一项所述的方法。
[0359]
本发明实施例提供一种计算机可读存储介质,其上存储指令,当所述指令在计算机上运行时,使得计算机执行如上述实施例中任一项所述的方法。
[0360]
本发明实施例的跨区块链引擎的智能合约生成方法及系统,统一了多个区块链引擎的智能合约实现,屏蔽了区块链智能合约、区块链信息及证书信息的复杂性,为上层提供统一的智能合约接口,及各种数据格式定义。可以让智能合约开发者更聚焦于业务的实现,不用关心具体的区块链引擎细节。同时,区块链即服务平台一般会支持多种区块链,基于本发明实施例的跨区块链引擎的智能合约生成方法及系统可以无成本的进行区块链引擎切换,同步适配账本和证书体系,可以无感知进行区块链引擎切换。
[0361]
无论是区块链开源底层软件平台,或者时开源的企业级许可分布式账本平台,或其他区块链,只要增加实现层就可以自由的切换区块链引擎,本发明实施例的跨区块链引擎的智能合约生成方法及系统提供了适配多区块链引擎的智能合约统一实现规范。
[0362]
以上所述是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明所述原理的前提下,还可以作出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。