CN110297721B - 一种基于java的智能合约的跨合约调用方法 - Google Patents

一种基于java的智能合约的跨合约调用方法 Download PDF

Info

Publication number
CN110297721B
CN110297721B CN201910550382.8A CN201910550382A CN110297721B CN 110297721 B CN110297721 B CN 110297721B CN 201910550382 A CN201910550382 A CN 201910550382A CN 110297721 B CN110297721 B CN 110297721B
Authority
CN
China
Prior art keywords
contract
java
instance
class
calling
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201910550382.8A
Other languages
English (en)
Other versions
CN110297721A (zh
Inventor
李伟
邱炜伟
梁秀波
尹可挺
汤凯凯
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Hangzhou Qulian Technology Co Ltd
Original Assignee
Hangzhou Qulian Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Hangzhou Qulian Technology Co Ltd filed Critical Hangzhou Qulian Technology Co Ltd
Priority to CN201910550382.8A priority Critical patent/CN110297721B/zh
Publication of CN110297721A publication Critical patent/CN110297721A/zh
Application granted granted Critical
Publication of CN110297721B publication Critical patent/CN110297721B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • G06F9/547Remote procedure calls [RPC]; Web services
    • G06F9/548Object oriented; Remote method invocation [RMI]
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06QINFORMATION AND COMMUNICATION TECHNOLOGY [ICT] SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES; SYSTEMS OR METHODS SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES, NOT OTHERWISE PROVIDED FOR
    • G06Q40/00Finance; Insurance; Tax strategies; Processing of corporate or income taxes
    • G06Q40/04Trading; Exchange, e.g. stocks, commodities, derivatives or currency exchange

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Business, Economics & Management (AREA)
  • Finance (AREA)
  • Software Systems (AREA)
  • General Physics & Mathematics (AREA)
  • Physics & Mathematics (AREA)
  • Accounting & Taxation (AREA)
  • Economics (AREA)
  • Development Economics (AREA)
  • General Engineering & Computer Science (AREA)
  • Marketing (AREA)
  • Strategic Management (AREA)
  • Technology Law (AREA)
  • General Business, Economics & Management (AREA)
  • Stored Programmes (AREA)
  • Management, Administration, Business Operations System, And Electronic Commerce (AREA)

Abstract

本发明公开了一种基于JAVA的智能合约的跨合约调用的方法,该方法通过实现一个自定义类加载器来加载指定合约地址ContractAddress对应的合约类,并根据相应调用接口基于链上账本数据实例化一个对应的contract实例或者library实例的对象。该对象中的变量体现了该合约的最新状态,用户通过该对象的方法使用指定合约的功能服务,在合约执行的持久化阶段,所有在contract实例上的变更均会在账本中体现,即会修改对应合约账户的状态,而所有在library实例上的变更均会被抛弃,即对应合约账户的状态不会被改变。由于相关接口的使用无其他限制,所以用户可以进行多重的跨合约调用。

Description

一种基于JAVA的智能合约的跨合约调用方法
技术领域
本发明涉及区块链技术,尤其涉及一种基于JAVA的智能合约的跨合约调用方法。
背景技术
区块链技术,区块链是一种新型去中心化协议,能安全地存储数字货币交易或其他数据,信息不可伪造和篡改,区块链上的交易确认由区块链上的所有节点共同完成,由共识算法保证其一致性,区块链上维护一个公共的账本,公共账本位于存储区块上任何节点可见,从而保证其不可伪造和篡改。
智能合约是编程在区块链上的汇编语言,该术语是跨领域法律学者尼克·萨博提出来的,他对智能合约的定义是“一个智能合约是一套以数字形式定义的承诺,包括合约参与方可以在上面执行这些承诺的协议”,换句话说,智能合约就是一个在计算机系统上,当一定条件被满足后,可以被自动执行的合约。通常人们不会自己写字节码,但是会从更高级的语言来编译它,例如用Solidity等类似的专用语言。
区块链的去中心化与不可篡改的特性给智能合约提供了一个很好的发展环境,因此近年来,比特币网络、以太坊网络等一系列区块链社区都陆续开始提供了公开的智能合约编程的接口。但是在智能合约尤其是JAVA合约的开发过程中,一直缺少一个使用简单、运行高效、安全的跨合约调用方式。
发明内容
针对现有技术的不足,本发明提出一种基于JAVA的智能合约的跨合约调用方法,提供两种跨合约方式,具体技术方案如下:
一种基于JAVA的智能合约的跨合约调用方法,其特征在于,该方法具体包括如下步骤:
步骤一:编写使用接口的合约:
根据业务需求在合约中定义相应的合约方法,当需要复用其他合约的工具方法逻辑时,通过获取library实例的接口来满足;当需要访问其他机构发布的合约服务以此实现跨机构合作时,通过获取contract实例的接口来满足;获取library实例和contract实例的接口,均接受一个合约地址ContractAddress作为参数,并返回一个合约对象,通过声明一个合约对象类型变量进行赋值;
步骤二:调用合约,根据合约地址ContractAddress获取合约对象:
首先,对合约地址ContractAddress进行长度检查,若长度未通过,则抛出异常;若长度通过,再作如下判断:
若非首次创建,则表明在本次合约调用中已经获取过合约地址ContractAddress对应的合约对象,此时对于获取library实例的场景,作一次深拷贝,然后进行步骤三;对于获取contract实例的场景,则直接进行步骤三;
若为首次创建,先进行下面流程:
(1)智能合约执行引擎将根据合约地址ContractAddress试图从账本中该地址对应的合约账户中取出该合约对应的JAVA合约字节码,若未取到,则抛出异常;若取到,则进行安全性检查;
(2)加载合约字节码:获得JAVA合约字节码后先进行安全性检查,若不通过,则抛出异常并退出;若检查通过,则通过自定义类加载器,将合约类字节码加载进虚拟机,并返回合约主体类的Class对象;
(3)根据合约主体类Class对象创建合约对象并初始化:通过JAVA反射机制,调用主体类无参构造方法,若构造失败则抛出异常;若构造成功,则通过JAVA反射机制依次扫描该对象的成员变量,并从账本中取出该变量对应的值进行初始化;然后,如果获取的是contract实例,那么将该对象另外缓存于内存中,然后进行步骤三;如果获取的是library实例,那么直接进行步骤三;
步骤三:触发合约对象的合约创建钩子函数,判断钩子函数是否运行正常,若是,则直接返回之前创建的对象;若否,则抛出异常;
步骤四:调用结束,持久化:扫描本次调用中缓存的全部contract实例,得到对合约账户的修改集,并将修改集应用到对应的合约账户;
所述的钩子函数,是指被调用合约作者自定义的重写的合约方法,在合约实例创建时被触发;所述的合约地址ContractAddress为固定长度的16进制字符串。
进一步地,所述的步骤一中,所述的合约对象类型变量为接口。
进一步地,所述的步骤二中的账本是采用GO语言编写,关于GO语言和JAVA语言的交互通过使用JAVA提供的JNI还有GO提供的CGO功能,以C语言为胶水代码实现。
进一步地,所述的步骤二中,所述的合约的安全性检查包括,检查相同全限定类名的合约的字节码是否一致,检查合约主体类是否继承了要求的合约基类,检查全限定类名是否和系统内部类重名。
进一步地,包含权限判断的自定义逻辑在所述的钩子函数的内部实现。
进一步地,只有合约执行过程中对contract实例操作而导致的修改集会持久化到对应账户。
本发明的有益效果如下:
本发明应用于区块链平台上,提供了一套全新的JAVA智能合约跨合约调用的方法,实现了按照contract示例和library实例两种方式跨合约,能够满足现实中复杂的业务需求。同时,相比于其他跨合约解决方案,本方案对于用户更加友好,能够以面向对象调用的方式进行跨合约调用,更符合JAVA的面向对象编程习惯。
附图说明
图1是以contract实例跨合约调用流程图;
图2是以library实例跨合约调用流程图;
图3是跨合约调用的状态持久化流程图。
具体实施方式
下面根据附图和优选实施例详细描述本发明,本发明的目的和效果将变得更加明白,以下结合附图和实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
一种基于JAVA的智能合约的跨合约调用方法,如图1和2所示,该方法具体包括如下步骤:
步骤一:编写使用接口的合约:
根据业务需求在合约中定义相应的合约方法,当需要复用其他合约的工具方法逻辑时,通过获取library实例的接口来满足;当需要访问其他机构发布的合约服务以此实现跨机构合作时,通过获取contract实例的接口来满足;获取library实例和contract实例的接口,均接受一个合约地址ContractAddress作为参数,并返回一个合约对象,通过声明一个合约对象类型变量进行赋值;
步骤二:调用合约,根据合约地址ContractAddress获取合约对象:
首先,对合约地址ContractAddress进行长度检查,若长度未通过,则抛出异常;若长度通过,再作如下判断:
若非首次创建,则表明在本次合约调用中已经获取过合约地址ContractAddress对应的合约对象,此时对于获取library实例的场景,作一次深拷贝,然后进行步骤三;对于获取contract实例的场景,则直接进行步骤三;
若为首次创建,先进行下面流程:
(1)智能合约执行引擎将根据合约地址ContractAddress试图从账本中该地址对应的合约账户中取出该合约对应的JAVA合约字节码,若未取到,则抛出异常;若取到,则进行安全性检查;
(2)加载合约字节码:获得JAVA合约字节码后先进行安全性检查,若不通过,则抛出异常并退出;若检查通过,则通过自定义类加载器,将合约类字节码加载进虚拟机,并返回合约主体类的Class对象;
(3)根据合约主体类Class对象创建合约对象并初始化:通过JAVA反射机制,调用主体类无参构造方法,若构造失败则抛出异常;若构造成功,则通过JAVA反射机制依次扫描该对象的成员变量,并从账本中取出该变量对应的值进行初始化;然后,如果获取的是contract实例,那么将该对象另外缓存于内存中,然后进行步骤三;如果获取的是library实例,那么直接进行步骤三;
步骤三:触发合约对象的合约创建钩子函数,判断钩子函数是否运行正常,若是,则直接返回之前创建的对象;若否,则抛出异常;
步骤四:调用结束,持久化(如图3所示):扫描本次调用中缓存的全部contract实例,得到对合约账户的修改集,并将修改集应用到对应的合约账户;
所述的钩子函数,是指被调用合约作者自定义的重写的合约方法,在合约实例创建时被触发;所述的合约地址ContractAddress为固定长度的16进制字符串。
优选地,所述的步骤一中,所述的合约对象类型变量为接口。当合约编写者修改合约接口实现时,合约调用方不用随之修改,从而保持跨合约调用方的代码的稳定性。
优选地,所述的步骤二中的账本是采用GO语言编写,关于GO语言和JAVA语言的交互通过使用JAVA提供的JNI还有GO提供的CGO功能,以C语言为胶水代码实现。因此,所有的调用均无需通过网络,均为本地调用,避免因为网络问题影响合约调用。从账本获取到的字节码文件,应该是以jar包的字节流形式存在,并且在jar包中除了合约的字节码文件外还需要提供该合约的主类信息,以方便类加载器定位并加载主类。
优选地,所述的步骤二中,所述的合约的安全性检查包括,检查相同全限定类名的合约的字节码是否一致,检查合约主体类是否继承了要求的合约基类,检查全限定类名是否和系统内部类重名。从而防止恶意代码进入系统,保证用户合约逻辑与用户预期执行效果一致。
优选地,包含权限判断的自定义逻辑在所述的钩子函数的内部实现,方便在被跨合约调用之前中止合约调用,以满足权限限制的需求。
本领域普通技术人员可以理解,以上所述仅为发明的优选实例而已,并不用于限制发明,尽管参照前述实例对发明进行了详细的说明,对于本领域的技术人员来说,其依然可以对前述各实例记载的技术方案进行修改,或者对其中部分技术特征进行等同替换。凡在发明的精神和原则之内,所做的修改、等同替换等均应包含在发明的保护范围之内。

Claims (6)

1.一种基于JAVA的智能合约的跨合约调用方法,其特征在于,该方法具体包括如下步骤:
步骤一:编写使用接口的合约:
根据业务需求在合约中定义相应的合约方法,当需要复用其他合约的工具方法逻辑时,通过获取library实例的接口来满足;当需要访问其他机构发布的合约服务以此实现跨机构合作时,通过获取contract实例的接口来满足;获取library实例和contract实例的接口,均接受一个合约地址ContractAddress作为参数,并返回一个合约对象,通过声明一个合约对象类型变量进行赋值;
步骤二:调用合约,根据合约地址ContractAddress获取合约对象:
首先,对合约地址ContractAddress进行长度检查,若长度未通过,则抛出异常;若长度通过,再作如下判断:
若非首次创建,则表明在本次合约调用中已经获取过合约地址ContractAddress对应的合约对象,此时对于获取library实例的场景,作一次深拷贝,然后进行步骤三;对于获取contract实例的场景,则直接进行步骤三;
若为首次创建,先进行下面流程:
(1)智能合约执行引擎将根据合约地址ContractAddress试图从账本中该地址对应的合约账户中取出该合约对应的JAVA合约字节码,若未取到,则抛出异常;若取到,则进行安全性检查;
(2)加载合约字节码:获得JAVA合约字节码后先进行安全性检查,若不通过,则抛出异常并退出;若检查通过,则通过自定义类加载器,将合约类字节码加载进虚拟机,并返回合约主体类的Class对象;
(3)根据合约主体类Class对象创建合约对象并初始化:通过JAVA反射机制,调用主体类无参构造方法,若构造失败则抛出异常;若构造成功,则通过JAVA反射机制依次扫描该对象的成员变量,并从账本中取出该变量对应的值进行初始化;然后,如果获取的是contract实例,那么将该对象另外缓存于内存中,然后进行步骤三;如果获取的是library实例,那么直接进行步骤三;
步骤三:触发合约对象的合约创建钩子函数,判断钩子函数是否运行正常,若是,则直接返回之前创建的对象;若否,则抛出异常;
步骤四:调用结束,持久化:扫描本次调用中缓存的全部contract实例,得到对合约账户的修改集,并将修改集应用到对应的合约账户;
所述的钩子函数,是指被调用合约作者自定义的重写的合约方法,在合约实例创建时被触发;所述的合约地址ContractAddress为固定长度的16进制字符串。
2.如权利要求1所述的基于JAVA的智能合约的跨合约调用方法,其特征在于,所述的步骤一中,所述的合约对象类型变量为接口。
3.如权利要求1所述的基于JAVA的智能合约的跨合约调用方法,其特征在于,所述的步骤二中的账本是采用GO语言编写,关于GO语言和JAVA语言的交互通过使用JAVA提供的JNI还有GO提供的CGO功能,以C语言为胶水代码实现。
4.如权利要求1所述的基于JAVA的智能合约的跨合约调用方法,其特征在于,所述的步骤二中,所述的合约的安全性检查包括,检查相同全限定类名的合约的字节码是否一致,检查合约主体类是否继承了要求的合约基类,检查全限定类名是否和系统内部类重名。
5.如权利要求1所述的基于JAVA的智能合约的跨合约调用方法,其特征在于,包含权限判断的自定义逻辑在所述的钩子函数的内部实现。
6.如权利要求1所述的基于JAVA的智能合约的跨合约调用方法,其特征在于,所述的步骤四中,只有合约执行过程中对contract实例操作而导致的修改集会持久化到对应账户。
CN201910550382.8A 2019-06-24 2019-06-24 一种基于java的智能合约的跨合约调用方法 Active CN110297721B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201910550382.8A CN110297721B (zh) 2019-06-24 2019-06-24 一种基于java的智能合约的跨合约调用方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910550382.8A CN110297721B (zh) 2019-06-24 2019-06-24 一种基于java的智能合约的跨合约调用方法

Publications (2)

Publication Number Publication Date
CN110297721A CN110297721A (zh) 2019-10-01
CN110297721B true CN110297721B (zh) 2021-08-03

Family

ID=68028642

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910550382.8A Active CN110297721B (zh) 2019-06-24 2019-06-24 一种基于java的智能合约的跨合约调用方法

Country Status (1)

Country Link
CN (1) CN110297721B (zh)

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110633076B (zh) * 2019-09-16 2021-05-04 杭州趣链科技有限公司 一种自动生成Solidity智能合约Java客户端程序的方法
CN117251249A (zh) * 2019-12-31 2023-12-19 杭州趣链科技有限公司 一种基于多虚拟机区块链平台跨虚拟机调用方法
CN112394939B (zh) * 2020-10-30 2023-06-13 迅鳐成都科技有限公司 基于联盟链的用户合约自动部署方法、装置及存储介质
CN112445543B (zh) * 2020-11-26 2023-03-10 杭州趣链科技有限公司 智能合约的类调用方法、装置及电子设备

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106709704A (zh) * 2016-11-23 2017-05-24 杭州秘猿科技有限公司 一种基于许可链的智能合约升级方法
CN108255545A (zh) * 2016-12-28 2018-07-06 阿里巴巴集团控股有限公司 组件间的功能调用方法、装置及组件化架构系统
CN108874372A (zh) * 2018-06-20 2018-11-23 北京连琪科技有限公司 一种基于Scala的区块链合约实现方法及系统
CN109151031A (zh) * 2018-08-28 2019-01-04 北京奇虎科技有限公司 基于区块链的合约处理方法及装置

Family Cites Families (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10521775B2 (en) * 2016-04-18 2019-12-31 R3 Ltd. Secure processing of electronic transactions by a decentralized, distributed ledger system
CN106101242B (zh) * 2016-06-24 2019-08-06 深圳前海微众银行股份有限公司 区块链云服务平台的构建方法和装置
CN107562513B (zh) * 2017-07-18 2020-08-07 杭州趣链科技有限公司 一种基于java的智能合约生命周期的管理方法
US11048527B2 (en) * 2017-09-21 2021-06-29 Citrix Systems, Inc. Accessing conflicting frameworks and classes
EP3718069B1 (en) * 2017-11-30 2024-04-17 Visa International Service Association Blockchain system for confidential and anonymous smart contracts
CN108765158B (zh) * 2018-05-31 2020-11-24 杭州溪塔科技有限公司 一种基于区块链的智能合约引擎系统及其合约执行方法
CN109710235B (zh) * 2018-12-29 2022-04-01 杭州趣链科技有限公司 一种基于Java智能合约业务逻辑的事务实现系统及方法

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106709704A (zh) * 2016-11-23 2017-05-24 杭州秘猿科技有限公司 一种基于许可链的智能合约升级方法
CN108255545A (zh) * 2016-12-28 2018-07-06 阿里巴巴集团控股有限公司 组件间的功能调用方法、装置及组件化架构系统
CN108874372A (zh) * 2018-06-20 2018-11-23 北京连琪科技有限公司 一种基于Scala的区块链合约实现方法及系统
CN109151031A (zh) * 2018-08-28 2019-01-04 北京奇虎科技有限公司 基于区块链的合约处理方法及装置

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
Potential Risks of Hyperledger Fabric Smart Contracts;Kazuhiro Yamashita; Yoshihide Nomura; Ence Zhou; Bingfeng Pi;;《2019 IEEE International Workshop on Blockchain Oriented Software Engineering (IWBOSE)》;20190314;全文 *
基于区块链2.0的以太坊初探;李赫,孙继飞,杨泳,汪松;《中国金融电脑 2017年第6期》;20170630;全文 *

Also Published As

Publication number Publication date
CN110297721A (zh) 2019-10-01

Similar Documents

Publication Publication Date Title
CN110297721B (zh) 一种基于java的智能合约的跨合约调用方法
CN107562513B (zh) 一种基于java的智能合约生命周期的管理方法
Wöhrer et al. Design patterns for smart contracts in the ethereum ecosystem
CN107038242B (zh) 一种面向区块链全局智能合约业务数据解析方法
US6308224B1 (en) Method of generating an implementation of a workflow process model in an object environment
US6023579A (en) Computer-implemented method for generating distributed object interfaces from metadata
US5889992A (en) Method for mapping types stored in a model in an object-oriented repository to language constructs for A C binding for the repository
CN111176791B (zh) 一种基于多虚拟机区块链平台跨虚拟机调用方法
US7496926B2 (en) Method and apparatus to encapsulate a queue in a namespace
JP2005293578A (ja) 属性を介して制御されるテストケース継承
CN101387956A (zh) 可扩展地实现非功能逻辑的方法和设备及其系统
JP2000187594A (ja) インタ―フェ―スのランタイム付加
CN110032568B (zh) 数据结构的读取及更新方法、装置、电子设备
US11720607B2 (en) System for lightweight objects
CN112400182A (zh) 区块链中智能合约的执行方法及装置和电子设备
US6918126B1 (en) Method and apparatus for creating and enforcing protected system level Java code
US7185325B2 (en) Application class extensions
CN116974581B (zh) 代码生成方法、装置、电子设备和存储介质
JPH08512151A (ja) 一次記憶装置方式のデータベースにおけるデータアクセス方法
US9009731B2 (en) Conversion of lightweight object to a heavyweight object
US6128772A (en) Object-oriented apparatus and method in a computer system for establishing/altering the ownership relationship between objects
CN112287032A (zh) 一种区块链数据存储方法、装置及区块链节点
CN111105242A (zh) 一种区块链智能合约实现方法
CN108074074B (zh) 整合装置及其整合方法
Currin et al. Mobile process calculi for programming the blockchain documentation

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant