CN107943469B - 一种智能合约的发布方法及装置 - Google Patents
一种智能合约的发布方法及装置 Download PDFInfo
- Publication number
- CN107943469B CN107943469B CN201711142787.5A CN201711142787A CN107943469B CN 107943469 B CN107943469 B CN 107943469B CN 201711142787 A CN201711142787 A CN 201711142787A CN 107943469 B CN107943469 B CN 107943469B
- Authority
- CN
- China
- Prior art keywords
- code
- intelligent contract
- contract
- source code
- block chain
- 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
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/27—Replication, distribution or synchronisation of data between databases or within a distributed database system; Distributed database system architectures therefor
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
Abstract
本发明实施例公开了一种智能合约的发布方法及装置,方法包括:发送智能合约代码至区块链节点;区块链节点接收到智能合约代码后,判断智能合约代码是否是源代码形式合约;若是,则调用编译模块编译智能合约代码,生成二进制合约代码,将二进制合约代码发布到区块链上。本发明实施例通过将智能合约代码的源代码发送至区块链节点,用户可通过区块链节点查看智能合约的源代码,并通过区块链节点中编译模块对智能合约的源代码编译后,再发送至区块链上,提高了发布到区块链上的智能合约的安全性。
Description
技术领域
本发明涉及区块链技术领域,尤其涉及一种智能合约的发布方法及装置。
背景技术
区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式,区块链还具有防篡改特性。以太坊是一种区块链实现方案,智能合约是以太坊上的可执行代码,通常使用truffle进行智能合约的开发。其中truffle是以太坊一种开发框架。
现有技术中的智能合约以二进制的方式发布到区块链上,并提供接口给用户调用。但现有的二进制方式进行发布智能合约时,用户只能看到二进制代码,无法看到智能合约的源代码,无法对智能合约的可靠性、安全性和功能进行判断,智能合约发布安全性低,为用户查看智能合约源代码带来了不便。
发明内容
针对上述技术问题,本发明实施例提供了一种智能合约的发布方法及装置,能够解决现有技术中智能合约发布安全低的技术问题。
本发明实施例的第一方面提供一种智能合约的发布方法,包括:
区块链节点接收到智能合约代码后,判断智能合约代码是否是源代码形式合约;
若是,则调用编译模块编译智能合约代码,生成二进制合约代码,将二进制合约代码发布到区块链上。
可选地,所述发送智能合约代码至区块链节点前,包括:
预先在区块链节点内部集成编译模块。
可选地,所述预先在区块链节点内部集成编译模块,包括:
获取编译器源代码,在编译器源代码中提取编译器模块代码;
将提到的编译器模块代码集成进区块链节点对应的以太坊代码,完成在区块链节点内部集成编译模块。
可选地,所述区块链节点接收到智能合约代码后,判断智能合约代码是否是源代码形式合约,包括:
区块链节点接收到智能合约代码后,根据智能合约代码中的交易地址判断交易类型;
根据交易类型判断智能合约代码是否是源代码形式合约。
可选地,所述交易地址是由用户预先设置的160位的地址。
本发明实施例第二方面提供了一种智能合约的发布装置,所述装置包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现以下步骤:
发送智能合约代码至区块链节点;
区块链节点接收到智能合约代码后,判断智能合约代码是否是源代码形式合约;
若是,则调用编译模块编译智能合约代码,生成二进制合约代码,将二进制合约代码发布到区块链上。
可选地,所述计算机程序被所述处理器执行时还实现以下步骤:
预先在区块链节点内部集成编译模块。
可选地,所述计算机程序被所述处理器执行时还实现以下步骤:
获取编译器源代码,在编译器源代码中提取编译器模块代码;
将提到的编译器模块代码集成进区块链节点对应的以太坊代码,完成在区块链节点内部集成编译模块。
可选地,所述计算机程序被所述处理器执行时还实现以下步骤:
区块链节点接收到智能合约代码后,根据智能合约代码中的交易地址判断交易类型;
根据交易类型判断智能合约代码是否是源代码形式合约。
本发明实施例第三方面提供了一种非易失性计算机可读存储介质,其特征在于,所述非易失性计算机可读存储介质存储有计算机可执行指令,该计算机可执行指令被一个或多个处理器执行时,可使得所述一个或多个处理器执行上述的智能合约的发布方法。
本发明实施例提供的技术方案中,通过将智能合约代码的源代码发送至区块链节点,用户可通过区块链节点查看智能合约的源代码,并通过区块链节点中编译模块对智能合约的源代码编译后,再发送至区块链上。因此相对于现有技术,本发明实施例用户可通过查看智能合约的源代码,提高了发布到区块链上的智能合约的可靠性和安全性,也能及时对智能合约的功能进行判断。
附图说明
图1为本发明实施例中一种智能合约的发布方法的一实施例的流程示意图;
图2为本发明实施例中一种智能合约的发布装置的另一实施例结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
请参阅图1,图1为本发明实施例中一种智能合约的发布方法的一个实施例的流程示意图。如图1所示,包括:
步骤S100、发送智能合约代码至区块链节点;
步骤S200、区块链节点接收到智能合约代码后,判断智能合约代码是否是源代码形式合约,若是,则执行步骤S300,若否,则执行步骤S400;
步骤S300、调用编译模块编译智能合约代码,生成二进制合约代码,将二进制合约代码发布到区块链上;
步骤S400、将智能合约代码发布到区块链上。
具体实施时,智能合约是可以在以太坊上运行的代码程序。
编程人员预先根据智能合约需求编写对应的智能合约代码,将智能合约代码发送至区块链节点,其中区块链节点为以太坊节点,具体是指运行以太坊程序的一台计算机。具体地,若智能合约代码是以源代码的形式发送给以太坊节点,调用编译模块,将源代码再编译成在以太坊上可以运行的二进制代码,将二进制合约代码发布到区块链上,若智能合约代码不是以源代码的形式发送给以太坊节点,则直接将智能合约代码发布到区块链上,从而使用户容易对智能合约的可靠性、安全性和功能性做出判断,提高了智能合约发布的安全性。其中源代码是用户用solidity语言编写的程序语言。
可选地,步骤S100前还包括:预先在区块链节点内部集成编译模块。
具体地,本发明实施例中在区块链节点内部集成编译模块,具体地,在运行以太坊程序的计算机内部集成编译模块,其中编译模块用于编译智能合约源代码。
可选地,预先在区块链节点内部集成编译模块具体为:
获取编译器源代码,在编译器源代码中提取编译器模块代码;
将提到的编译器模块代码集成进区块链节点对应的以太坊代码,完成在区块链节点内部集成编译模块。
具体实施时,区块链节点下载编译器源代码,即从https://git.oschina.net/shengmage/solidity.git中下载编译器源代码,提取编译器模块代码,即提取libdevcore,libevmasm,libjulia,libsolidity四个模块的c++源代码,把编译器模块代码集成进以太坊代码,从而实现在区块链节点内部集成编译模块。其中以太坊代码是c++语言编写的。
可选地,步骤S200具体为:区块链节点接收到智能合约代码后,根据智能合约代码中的交易地址判断交易类型;根据交易类型判断智能合约代码是否是源代码形式合约。
具体实施时,在以太坊接收交易时根据交易地址判断交易类型,交易地址to是由用户预先设置的160位的地址,格式如:0x8f6c4f1df2f28e649d7219e8552ec7545ca4427e。
原来交易类型有call和transaction,transaction又根据目标地址to,分成发布合约和调用合约接口两种类型。现在添加一种发布类型,从源代码发布合约。如果是发布源代码合约类型交易,则把源代码编译成二进制代码。其中,call是对智能合约的只读接口调用,即不修改区块链上的数据,只返回执行结果。Transaction是对智能合约的写接口调用,会修改区块链上的数据。
上面对本发明实施例中的智能合约的发布方法进行了描述,下面对本发明实施例中的智能合约的发布装置进行描述,请参阅图2,图2是本发明实施例中一种智能合约的发布装置的另一实施例程序模块示意图,包括:
装置10包括:存储器101、处理器102及存储在存储器上并可在处理器上运行的计算机程序,计算机程序被处理器101执行时实现以下步骤:
发送智能合约代码至区块链节点;
区块链节点接收到智能合约代码后,判断智能合约代码是否是源代码形式合约;
若是,则调用编译模块编译智能合约代码,生成二进制合约代码,将二进制合约代码发布到区块链上;
若否,则将智能合约代码发布到区块链上。
具体地,智能合约是可以在以太坊上运行的代码程序。
编程人员预先根据智能合约需求编写对应的智能合约代码,将智能合约代码发送至区块链节点,其中区块链节点为以太坊节点,具体是指运行以太坊程序的一台计算机。具体地,若智能合约代码是以源代码的形式发送给以太坊节点,调用编译模块,将源代码再编译成在以太坊上可以运行的二进制代码,将二进制合约代码发布到区块链上,若智能合约代码不是以源代码的形式发送给以太坊节点,则直接将智能合约代码发布到区块链上,从而使用户容易对智能合约的可靠性、安全性和功能性做出判断,提高了智能合约发布的安全性。其中源代码是用户用solidity语言编写的程序语言。
可选地,计算机程序被处理器101执行时还实现以下步骤:
预先在区块链节点内部集成编译模块。
具体地,本发明实施例中在区块链节点内部集成编译模块,具体地,在运行以太坊程序的计算机内部集成编译模块,其中编译模块用于编译智能合约源代码。
可选地,计算机程序被处理器101执行时还实现以下步骤:
获取编译器源代码,在编译器源代码中提取编译器模块代码;
将提到的编译器模块代码集成进区块链节点对应的以太坊代码,完成在区块链节点内部集成编译模块。
具体地,区块链节点下载编译器源代码,即从https://git.oschina.net/shengmage/solidity.git中下载编译器源代码,提取编译器模块代码,即提取libdevcore,libevmasm,libjulia,libsolidity四个模块的c++源代码,把编译器模块代码集成进以太坊代码,从而实现在区块链节点内部集成编译模块。其中以太坊代码是c++语言编写的。
可选地,计算机程序被处理器101执行时还实现以下步骤:
区块链节点接收到智能合约代码后,根据智能合约代码中的交易地址判断交易类型;
根据交易类型判断智能合约代码是否是源代码形式合约。
具体实施时,在以太坊接收交易时根据交易地址判断交易类型,交易地址to是由用户预先设置的160位的地址,格式如:0x8f6c4f1df2f28e649d7219e8552ec7545ca4427e。
原来交易类型有call和transaction,transaction又根据目标地址to,分成发布合约和调用合约接口两种类型。现在添加一种发布类型,从源代码发布合约。如果是发布源代码合约类型交易,则把源代码编译成二进制代码。其中,call是对智能合约的只读接口调用,即不修改区块链上的数据,只返回执行结果。Transaction是对智能合约的写接口调用,会修改区块链上的数据。
本发明实施例提供了一种非易失性计算机可读存储介质,计算机可读存储介质存储有计算机可执行指令,该计算机可执行指令被一个或多个处理器执行,例如,执行以上描述的图1中的方法步骤S100至步骤S400。
以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
Claims (4)
1.一种智能合约的发布方法,其特征在于,包括:
发送智能合约代码至区块链节点;所述智能合约是可以在以太坊上运行的代码程序;
区块链节点接收到智能合约代码后,判断智能合约代码是否是源代码形式合约;所述源代码为用户用solidity语言编写的程序语言;
若是,则调用编译模块编译智能合约代码,生成二进制合约代码,将二进制合约代码发布到区块链上;
所述发送智能合约代码至区块链节点前,包括:
预先在区块链节点内部集成编译模块;
所述预先在区块链节点内部集成编译模块,包括:
获取编译器源代码,在编译器源代码中提取编译器模块代码;
将提到的编译器模块代码集成进区块链节点对应的以太坊代码,完成在区块链节点内部集成编译模块;
所述区块链节点接收到智能合约代码后,判断智能合约代码是否是源代码形式合约,包括:
区块链节点接收到智能合约代码后,根据智能合约代码中的交易地址判断交易类型;所述交易类型包括call、transaction和发布源代码合约类型;
根据交易类型判断智能合约代码是否是源代码形式合约;若所述交易类型为所述发布源代码合约类型,则所述智能合约代码为源代码形式合约。
2.根据权利要求1所述的智能合约的发布方法,其特征在于,所述交易地址是由用户预先设置的160位的地址。
3.一种智能合约的发布装置,其特征在于,所述装置包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现以下步骤:
发送智能合约代码至区块链节点;所述智能合约是可以在以太坊上运行的代码程序;
区块链节点接收到智能合约代码后,判断智能合约代码是否是源代码形式合约;所述源代码为用户用solidity语言编写的程序语言;
若是,则调用编译模块编译智能合约代码,生成二进制合约代码,将二进制合约代码发布到区块链上;
所述计算机程序被所述处理器执行时还实现以下步骤:
预先在区块链节点内部集成编译模块;
所述计算机程序被所述处理器执行时还实现以下步骤:
获取编译器源代码,在编译器源代码中提取编译器模块代码;
将提到的编译器模块代码集成进区块链节点对应的以太坊代码,完成在区块链节点内部集成编译模块;
所述计算机程序被所述处理器执行时还实现以下步骤:
区块链节点接收到智能合约代码后,根据智能合约代码中的交易地址判断交易类型;所述交易类型包括call、transaction和发布源代码合约类型;
根据交易类型判断智能合约代码是否是源代码形式合约;若所述交易类型为所述发布源代码合约类型,则所述智能合约代码为源代码形式合约。
4.一种非易失性计算机可读存储介质,其特征在于,所述非易失性计算机可读存储介质存储有计算机可执行指令,该计算机可执行指令被一个或多个处理器执行时,可使得所述一个或多个处理器执行权利要求1-2任一项所述的智能合约的发布方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711142787.5A CN107943469B (zh) | 2017-11-17 | 2017-11-17 | 一种智能合约的发布方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711142787.5A CN107943469B (zh) | 2017-11-17 | 2017-11-17 | 一种智能合约的发布方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107943469A CN107943469A (zh) | 2018-04-20 |
CN107943469B true CN107943469B (zh) | 2022-01-11 |
Family
ID=61931613
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201711142787.5A Active CN107943469B (zh) | 2017-11-17 | 2017-11-17 | 一种智能合约的发布方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107943469B (zh) |
Families Citing this family (17)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108805713A (zh) * | 2018-05-30 | 2018-11-13 | 平安科技(深圳)有限公司 | 基于区块链的智能股票申购方法、装置、设备及存储介质 |
CN108920978B (zh) * | 2018-06-26 | 2021-05-04 | 赛飞特工程技术集团有限公司 | 一种基于区块链技术的安全生产信息共享方法 |
CN109033888A (zh) * | 2018-07-27 | 2018-12-18 | 深圳市汇尊区块链技术有限公司 | 一种智能合约源码公开机制 |
CN109146413A (zh) * | 2018-08-02 | 2019-01-04 | 珠海宏桥高科技有限公司 | 一种基于区块链的智能合约的构建方法 |
CN109189396B (zh) * | 2018-08-16 | 2022-04-12 | 北京京东尚科信息技术有限公司 | 智能合约引擎组件、运行方法及存储介质 |
CN109117179A (zh) * | 2018-08-31 | 2019-01-01 | 北京八分量信息科技有限公司 | 一种软件的实现方法及平台 |
CN109040133A (zh) * | 2018-09-27 | 2018-12-18 | 上海点融信息科技有限责任公司 | 在区块链网络中安装智能合约的方法、装置及存储介质 |
CN109358859B (zh) * | 2018-09-27 | 2021-07-30 | 上海点融信息科技有限责任公司 | 在区块链网络中安装智能合约的方法、装置及存储介质 |
CN109445820A (zh) * | 2018-10-29 | 2019-03-08 | 深圳市元征科技股份有限公司 | 一种智能合约升级方法、系统、设备及计算机存储介质 |
CN111290776B (zh) * | 2018-12-10 | 2023-05-16 | 航天信息股份有限公司 | 一种用于管理区块链节点的管理装置及方法 |
CN110046992A (zh) | 2018-12-12 | 2019-07-23 | 阿里巴巴集团控股有限公司 | 一种基于区块链智能合约的交易哈希获取方法及系统 |
CN110032599B (zh) * | 2018-12-20 | 2020-05-05 | 阿里巴巴集团控股有限公司 | 数据结构的读取及更新方法、装置、电子设备 |
SG11201908890XA (en) * | 2019-03-26 | 2019-10-30 | Alibaba Group Holding Ltd | System and method for implementing different types of blockchain contracts |
EP3701383B1 (en) * | 2019-06-28 | 2021-08-04 | Advanced New Technologies Co., Ltd. | System and method for executing different types of blockchain contracts |
CN110688428B (zh) * | 2019-09-24 | 2021-01-26 | 北京海益同展信息科技有限公司 | 用于发布智能合约的方法和装置 |
CN112596754B (zh) * | 2021-03-01 | 2021-07-02 | 腾讯科技(深圳)有限公司 | 区块链智能合约部署方法及装置 |
CN113407188B (zh) * | 2021-06-03 | 2024-02-09 | 广东辰宜信息科技有限公司 | 智能合约的构建方法、装置、计算机设备及存储介质 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107147704A (zh) * | 2017-04-21 | 2017-09-08 | 杭州趣链科技有限公司 | 一种面向区块链的通用服务中间件系统 |
CN107329888A (zh) * | 2017-05-31 | 2017-11-07 | 深圳前海微众银行股份有限公司 | 智能合约操作码覆盖率计算方法和系统 |
Family Cites Families (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20160012465A1 (en) * | 2014-02-08 | 2016-01-14 | Jeffrey A. Sharp | System and method for distributing, receiving, and using funds or credits and apparatus thereof |
US10340038B2 (en) * | 2014-05-13 | 2019-07-02 | Nant Holdings Ip, Llc | Healthcare transaction validation via blockchain, systems and methods |
WO2017173399A1 (en) * | 2016-03-31 | 2017-10-05 | Clause, Inc. | System and method for creating and executing data-driven legal contracts |
CN106598579B (zh) * | 2016-12-06 | 2020-12-25 | 北京果仁宝科技有限公司 | 区块链上集成动态类型编程语言方法和装置 |
CN106598549B (zh) * | 2016-12-08 | 2019-02-01 | 天津米游科技有限公司 | 一种基于区块链的智能合约系统及实现方法 |
CN107341702B (zh) * | 2017-03-08 | 2020-06-23 | 创新先进技术有限公司 | 一种业务处理的方法及装置 |
-
2017
- 2017-11-17 CN CN201711142787.5A patent/CN107943469B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107147704A (zh) * | 2017-04-21 | 2017-09-08 | 杭州趣链科技有限公司 | 一种面向区块链的通用服务中间件系统 |
CN107329888A (zh) * | 2017-05-31 | 2017-11-07 | 深圳前海微众银行股份有限公司 | 智能合约操作码覆盖率计算方法和系统 |
Non-Patent Citations (1)
Title |
---|
"区块链技术驱动的产消者自组织产品制造社群构建";冷杰武 等;《广东工业大学学报》;20170710;第34卷(第05期);第1-9页 * |
Also Published As
Publication number | Publication date |
---|---|
CN107943469A (zh) | 2018-04-20 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107943469B (zh) | 一种智能合约的发布方法及装置 | |
CN107025559B (zh) | 一种业务处理方法及装置 | |
CN107392619B (zh) | 智能合约处理方法及装置 | |
CN106605212B (zh) | 在动态链接的运行时环境中的模块化共同版本管理 | |
US8464230B2 (en) | Methods and systems to implement non-ABI conforming features across unseen interfaces | |
CN108874372B (zh) | 一种基于Scala的区块链合约实现方法及系统 | |
CN110704063B (zh) | 编译和执行智能合约的方法及装置 | |
BR112016024522B1 (pt) | Meio de armazenamento legível por computador não transitório, e, método para especializar uma classe genérica | |
US20160246622A1 (en) | Method and system for implementing invocation stubs for the application programming interfaces embedding with function overload resolution for dynamic computer programming languages | |
CN111752571A (zh) | 程序升级方法、装置、设备及存储介质 | |
CN111770205B (zh) | 一种执行智能合约的方法、区块链节点、系统和存储介质 | |
CN110704064A (zh) | 编译和执行智能合约的方法及装置 | |
WO2018032653A1 (zh) | 一种Java卡应用的功能实现方法及装置 | |
CN112148278A (zh) | 可视化的区块链智能合约框架及智能合约开发部署方法 | |
CN111782334B (zh) | 一种动态链接库文件虚拟化方法、存储介质及终端设备 | |
CN110018831B (zh) | 程序处理方法、装置及计算机可读存储介质 | |
KR20150124530A (ko) | 어플리케이션 빌드 시스템 및 그 제어방법과, 그 제어방법을 실행하기 위한 프로그램을 기록한 기록 매체 | |
TW202403541A (zh) | 第三方行動應用程式中引入小程序的系統、方法、裝置及介質 | |
US11429358B2 (en) | Representing asynchronous state machine in intermediate code | |
US20110321009A1 (en) | Implementing encryption via aspect oriented programming | |
CN109542447B (zh) | 一种otx程序文件执行方法及装置 | |
CN111273897A (zh) | 一种区块链资源消耗方法、装置、储存介质及电子设备 | |
KR101858565B1 (ko) | 대용량 데이터 처리를 위한 분산 플랫폼 독립적 병렬 처리 방법 및 시스템 | |
CN111913712A (zh) | 用于在Web端部署神经网络模型的方法和装置 | |
CN114371852B (zh) | 一种编译方法及装置 |
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 |