Detailed Description
The scheme provided by the specification is described below with reference to the accompanying drawings.
FIG. 1 is a process diagram for deploying an intelligent contract in a blockchain network. As shown in fig. 1, the blockchain network includes several nodes, and each node can communicate with each other. The user can initiate a transaction through the node by means of the external account, and the transaction can be a common transfer transaction and can also be used for creating an intelligent contract or calling the intelligent contract. Assuming that at a certain node in the network, the contract developer Bob wants to publish a piece of intelligent contract, a publishing process as shown in the figure may be employed.
First, Bob may write an intelligent contract in a high-level language. Then, the high-level language is compiled into a byte code (bytecode) file by a compiler, and a contract module is generated.
Bytecode is an intermediate code format between high-level languages and machine code, comprising a binary character encoding of a sequence of opcode code (opcode)/data pairs. Bytecode is not machine code that can be directly executed, and needs a corresponding virtual machine to parse the bytecode for execution.
Bob may then issue the contract in the form of a transaction. Specifically, Bob can initiate a transaction, the from field of the initiator in the transaction content is Bob (more specifically, the address of Bob), and the to field of the receiver is set to null; the transaction content also includes a Data field containing a code after compiling the intelligent contract into byte codes.
After Bob issues such a transaction to the blockchain network, each node in the blockchain network can acquire the bytecode of the intelligent contract, and thus, the intelligent contract is deployed to each node in the blockchain network. As with conventional transactions, the accounting node will perform operations such as validating, packaging, etc. the transaction, record it in the block, and add it to the chain of blocks through a consensus mechanism. In this process, a contract address, such as 0x6f …, is also assigned to the smart contract according to an algorithm, such as hashing based on the publisher address. Thus, an intelligent contract corresponds to a contract address, which is not formally different from the user's external account address. After the above intelligent contract is packed and linked, any user in the block chain network can call the intelligent contract.
When a user calls the intelligent contract, the virtual machine in the node executes the operation corresponding to the contract logic and realizes the change of the contract state on the network through the consensus mechanism. Specifically, the virtual machine loads and runs byte codes of the intelligent contract which is deployed before, and more specifically, an interpreter in the virtual machine interprets and executes an instruction stream represented by the byte codes, so that the intelligent contract is executed, and the state of parameters in the contract is changed.
Through the above process, when the intelligent contract is issued, the compiled byte codes of the intelligent contract are deployed to each node. When dependencies on external interfaces are introduced in source code during compilation from contract source code into bytecode, it is often the case that compiled code is inflated.
FIG. 2 illustrates a compilation process diagram of an intelligent contract. As mentioned above, the intelligent contract may be written in a high-level language, and therefore, when a developer writes the intelligent contract, some functions may be defined in the contract, or called contract interfaces, as needed, and dependencies on other interfaces may also be introduced in the contract, that is, some external functions are called, where the external functions refer to functions other than the functions defined in the contract and are usually provided by an external function library, for example, an intelligent contract development tool or a development platform may provide a system function library and/or a third-party function library, or other third-party organizations may also provide a third-party function library, and so on.
In the example of FIG. 2, a smart contract written in a high-level language C contains the following source code:
int openat(…){
…
size=_myvm_strlen(…);
…
}
the above source code segment defines a contract function or contract interface "openat", in which the library function "_ myvm _ strlen" in the system library libc provided by the contract development platform for C language is called, and the function is used for obtaining the length of the character string, and is an external function of the contract relative to the contract.
When compiling the source code, for a conventional statement, the compiler directly compiles the statement itself into bytecode. However, when the external function is called, the compiler queries the corresponding function library, obtains the implementation code of the external function from the function library, incorporates the implementation code into the contract, and then compiles the implementation code into byte code.
For example, by querying the system library libc, the implementation code "size _ t strlen (constchar. s) … …" of the library function "_ myvm _ strlen" may be found, as pointed by the arrow in FIG. 2. This section of implementation code is then incorporated into the contract and compiled into bytecode.
Therefore, the code section in the contract module generated by compilation includes, in addition to the bytecode generated by compilation of the contract self statement, the bytecode generated by compilation of the implementation code of the external function. For example, in the wasm module generated by contract compilation in fig. 2, the code section contains not only the bytecode implementing the contract function "openat" but also the bytecode implementing the external function "_ myvm _ strlen".
Through the above process, it can be seen that if a dependency on an external interface is introduced into the contract source code, or an external function is called, the implementation code of the external function is also compiled and incorporated into the contract module, and thus, a line of calling statements for the external function in the source code is converted into the whole implementation code of the external function, resulting in that the generated bytecode module is extremely expansive. For example, in the case of the intelligent contract written in C/C + +, if the source code is 2k in size, the generated bytecode code is usually at least 20k, and the code volume is expanded by more than 20 times.
The expansion of the code in the compiling process causes the generated contract byte code to be large in size, and the transmission cost and the deployment efficiency of the contract are increased. Further, when a contract is executed, the performance overhead in the process of loading and parsing the bytecode is also increased by the larger bytecode module, which brings a larger challenge to the performance of the virtual machine execution model.
In view of the above, in one embodiment of the present specification, it is proposed to provide a shared function library in a virtual machine, which contains specific implementations of individual functions. Accordingly, when the intelligent contract source code is compiled and the intelligent contract depends on the external function, only the function declaration information of the external function can be introduced, and the implementation code of the function does not need to be integrated into the contract. When executing the intelligent contract, the virtual machine may obtain the implementation code of the function from its local shared function library, thereby executing the external function. Therefore, the specific implementation code of the external function is not contained in the contract module generated by compiling any more, the module volume is greatly reduced, the efficiency of contract transmission and deployment is improved, and the contract execution performance is also improved.
Specific implementations of the above concepts are described below.
FIG. 3 illustrates a flowchart of a method of compiling a smart contract, according to one embodiment. By the method of fig. 3, the smart contract is compiled into hexadecimal bytecode, and a contract module or a contract file corresponding to the smart contract is generated, where the compiled bytecode is included.
The method of fig. 3 may be applied to intelligent contracts in multiple languages and multiple bytecode formats. For example, in one embodiment, the intelligent contracts may be written in a Solidity language and compiled into bytecode to generate contract modules in the.bin format. In another embodiment, the intelligent contracts are written in a high level language such as C/C + +, Java, Kotlin, TypeScript, Rust, etc., and compiled into WASM byte codes to generate the corresponding WASM format contract modules.
The WASM, WebAssembly, is an open standard developed by the W3C community group, and is a new platform-independent intermediate bytecode format. WASM is a low-level assembly language of classes, has a compact binary format, can run efficiently on the Web, and therefore has recently been the target of compilation of intelligent contracts in blockchains.
FIG. 4 illustrates a schematic diagram of compiling an intelligent contract, showing an example process of compiling a C language written intelligent contract into WASM bytecode, according to one embodiment. The method flow of fig. 3 is described below in conjunction with fig. 4, taking the example of the WASM bytecode, but it is understood that the concept of the compilation process can be generalized to be applicable to other languages and other bytecode formats.
As shown in fig. 3, first, in step 31, a statement in the source code of the smart contract is read. For a conventional contract statement, it is compiled into bytecode according to conventional compilation rules. For example, in the example in fig. 4, the source code segments of the smart contract are the same as those shown in fig. 2, and are all code segments written in C language. For the contract statement "int openat (…)", it is compiled in a conventional manner.
In particular, if the read current statement involves a dependency on an external interface, or the current statement includes a call to an external function, special processing is required. For simplicity, such a statement is referred to as a first statement, and the external function called in the first statement is referred to as a first external function.
For example, the statement "size _ myvm _ strlen (…)" in fig. 4 calls the external function "_ myvm _ strlen", and special processing is performed on the statement.
The special processing of the statement includes a step 32 of determining whether the first external function is a predetermined type of function according to a function library corresponding to the first external function, where the predetermined type of function is a function implemented in the virtual machine, or a predetermined type of function, that is, a function in the shared function library provided by the virtual machine, and its code is already included in the virtual machine.
If the first external function is not a predetermined type function, then the implementation code of the first external function is included into the contract code for compiling processing in a conventional manner; if the first external function is a predetermined type of function, the call to the first external function may be specially compiled. Therefore, it is necessary to first make a judgment on the first external function.
Whether the first external function is a predetermined type of function may be determined in various ways.
First, a function library corresponding to a first external function is determined. The external function called in the contract may be from a system function library or a third party function library. For example, in the example of fig. 4, myvm-libc library is a system function library provided for C language, libc + + library is a system function library provided for C + + language, and mychainlib is a trigonometric function library provided for a blockchain development platform. In one example, the function library used is declared in the contract source code, such as by an "include" statement. In some examples, the function name of the first external function may also contain information of the corresponding function library, for example, the prefix "myvm" of the first external function "_ myvm _ strlen" in fig. 4 indicates the function library information. Through the information, the function library corresponding to the first external function can be determined. For example, it can be determined that the function library corresponding to the first external function "_ myvm _ strlen" is a myvm-libc library.
Then, it is determined whether the first external function is a predetermined type of function based on the function library.
In one embodiment, the function library providing the first external function labels the functions therein in advance, for example, adding a special mark to the function implementing the code contained in the virtual machine. The special mark may take various forms, for example, "extern", "CodeNull", and the like.
In this case, the first external function may be queried in the function library by a function name, and when a flag indicating a predetermined type of function is marked in the function library for the first external function, the first external function is determined to be the predetermined type of function.
For example, according to the example of fig. 4, in the myvm-libc library, a tag "extern" is added before some functions to indicate that the implementation code of the function is already contained in the virtual machine, i.e. the aforementioned predetermined type of function is indicated by the tag. Accordingly, for functions with "extern" tags, only function declaration information of the functions, such as function names, parameter types, return types, and the like, is recorded in the myvm-libc library, but implementation codes of the functions are not included.
For the first external function "_ myvm _ strlen", it may be queried in the myvm-libc library with its function name, resulting in the record "extern _ myvm _ strlen" in the library, i.e., the function library labels a specific label "extern" for the first external function, and thus, it may be determined that the first external function is a predetermined type of function.
In another embodiment, the function library is not specially labeled for predetermined types of functions, but may be differentiated by: for a conventional type function, recording declaration information of the function and an implementation code in a function library; for the function of the preset type, only the declaration information of the function is recorded in the function library, and the implementation code of the function is not recorded.
In such a case, in order to judge the first external function, the compiler may query the first external function in the function library by a function name; and if only a function declaration is recorded in the function library for the first external function and the implementation code of the function is not included, determining that the first external function is a predetermined type of function.
In yet another embodiment, some function libraries may be predetermined to be function libraries dedicated to defining predetermined types of functions, wherein all the included functions are predetermined types of functions. For example, assuming that the development platform has previously integrated implementation code for all functions in the system library myvm-libc into the virtual machine, the function library may be marked as a function library dedicated to defining a predetermined type of function and notified to the compiler. Thus, when the compiler determines that the function library corresponding to the first external function is the dedicated function library, it may determine that the first external function is a predetermined type of function.
As described above, in the case where it is determined that the first external function is a predetermined type of function, special compilation of the first statement that calls the first external function is required.
Specifically, in step 33, a call instruction to the first external function is generated for the first statement. For example, for a first statement, a call instruction is generated, and the first external function is made the object of the call.
In one embodiment, before generating the call instruction, the compiler first checks whether the function call is legitimate. Specifically, the compiler may obtain declaration information of the first external function from a previously determined function library by querying, where the declaration information includes at least one of a parameter type, a parameter number, a return type, and the like, in addition to the function name. The compiler may then check whether the call to the first external function in the first statement matches the declaration information. For example, when a first external function is called in a first statement, the number of parameters provided is checked to see if the parameters are consistent with those in the function declaration, the types of the parameters are checked to see if the parameters are matched with those in the function declaration, the type of the definition for the return value in the contract is checked to see if the definition for the return value is consistent with that in the function declaration, and so on. In the case that the call information in the first statement matches the function declaration, a call instruction to the first external function is generated.
And for the generated call instruction, converting the call instruction into byte codes according to a compiling rule.
Then, in step 34, the bytecode corresponding to the call instruction is included in the code section of the contract module to be formed, and the function information of the first external function is included in the import section of the contract module.
As known to those skilled in the art, an intelligent contract may generate a corresponding contract module, or contract file, by compiling. The contract module contains byte codes after contract compiling, and optionally can also contain other contract related information. Contract modules in different language formats may have different module forms.
For example, taking a contract module in the WASM format as an example, the generated contract module includes a plurality of sections, wherein the mandatory section includes a code section, and a compiled WASM byte code of the contract source code is recorded. In addition, the WASM file optionally contains an import section and an export section. The import section (import section) defines functions, tables, memories, global variables, etc. that the module imports from other modules, and the export section (export section) defines functions, tables, memories, global variables, etc. that the module exports.
Accordingly, in step 34, the bytecode corresponding to the call instruction may be included in the code block, and the function declaration information of the first external function may be included in the lead-in block.
Referring to fig. 4, a WASM module is illustrated. It can be seen that for the first external function "_ myvm _ strlen", its function declaration information is contained in the lead-in section of the WASM module, as shown by "import _ myvm _ strlen" (…). Accordingly, in the code section of the module, regarding the first external function, only the bytecode corresponding to the call instruction of the function is included in fig. 4, unlike the bytecode including the entire implementation code of the function in fig. 2, and thus is a very brief short section of bytecode.
As can be seen from the above procedures, according to one embodiment of the present specification, when an intelligent contract is compiled and the intelligent contract depends on an external function, implementation code of the external function is no longer incorporated into the contract for compilation, but is converted into a call instruction for the external function, and declaration information of the function is added to an import section of a contract module.
Because only the function declaration is contained and the function implementation code is not contained, the intelligent contract has no obvious expansion in the volume during compiling, so that the generated contract module has small volume, is very beneficial to the transmission and deployment of the contract and obviously improves the contract deployment efficiency.
It should be understood that the premise that the implementation codes of the functions are no longer required to be included in the contract module in the compiling process is that the virtual machine for executing the intelligent contract can locally acquire the implementation codes from the virtual machine, so that the corresponding function functions can be executed, and the intelligent contract is further executed.
The following describes the implementation code of the virtual machine fetch function, and the process of executing the intelligent contract.
It will be appreciated that a virtual machine may also be considered to be a program running on an operating system that is used to simulate some execution environment. Therefore, in one embodiment, a function library for implementing various functions may be added to an existing virtual machine program, and the function library is implemented in the same language as the virtual machine. For example, the virtual machine and the function library can be implemented in C language, or both can be implemented in C + + language. Thus, the virtual machine includes a function library implemented in the same language, which includes function code for executing each function.
Thus, when the virtual machine executes the intelligent contract, if the intelligent contract calls the external function and does not contain the implementation code of the external function, the virtual machine acquires the implementation code of the function from the locally-contained function library and "links" the code implementation body and the corresponding part of the contract module, thereby executing the intelligent contract. In this way, the virtual machine executes the above-described external function with nearly native code performance, so that contract execution efficiency is further improved.
FIG. 5 illustrates a flow diagram of a method of executing an intelligent contract, according to one embodiment. The method is executed by a virtual machine in any node in a blockchain network, where the blockchain network may be a public chain, a private chain, or a federation chain, which is not limited herein.
It will be appreciated that execution of a smart contract is typically triggered by receipt of a transaction invoking the smart contract. Therefore, before the steps of fig. 5 are started, it is assumed that the intelligent contracts have been compiled in advance in the manner of fig. 3, and contract modules generated by the compilation are deployed into the nodes of the blockchain network. Then, when an account (e.g., Alice) at a node wants to invoke the intelligent contract already created and deployed, he may initiate a transaction that invokes the contract, point the destination address field (to field) of the transaction to the contract address of the intelligent contract to be invoked, and include the function in the contract to be invoked in the data field of the transaction. Accordingly, after the virtual machine in each node receives the transaction, the to field may be used to determine the intelligent contract to be invoked, and the method flow of fig. 5 is executed.
As shown in fig. 5, at step 51, a contract module corresponding to the intelligent contract is obtained. It will be appreciated that the intelligent contract is the intelligent contract invoked in the transaction described above, with the contract modules having been previously deployed into the respective nodes. Accordingly, at step 51, the contract module may be loaded into memory. The contract module is generated by compiling the intelligent contract according to the mode of fig. 3, and includes a code block in which a bytecode generated by compiling a source code of the intelligent contract is recorded, and an import section in which function information imported from the outside is recorded. In one embodiment, the contract module is a WASM module. It is assumed that the lead-in section includes function declaration information of the first external function.
In step 52, the bytecode of the code section in the contract module is parsed to obtain the call instruction code for the first external function. It should be understood that, through the compiling process of fig. 3, only the calling information of the first external function is included in the bytecode of the contract module, and the code specifically for implementing the first external function is not included. Accordingly, in this step 52, by parsing the bytecode in the contract module, only the call instruction code of the first external function can be obtained, and the implementation code of the first external function cannot be obtained.
Then, an attempt is made to locally acquire the implementation code of the first external function from the virtual machine, based on the function declaration information of the first external function contained in the lead-in section. As described above, in one embodiment, the virtual machine includes a function library implemented in the same language, and the function library includes implementation codes of respective functions. Therefore, in one embodiment, it may be first determined whether the first external function is a function provided in a function library included in the virtual machine, based on the function declaration information of the first external function. For example, a query may be made in an operating system function library using function declaration information.
Once the first external function is determined to be a function provided in the function library of the virtual machine, in step 53, a function code for implementing the first external function may be determined from the function library provided in the virtual machine, and an executable first code segment corresponding to the function code may be obtained.
In one embodiment, the determined function code for implementing the first external function is compiled into an executable code segment suitable for the platform where the virtual machine is located, i.e., the first code segment. Thus, in this embodiment, the native code segment is obtained as the first code segment by just-in-time compilation.
In another embodiment, all function code in the virtual machine function library is loaded and compiled into executable code suitable for the platform when the virtual machine is started, i.e. simultaneously. Or, for the function code of the external function which is more commonly used, the function code can be loaded and compiled in advance and converted into the executable code. In the above case, the executable code segment corresponding to at least part of the function has been stored in the memory. In the case that the function code corresponding to the first external function has been preloaded and compiled, in step 53, the first code segment suitable for the platform where the virtual machine is located to execute may be directly read from the memory.
Then, in step 54, the calling instruction code obtained by parsing the bytecode is linked to the first code segment to form a linked code. Specifically, in an embodiment, an address for executing the call instruction is pointed to a memory address for storing the first code segment, so as to implement code linking. In another embodiment, the first code segment may also be inserted into the contract bytecode parsed executable code, thereby implementing code linking.
Thus, at step 55, the intelligent contract may be executed by executing the linked code to implement the functionality of the first external function.
FIG. 6 illustrates a schematic diagram of executing an intelligent contract in one example. It can be seen that the WASM contract module exemplarily shown in FIG. 6 is just the contract module generated by compiling in FIG. 4, in which function declaration information of an external function "myvm _ strlen (…)" is contained in the lead-in section, and bytecode corresponding to a call instruction for the external function is contained in the code section.
By the method of fig. 5, the declaration information of the external function can be obtained from the lead-in section, and the call instruction code for the external function is analyzed from the code section. Then, the virtual machine obtains the implementation code of the external function from its own function library, and links it with the parsed contract code. Fig. 6 illustrates 3 operating systems, and a virtual machine and a function library corresponding to each operating system are provided separately for each operating system. The virtual machine acquires the executable code of the external function, which is suitable for the platform, based on the function library, so that the external function is executed, and the intelligent contract is further executed.
Through the process, the contract module does not contain the implementation codes of the external functions, so that the size is very small, the transmission and the deployment of the contract are facilitated, the burdens of the virtual machine for loading the contract module and analyzing the byte codes are greatly reduced, and the execution efficiency of the contract is higher. Furthermore, for the external function called in the contract, the implementation code of the external function is provided by a function library contained in the virtual machine, and the external function is executed in a manner similar to the native code implementation manner, so that the execution efficiency of the contract is further improved. In an actual block chain platform, the execution performance and the throughput rate of the contract are the core of the platform system, so that the execution performance and the throughput of the contract are improved from multiple angles in the above way, and the efficiency and the availability of the platform are greatly improved.
According to an embodiment of another aspect, an apparatus for compiling a smart contract is provided and disposed in a compiler. Fig. 7 shows a schematic block diagram of a compiling apparatus according to an embodiment. As shown in fig. 7, the compiling apparatus 700 includes:
a statement reading unit 71 configured to read a first statement in the source code of the smart contract, wherein the first statement includes a call to a first external function;
a determining unit 72 configured to determine, according to a function library corresponding to the first external function, that the first external function is a predetermined type of function, where the predetermined type of function is a function implemented in a virtual machine executing the intelligent contract;
an instruction generating unit 73 configured to generate a call instruction to the first external function for the first statement, and convert the call instruction into a corresponding bytecode;
a recording unit 74 configured to include the bytecode corresponding to the call instruction in a code section of the contract module to be formed, and include function declaration information of the first external function in an import section of the contract module.
In one embodiment, the function library is a system function library or a third party function library.
According to one embodiment, the determining unit 72 is configured to:
querying the first external function in the function library by a function name;
when a predetermined mark for indicating the predetermined type of function is marked in the function library for the first external function, determining that the first external function is the predetermined type of function.
According to another embodiment, the determining unit 72 is configured to:
querying the first external function in the function library by a function name;
when only a function declaration is recorded in the function library for the first external function and no implementation code of the function is included, determining that the first external function is the function of the predetermined type.
According to a further embodiment, the determining unit 72 is configured to:
when the function library is determined to be a function library dedicated to defining the predetermined type of function, determining the first external function to be a predetermined type of function.
According to one embodiment, the instruction generation unit 73 is configured to:
acquiring function declaration information of the first external function from the function library query, wherein the function declaration information comprises at least one of parameter type, parameter number and return type;
checking whether the call to the first external function in the first statement matches the function declaration information;
in the case of a match, a call instruction to the first external function is generated.
In one embodiment, the bytecode module is a WASM module.
According to another aspect of the embodiments, there is provided an apparatus for executing an intelligent contract, which is deployed in a virtual machine of any node of a blockchain network, where the any node may be embodied as any device, platform or device cluster having computing and processing capabilities, and the virtual machine may be a virtual machine adapted to an intelligent contract format, such as a identity virtual machine, a WASM virtual machine, or the like. FIG. 8 illustrates a schematic block diagram of a contract execution apparatus according to one embodiment. As shown in fig. 8, the contract execution apparatus 800 includes:
a module obtaining unit 81 configured to obtain a contract module corresponding to an intelligent contract, where the contract module includes a code section and an import section, and the import section includes function declaration information of a first external function;
the analyzing unit 82 is configured to analyze the bytecode in the code section to obtain a calling instruction code of the first external function;
a code obtaining unit 83, configured to determine, according to the function declaration information of the first external function, a function code for implementing the first external function from a function library implemented in the same language included in the virtual machine, and obtain an executable first code segment corresponding to the function code;
a linking unit 84 configured to link the calling instruction code to the first code segment, resulting in a linked code;
an execution unit 85 configured to execute the linking code to execute the first external function in the intelligent contract.
According to an embodiment, the apparatus 800 further comprises a receiving unit (not shown) configured to:
a first transaction is received, a target address field of the first transaction pointing to a contract address of the intelligent contract to request invocation of the intelligent contract.
In one embodiment, the bytecode module is a WASM module.
According to an embodiment, the apparatus 800 further includes a determining unit (not shown) configured to determine, according to the function declaration information of the first external function, that the first external function is a function provided in the function library.
In one embodiment, the virtual machine and the function code are implemented in a C language or a C + + language.
According to an embodiment, the code acquisition unit 83 is configured to: compiling the function code into the first code segment, wherein the first code segment is a native code suitable for a platform where the virtual machine is located.
According to another embodiment, the code acquisition unit 83 is configured to: and obtaining the first code segment which is loaded and generated by compiling the function code from the memory, wherein the first code segment is a native code suitable for the platform where the virtual machine is located.
In one embodiment, the linking unit 84 is configured to point the address at which the call instruction code is executed to the memory address at which the first code segment is stored.
According to an embodiment of another aspect, there is also provided a computer-readable storage medium having stored thereon a computer program which, when executed in a computer, causes the computer to perform the method described in connection with fig. 3 and 5.
According to an embodiment of yet another aspect, there is also provided a computing device comprising a memory and a processor, the memory having stored therein executable code, the processor, when executing the executable code, implementing the method described in connection with fig. 3 and 5.
Those skilled in the art will recognize that, in one or more of the examples described above, the functions described in this invention may be implemented in hardware, software, firmware, or any combination thereof. When implemented in software, the functions may be stored on or transmitted over as one or more instructions or code on a computer-readable medium.
The above-mentioned embodiments, objects, technical solutions and advantages of the present invention are further described in detail, it should be understood that the above-mentioned embodiments are only exemplary embodiments of the present invention, and are not intended to limit the scope of the present invention, and any modifications, equivalent substitutions, improvements and the like made on the basis of the technical solutions of the present invention should be included in the scope of the present invention.