Patent Publication Number: US-10764034-B2

Title: Method and system for facilitating data transfer between blockchains

Description:
TECHNICAL FIELD 
     The present disclosure is directed at methods, systems, and techniques for facilitating data transfer between blockchains. 
     BACKGROUND 
     A blockchain is a database that is distributed on computer nodes and that is inherently resistant to corruption and tampering. While initially used for bitcoin, blockchain has applications that extend significantly beyond bitcoin and the financial services industry generally. 
     SUMMARY 
     According to a first aspect, there is provided a method for facilitating data transfer between blockchains, the method comprising sending, from a first blockchain to a second blockchain: lineage verification data that permits the second blockchain to verify a lineage of at least one block of the first blockchain; a proper subset of all non-header data stored using the at least one block; and validity verification data that permits the second blockchain to verify validity of the proper subset of all non-header data sent to the second blockchain from the first blockchain. 
     The non-header data may comprise application data. 
     The proper subset of all application data may comprise a proper subset of all state data stored using the at least one block, wherein the state data represents a state of an application expressed as computer program code that is stored using the first blockchain. 
     The proper subset of all application data may further comprise a first action that is performed by the application and that results in the state of the application. 
     The lineage verification data may comprise: a hash of the at least one block; a hash of a header of a block in the first blockchain immediately below the at least one block; a hash of the application data; and a sufficient number of digital signatures of nodes of the first blockchain to establish that consensus was reached for the at least one block. 
     The validity verification data may comprise one or more hash values selected to permit the second blockchain to determine a Merkle path from a hash of the proper subset of all application data sent to the second blockchain to a Merkle root. 
     The method may further comprise, prior to the sending: receiving a request from the second blockchain for the proper subset of all application data, wherein the request comprises a starting block height of the first blockchain; determining a difference in the proper subset of all application data stored between a block of the first blockchain at the starting block height and a block of the first blockchain at a current block height; and sending as the proper subset of all application data only the difference in the proper subset of all application data. 
     The method may further comprise, prior to receiving the request, sending to the second blockchain an update notifying the second blockchain that the first blockchain has added a block. 
     The update may comprise a height of the block that has been added and a hash of a header of the block that has been added. 
     The method may further comprise, prior to sending the proper subset of all application data: obtaining a unique chain identifier identifying the second blockchain; attempting to confirm an identity of the second blockchain using the chain identifier; and only sending the proper subset of all application data when the attempt to confirm the identity of the second blockchain is successful. 
     Obtaining the unique chain identifier may comprise generating the chain identifier by digitally signing a value comprising a genesis block containing a random seed. 
     The proper subset of all application data may comprise a second action to be performed by an application expressed as computer program code that is stored using the second blockchain. 
     The method may further comprise, after sending the second action to the second blockchain, receiving from the second blockchain: lineage verification data that permits the first blockchain to verify a lineage of at least one block of the second blockchain; data indicating that the second action is pending at the second blockchain, wherein the data indicating that the second action is pending is stored using the at least one block of the second blockchain; and validity verification data that permits the first blockchain to verify validity of the data indicating that the second action is pending at the second blockchain. 
     The method may further comprise, after receiving the data indicating that the second action is pending at the second blockchain, further receiving from the second blockchain: lineage verification data that permits the first blockchain to verify a lineage of at least one additional block of the second blockchain; data indicating that the second action has been performed at the second blockchain, wherein the data indicating that the second action has been performed is stored using the at least one additional block of the second blockchain; and validity verification data that permits the first blockchain to verify validity of the data indicating that the second action has been performed at the second blockchain. 
     The first and second blockchains may be virtualized on a common computer node. 
     According to another aspect, there is provided a system for performing a blockchain-facilitated data transfer, the system comprising a first node comprising part of a first blockchain, the first node comprising network interface hardware for interfacing with a second node; non-volatile storage having stored on it the first blockchain; a processor communicatively coupled to the data store and network interface hardware; and a memory communicatively coupled to the processor and having stored on it computer program code that is executable by the processor and that when executed by the processor causes the processor to perform any of the foregoing aspects of the method or suitable combinations thereof. 
     According to another aspect, there is provided a method for facilitating data transfer between blockchains, the method comprising: receiving, at a second blockchain from a first blockchain: lineage verification data that permits the second blockchain to verify a lineage of at least one block of the first blockchain; a proper subset of all application data stored using the at least one block; and validity verification data that permits the second blockchain to verify validity of the proper subset of all application data sent to the second blockchain from the first blockchain; verifying lineage of the at least one block of the first blockchain using the lineage verification data; verifying validity of the proper subset of all application data using the validity verification data; and adding a new block to the second blockchain, wherein the new block is used to store application data comprising the lineage verification data, the proper subset of all application data, and the validity verification data received from the first blockchain. 
     The proper subset of all application data may comprise a proper subset of all state data stored using the at least one block, wherein the state data represents a state of an application expressed as computer program code that is stored using the first blockchain. 
     The proper subset of all application data may further comprise a first action that is performed by the application and that results in the state of the application. 
     The lineage verification data may comprise: a hash of the at least one block; a hash of a header of a block in the first blockchain immediately below the at least one block; a hash of the application data; and a sufficient number of digital signatures of nodes of the first blockchain to establish that consensus was reached for the at least one block. 
     The state verification data may comprise one or more hash values selected to permit the second blockchain to determine a Merkle path from a hash of the proper subset of all application data sent to the second blockchain to a Merkle root. 
     The method may further comprise, prior to the receiving, sending a request to the first blockchain for the proper subset of all application data, wherein the request comprises a starting block height of the first blockchain, and the proper subset of all application data received from the first blockchain may comprise only a difference in the proper subset of all application data stored between a block of the first blockchain at the starting block height and a block at a current block height of the first blockchain. 
     The method may further comprise, prior to sending the request, receiving from the first blockchain an update that the first blockchain has added a block. 
     The update may comprise a height of the block that has been added and a hash of a header of the block that has been added. 
     The method may further comprise, prior to receiving the proper subset of all application data: obtaining a unique chain identifier identifying the first blockchain; attempting to confirm an identity of the first blockchain using the chain identifier; and only receiving the proper subset of all application data when the attempt to confirm the identity of the first blockchain is successful. 
     Obtaining the unique chain identifier may comprise generating the chain identifier by digitally signing a value comprising a genesis block containing a random seed. 
     The proper subset of all application data may comprise a second action to be performed by an application expressed as computer program code that is stored using the second blockchain. 
     The method may further comprise, after receiving the second action from the first blockchain, sending to the first blockchain: lineage verification data that permits the first blockchain to verify a lineage of at least one block of the second blockchain; data indicating that the second action is pending at the second blockchain, wherein the data indicating that the second action is pending is stored using the at least one block of the second blockchain; and validity verification data that permits the first blockchain to verify validity of the data indicating that the second action is pending at the second blockchain. 
     The method may further comprise, after sending the data indicating that the second action is pending at the second blockchain: performing the action; and further sending to the first blockchain: lineage verification data that permits the first blockchain to verify a lineage of at least one additional block of the second blockchain; data indicating that the second action has been performed at the second blockchain, wherein the data indicating that the second action has been performed is stored using the at least one additional block of the second blockchain; and validity verification data that permits the first blockchain to verify validity of the data indicating that the second action has been performed at the second blockchain. 
     The second action may be performed only when the attempt to confirm the identity of the first blockchain is successful. 
     The first and second blockchains may be virtualized on a common computer node. 
     According to another aspect, there is provided a system for performing a blockchain-facilitated data transfer, the system comprising a second node comprising part of a second blockchain, the second node comprising: network interface hardware for interfacing with a second node; non-volatile storage having stored on it the second blockchain; a processor communicatively coupled to the data store and network interface hardware; and a memory communicatively coupled to the processor and having stored on it computer program code that is executable by the processor and that when executed by the processor causes the processor to perform any of the foregoing aspects of the method or suitable combinations thereof. 
     According to another aspect, there is provided a method for virtualizing blockchains, the method comprising: running a hypervisor on a computer node, wherein the hypervisor comprises a host controller; and running at least one guest blockchain on the hypervisor, wherein the host controller allocates at least some hardware resources of the node in response to requests from the at least one guest blockchain. 
     The at least some hardware resources may comprise input/output hardware. 
     The input/output hardware may comprise disk access and network interface hardware. 
     The at least some hardware resources may comprise processor resources of the node for compute operations that satisfy at least one of a processor time and processor intensity threshold. 
     The host controller may comprise a host blockchain, and the at least one guest blockchain may be stored outside of the host blockchain. 
     The host controller may comprise a host blockchain, and the at least one guest blockchain may be stored in the host blockchain. 
     The at least one guest blockchain may comprise a first guest blockchain and a second guest blockchain, and the second guest blockchain may be stored in the first guest blockchain. 
     The at least one guest blockchain may comprise a first guest blockchain and a second guest blockchain, and the second guest blockchain may be stored in the host blockchain and not in the first guest blockchain. 
     The method may further comprise storing on the host blockchain a history of hardware operations using the hardware resources allocated by the host blockchain. 
     The at least one guest blockchain may comprise a third guest blockchain and the hardware operations may result from running an application stored as computer program code on the third guest blockchain, and the method may further comprise storing on the host blockchain a history of states of the application at different times. 
     The at least one guest blockchain may comprise a third guest blockchain and the hardware resources may be allocated in response to running an application stored as computer program code on the third guest blockchain, and the method may further comprise storing on the host blockchain a history of states of the application at different times. 
     The method may further comprise: accessing the history of states of the application; and reverting the application to a previous state that comprises part of the history of states. 
     The method may further comprise: permitting another computer node to connect to the host blockchain; and reverting the application in response to input from the other computer node. 
     The method may further comprise using the hypervisor to route to the third guest blockchain actions to be performed by the application. 
     The method may further comprise storing on the host blockchain a history of the actions routed to the third guest blockchain by the hypervisor at different times. 
     The at least one guest blockchain may further comprise additional blockchains and the actions to be performed by the third guest blockchain may comprise a proper subset of all actions routed by the hypervisor to the third guest blockchain and to the additional blockchains in an original order, and the method may further comprise, after reverting the application to a previous state, routing at least some of the actions to the third guest and additional blockchains in an order different than the original order. 
     According to another aspect, there is provided a method for virtualizing blockchains, the method comprising: running a hypervisor on a computer node, wherein the hypervisor comprises a host blockchain; and running a first guest blockchain in an environment resulting from running the hypervisor, wherein at least some hardware operations of the node requested by the first guest blockchain are handled by the host blockchain for the first guest blockchain. 
     According to another aspect, there is provided a method for virtualizing blockchains, the method comprising: running a hypervisor on a computer node, wherein the hypervisor comprises a host blockchain; and running a first guest blockchain on the computer node, wherein the first guest blockchain is stored in the host blockchain. 
     According to another aspect, there is provided a system for virtualizing blockchains, the system comprising: network interface hardware for interfacing with another computer node; non-volatile memory having stored on it the first blockchain; a processor communicatively coupled to the data store and network interface hardware; and a memory communicatively coupled to the processor and having stored on it computer program code that is executable by the processor and that when executed by the processor causes the processor to perform any of the foregoing aspects of the method for virtualizing blockchains or suitable combinations thereof. 
     According to another aspect, there is provided a non-transitory computer readable medium having stored thereon computer program code that is executable by a processor and that when executed by the processor causes the processor to perform the method of any of the foregoing aspects or suitable combinations thereof. 
     This summary does not necessarily describe the entire scope of all aspects. Other aspects, features and advantages will be apparent to those of ordinary skill in the art upon review of the following description of specific embodiments. 
    
    
     
       BRIEF DESCRIPTION OF THE DRAWINGS 
       In the accompanying drawings, which illustrate one or more example embodiments: 
         FIG. 1  depicts a system for facilitating data transfer between blockchains, according to one example embodiment. 
         FIG. 2  depicts a software stack comprising part of the system of  FIG. 1 . 
         FIG. 3  depicts a physical network topology for the system of  FIG. 1 . 
         FIG. 4  depicts a flow diagram showing performance of an action to affect system state using a reducer and consensus being achieved for a blockchain, according to the system of  FIG. 1 . 
         FIGS. 5A and 5B  depict a UML sequence diagram showing how two blockchains perform a read join, according to the system of  FIG. 1 . 
         FIG. 6  depicts a block diagram showing how two blockchains perform a write join, according to the system of  FIG. 1 . 
         FIGS. 7A to 7C  depict a UML sequence diagram showing how two blockchains perform a write join, according to the block diagram of  FIG. 6 . 
         FIG. 8A  depicts a system for facilitating data transfer between blockchains, according to another example embodiment. 
         FIG. 8B  depicts a block diagram of a hypervisor and the various blockchains running thereon, according to the system of  FIG. 8A . 
     
    
    
     DETAILED DESCRIPTION 
     A blockchain&#39;s physical layer comprises computer nodes on which is collectively stored a distributed database. The database is stored as a generally linear chain of “blocks”, with each subsequent block in the chain directly linked in a cryptographically secure manner to the immediately preceding block in the chain. New blocks added to the blockchain are referred to as being “higher” in the blockchain than the blocks added to the blockchain prior to it. The first, or lowest, block in the blockchain is referred to as the “genesis block”. Because each block in the blockchain is directly linked to its immediately preceding block, any block in the blockchain can, directly or indirectly, be traced back to the genesis block. This is one way in which any one of the nodes can check the validity of the blockchain. 
     A blockchain can be implemented in a variety of ways. In one example implementation of blockchain used for bitcoin, each block of a blockchain comprises that block&#39;s size, in bytes; a block header; a transaction counter, representing the number of different bitcoin transactions stored in that block; and transaction data, which are the stored transactions. In the same example implementation, the block header for each block comprises version information; a previous block hash, which is a reference to the hash of the block immediately preceding that block; a Merkle root, which is a hash of the Merkle tree root of the transactions stored in that block; a timestamp, which is when the block was created; a difficulty target, which is the minimum difficulty that had to be satisfied when performing a proof-of-work operation during block creation; and a nonce, resulting from the proof-of-work. 
     In a conventional blockchain implementation, different nodes comprising part of the blockchain compete to generate new blocks by performing a proof-of-work operation that satisfies at least the difficulty target specified in each of the new blocks&#39; headers. Once generated, a new block is disseminated to, and its authenticity is independently verified by, other nodes in the blockchain by using the previous block hash (to confirm that new block&#39;s lineage) and Merkle root (to confirm the validity of the transactions stored in that new block). Once a new block has been verified, it is added to the top of the blockchain. The blockchain at any given time is typically the chain having blocks resulting from the highest possible cumulative proof-of-work. The nodes are said to have arrived at “consensus” when they agree as to which block is to be added to the top of the blockchain. While the blockchain may fork from time-to-time, resulting in temporarily competing versions of the blockchain, the fact that each block is cryptographically linked to its immediately preceding block means that blocks far from the top of the blockchain are, for practical purposes, immutable. 
     The distributed and peer-to-peer nature of blockchain described above is also associated with some drawbacks. For example, a byproduct of blockchain&#39;s distributed nature is that all nodes comprising part of a blockchain have access to all the data stored on that blockchain, making privacy protection difficult. While certain non-header data on a blockchain may be encrypted, encryption introduces technical overhead and also inhibits what can be done, such as implementing applications as smart contracts, with the data. Furthermore, as a single node scales and is concurrently a node for an increasing number of blockchains, the computational resources required of that node also scale upwards linearly, impeding the ability of that node to efficiently be a member of a high number of blockchains. 
     The embodiments described herein are described as methods, systems, and techniques to mitigate at least one of the foregoing problems. For example, in at least some of the embodiments described below data may be securely shared between blockchains by a process referred to herein as “chain joining”. Using joining, a first blockchain may securely share with a second blockchain a proper subset of non-header data stored on the first blockchain; this is in contrast to being forced to share all of the data stored on the first blockchain, as is required between all the nodes comprising the first blockchain. In at least one of the depicted embodiments herein, the non-header data replaces the transaction data stored on a blockchain when the blockchain is used to implement bitcoin. For example, in at least some of the example embodiments, the non-header data comprises an action that is performed by an application implemented as a smart contract also stored on the blockchain, and data representing the resulting application state that follows from performing that action. Each action in the embodiments depicted herein comprises a JSON object, although in different embodiments an action may comprise a different data structure. Sending, from a first blockchain, the application state data and the action whose performance by the first blockchain results in the application state allows a second blockchain to independently determine whether the state it receives from the first blockchain is accurate. 
     In at least some example embodiments, the non-header data of a blockchain comprises application data, which is data related to an application stored in the blockchain, such as the applications itself or application state data. For example, in an application configured to store a list of contacts, application state data may comprise a list of those contacts, and a proper subset of application state data may comprise a single entry in that list. In some other example embodiments, the non-header data may not be related to any particular application may comprise a JSON object or binary files. 
     Furthermore, in at least some of the embodiments described below any one or more nodes may use a hypervisor to virtualize (either fully or using paravirtualization) one or more blockchains while routing system operations through a host controller running on each of those one or more nodes. The host controller may itself be a blockchain (“host blockchain”). The host controller allocates at least some hardware resources of the node on which it runs in response to requests from one or more blockchains running on the hypervisor; each of those chains is referred to interchangeably herein as a “guest blockchain”. The host controller performs resource allocation based on, for example, resource availability and task priority. This permits the different blockchains to efficiently share that node&#39;s hardware resources, thereby facilitating scaling. Furthermore, in embodiments comprising the host blockchain, the computer program code for at least one of the guest blockchains may be stored in the host blockchain. This permits the host blockchain to store a list of all of those guest blockchains&#39; application state changes, thereby permitting a user to easily to change the state of those applications to any previous state stored in the host blockchain. This may in particular be useful for at least one of debugging and auditing the activities of that node. In embodiments comprising the host blockchain, one or more of the guest blockchains may be stored in the host blockchain, while a different one or more of the guest blockchains may be stored outside of the host blockchain; all guest blockchains may nonetheless have resources allocated for them by the host blockchain, thereby facilitating scalability. 
     Referring now to  FIG. 1 , there is shown a system  100  for facilitating data transfer between blockchains, according to one example embodiment. The system  100  comprises first through twelfth nodes  104   a - 1  (generally, “nodes  104 ”), each of which comprises part of one or more blockchains  102   a - g  (generally, “blockchains” or “chains”  102 ). A first blockchain  102   a  comprises the first through fourth nodes  104   a - d ; a second blockchain  102   b  comprises the fifth through eighth nodes  104   e - h ; and a third blockchain comprises the ninth through twelfth nodes  104   i - 1 . 
     As discussed in further detail below, the first blockchain  102   a  is “joined” to a fourth blockchain  102   d  (via the second node  104   b ) and to a fifth blockchain  102   e  (via the third node  104   c ): this permits all or some of the data stored on the first blockchain  102   a  to be securely shared with the fourth and fifth blockchains  102   d,e , respectively. The second blockchain  102   b  is analogously joined to the fourth blockchain  102   d  (via the sixth node  104   f ) and the sixth blockchain  102   f  (via the seventh node  104   g ), and the third blockchain  102   c  is analogously joined to the sixth blockchain  102   f  (via the tenth node  104   j ) and the fifth blockchain  102   e  (via the eleventh node  104   k ). 
     Also as discussed in further detail below, as the fourth blockchain  102   d  is joined to the first and second blockchains  102   a,b , the first and second blockchains  102   a,b  may read and write data from and to each other via the fourth blockchain  102   d . Analogously, the second and third blockchains  102   b,c  may read and write data from and to each other via the sixth blockchain  102   f , and the first and third blockchains  102   a,c  may read and write data from and to each other via the fifth blockchain  102   e . The fourth through sixth blockchains  102   d - f  are accordingly interchangeably referred to herein as “transfer blockchains” as they facilitate the selective transfer of data between the first through third blockchains  102   a - c.    
     The eighth blockchain  102   g  in the system  100  is a “directory blockchain” on which is stored data to be freely accessible by the first through third blockchains  102   a - c.    
     While in a conventional bitcoin implementation, generating new blocks comprises applying a proof-of-work, in the depicted embodiments consensus is achieved without applying proof-of-work. For example, the depicted embodiments herein, consensus is determined in accordance with the method as described in the thesis of Ethan Buchman, June 2016, University of Guelph, https://atrium.lib.uoguelph.ca/xmlui/handle/10214/9769. In different embodiments (not depicted), consensus may be determined using proof-of-work, proof-of-stake, or a different method. 
     The structure of the second node  104   b  is highlighted in  FIG. 1 . The other nodes  104   a,c - 1  in the system  100  share analogous structures, although in different embodiments (not depicted) any one or more of the nodes  104  may differ in structure from each other. 
     Referring now to  FIG. 3 , there is shown a physical network topology for the system  100  of  FIG. 1 . The system  100  comprises first through third local area networks (“LANs”)  306   a - c , each protected by a respective firewall  304   a - c . The LANs  306   a - c  are communicatively coupled together via a wide area network (“WAN”)  302 , such as the Internet. The first through third blockchains  102   a - c  are respectively local to the first through third LANs  306   a - c ; each of the fourth through seventh blockchains  102   d - g  communicate through at least two of the firewalls  304   a - c  and the WAN  302 . 
     Referring back to  FIG. 1 , the second node  104   b  comprises a processor  106  that controls the node&#39;s  104   b  overall operation. The processor  106  is communicatively coupled to and controls several subsystems. These subsystems comprise user input devices  108 , which may comprise, for example, any one or more of a keyboard, mouse, touch screen, voice control; random access memory (“RAM”)  110 , which stores computer program code for execution at runtime by the processor  106 ; non-volatile storage  112 , which stores the computer program code executed by the RAM  110  at runtime and which also stores the blockchains  102   a,d  of which the second node  104   b  is a part, as discussed in further detail in respect of  FIG. 2 ; a display controller  114 , which is communicatively coupled to and controls a display  116 ; and a network controller  118 , which facilitates network communications with the other nodes  104   a,c - 1 . 
     Referring now to  FIG. 2 , there is shown a software stack  200  comprising part of the system  100  of  FIG. 1 . The software stack  200  may be expressed as computer program code and stored in the non-volatile storage  112 , and the processor  106  may load some or all of that computer program code into the RAM  110  as desired at runtime. The software stack  200  is based on Node.js and accordingly uses JavaScript  202  and, in particular, the JavaScript Express  204 , Redux  206 , and React  208  libraries. JavaScript  202  is used to implement the blockchain. JavaScript Express  204 , Redux  206 , React  208 , and HTML and CSS  210  are used as a framework for application development. While JavaScript  202  and its associated libraries  204 , 206 , 208  are used in this example embodiment, in different example embodiments (not depicted) any one or more of them may not be used for implementation. For example, in certain different embodiments, even if none of the JavaScript Express  204 , Redux  206 , and React  208  libraries are used, application state may still be tracked using a cryptographically verifiable JSON object. 
     An application is run as a smart contract on any one of the blockchains  102  in the system  100 .  FIG. 4  depicts a flow diagram  400  showing performance of an action by the system  100  to affect system state using a reducer and consensus being achieved for any one of the blockchains  102  by applying consensus as described above, according to the system  100  of  FIG. 1 . In the system  100 , a Redux  206  store stores the application&#39;s state tree and accordingly is analogous to RAM for the application. An action is created in the user space at block  402 , for example in response to user input via one of the user input devices  108 , and is dispatched using an asynchronous variant of Redux&#39;s  206  dispatch( ) method at block  404  to the blockchain fabric (i.e., automatically to the other nodes  104  comprising the blockchain  102  by virtue of blockchain&#39;s peer-to-peer nature). The action transitions from the user space to the blockchain fabric at block  406  and propagates through the nodes  104  comprising the blockchain  102  at block  408 . Each of the nodes  104  of the blockchain  102  consequently eventually receives a copy of the action at block  410 , and each of the nodes  104  independently evaluates the effect of that action on the current state of the application, which it retrieves at block  412 , by performing the action with a reducer at block  414 . Once the node  104  performs the action at block  414 , the blockchain  102  achieves consensus at block  416  as to the blockchain&#39;s  102  next state. The next state that results from that consensus is accepted by the nodes  104  as the correct next state at block  418 , and is sent to the user space at block  420 . 
       FIG. 8A  depicts another example embodiment of the system  100  for facilitating data transfer between blockchains  102 . The system  100  of  FIG. 8A  comprises a thirteenth node  104   m , which is concurrently a member of six blockchains  102   h - m : a host blockchain  102   h , and eighth through twelfth blockchains  102   i - m . The eighth through twelfth blockchains  102   i - m  also respectively comprise additional nodes  104   n - r . Each of the blockchains  102   h - m  is paravirtualized on the thirteenth node  104   m , although in different embodiments (not depicted) the blockchains  102   h - m  may be fully virtualized or, as discussed in further detail below, neither fully virtualized nor paravirtualized.  FIG. 8B  depicts a hypervisor  800  used for that paravirtualization, and shows the blockchains  102   h - m  running on the hypervisor  800 . 
     In  FIG. 8B , the eighth, eleventh, and twelfth blockchains  102   i,l,m  are nested within the host blockchain  102   h , and the ninth and tenth blockchains  102   j,k  are nested within the eighth blockchain  102   i  (and consequently also within the host blockchain  102   h ). One blockchain  102  is “nested” within another blockchain  102  (the “parent blockchain  102 ”) when the parent blockchain  102  executes an application to create the nested blockchain  102 , and when the parent blockchain  102  accordingly can terminate the nested blockchain  102 . In the depicted embodiment, the parent and nested blockchains  102  are otherwise equivalent. 
     The hypervisor  800  interfaces with the physical world  804  via computer hardware responsible for input/output operations (“I/O hardware”), such as the user input devices  108  that provide user input to the hypervisor  800 , and disk access and network interface hardware  808  that perform disk access and network communication functions. The hardware  808  interfaces with various third party components  806  such as servers that provide external services, application programming interfaces, and databases. 
     The hypervisor  800  is implemented in JavaScript  202  and comprises an action queue  816 , a router  818 , and various operating environments for the blockchains  102   h - m . The router  818  is communicatively coupled to first through sixth dispatch modules  820   a - f  in series, and the first through sixth dispatch modules  820   a - f  are in turn communicatively coupled to the blockchains  102   h - m , respectively. The blockchains  102   h - m  each respectively comprises a store  812   a - f  for an application, with each store  812   a - f  effectively acting as RAM for an application on that blockchain  102   h - m . In at least some example embodiments, an application stored on the blockchain comprises more than a smart contract. For example, an application may comprise a smart contract, which represents a function that returns a value; a saga, which performs actions other than returning a value, such as interactions with hardware; and the actions that interact with the smart contract and the saga. The actions that the saga performs, which are requested using the blockchain and the actual performance of which are performed without the blockchain achieving consensus, are herein referred to as “side effects”. While the actual performance of the side effect or action is not subject to consensus, the determination made by the blockchain to perform the side effect is subject to consensus, and the determination made by the blockchain to accept the result of the side effect is also subject to consensus. Each of the applications in the stores  812   a - f  comprises a reducer that performs actions to determine blockchain state. Additionally, side effects, such as interactions between a blockchain  102  and hardware, that may result from the reducer performing that action are handled by side effect managers  814   a - f  for the stores  812   a - f , respectively. 
     In one example embodiment, the method of  FIG. 4  may be implemented using the hypervisor  800  of  FIG. 8A , as follows. A user who creates an action by providing input via one of the user devices  108  generates an action at block  402 , which is placed in the action queue  816 . The action queue  816  also receives actions from the side effect managers  814   a - f . The action queue  816  eventually dispatches the user generated action to the router  818 , which routes it to the blockchains  102   i - m  relevant to that action; for the purposes of this example, the eighth blockchain  102   i  is the only blockchain  102  affected by the action. The router  818  routes the action directly to the third dispatch module  820   c . This corresponds to block  406  in  FIG. 4 . The host blockchain  102   h  captures the action as soon as it is converted from hardware to an action; the I/O hardware (whether the user input device  108  or hardware  808 ) interacts with the host blockchain  102   h  and the action is consequently recorded in the host blockchain  102   h  before the action is even sent to the action queue  816 . The router  818  routes actions in the action queue  816  to the appropriate dispatch module  812   a - f . The router  818  sends actions to any given one of the chains  102   i - m  in the order in which those actions are placed in the action queue  816 ; however actions for different blockchains  102   i - m  may be sent to the dispatch modules  812   a - f  for those blockchains  102   i - m  out of order. For example, if the action queue  816  receives a first action for the eighth blockchain  102   i , then a second action for the ninth blockchain  102   j , and then a third action again for the eighth blockchain  102   i , the router  818  may send the first and third actions to the eighth blockchain  102   i  before sending the second action to the ninth blockchain  102   j . However, the router may not send the third action to the eighth blockchain  102   i  before the first action. 
     Once the action arrives at the eighth blockchain  102   i , the thirteenth node  104   m  broadcasts the action to any other nodes  104  comprising part of that blockchain  102   i , which as shown in  FIG. 8A  comprises the additional node  104   n ; this corresponds to blocks  408  and  410  in  FIG. 4 . The thirteenth node  104   m  communicates via the host blockchain  102   h , which interfaces with the disk access and network interface hardware  808  as necessary to communicate with that additional node  104   n . The additional node  104   n  eventually receives and performs the action at its reducer at block  414 . Back at the thirteenth node  104   m , the reducer comprising part of the second store  812   b  performs the action, and again via the host blockchain  102   h  shares the new state it determines to the additional node  104   n . The eighth blockchain  102   i  eventually reaches consensus, which corresponds to block  416  of  FIG. 4 , with communication involving the node  104   m  on which the hypervisor  800  runs occurring again via the host blockchain  102   h . Once consensus is reached, the eighth blockchain  102   i  settles on its new state at block  418 , and relays this new state to the user again via the host blockchain  102   h  via the user input hardware  108 , which corresponds to block  420 . 
     A side effect in the form of a hardware operation may be required when a reducer performs an action. Any hardware operation is performed by the hypervisor  800  in response to an instruction from the host blockchain  108   h ; the host blockchain  108   h  consequently is aware of and records all hardware operations and related actions in its blocks. The host blockchain  108   h  also records the result of performing that action, which is the new application state for the blockchain  102  that received the action. Each blockchain  108  also returns a “success” or “failure” indicator after an action is performed, indicating whether the action was successfully performed, which the host blockchain  108   h  also records. 
     In the depicted example embodiment, the host blockchain  108   h  also monitors and handles resource allocation for compute operations (operations that do not use the I/O hardware but that do require the node&#39;s  104   m  processor) that satisfy at least one of a processor time and processor intensity threshold. This permits the host blockchain  108   h  to allocate and store processor resources for particularly computationally intensive tasks, such as certain cryptographic tasks. 
     While in  FIGS. 8A and 8B  the thirteenth node  104   m  is described as communicating with the additional nodes  104   n - r  via the disk access and network interface hardware  808 , in different embodiments (not depicted) communication may be between blockchains  102  that are hosted on the same node  104  and even running on the same hypervisor  800 . In those example embodiments, communication between blockchains  102  can be done with lower latency and a lower transmission time than when communication need be done through the hardware  808 . 
     The applications on the blockchains  102   h - m  are configured such that all hardware interactions with any of the blockchains  102   i - m  occur via the host blockchain  102   h . For example, all network communications, which occur via the disk access and network interface hardware  808 , and user interactions, which occur via the user input devices  108 , are performed by the eighth through twelfth blockchains  102   i - m  via the host blockchain  102   h . The host blockchain  108   h  accordingly is configured to interact with all hardware as instructed by any of the blockchains  108   i - m  nested therein. The host blockchain  102   h  records in its blocks all hardware operations (requests and responses, and user inputs conveyed via hardware) and application states of the applications running on each of those nested blockchains  102   i - m . In some different embodiments (not depicted), the host blockchain  102   h  may record some and not all of the operations involving the I/O hardware. The host blockchain  102   h  also records all actions that are routed to the blockchains  102   i - m  at least by virtue of those actions being routed through the router  818  and, if those actions require I/O hardware usage, by virtue of that as well. This permits a user access to the entire state history and hardware operations of all of those nested blockchains  102   i - m . That user accordingly is able to revert to a previous application state of any of the blockchains  102   i - m  and adjust the order of actions in the action queue  816  to simulate how the hypervisor  800  and blockchains  102   i - m  would have reacted had the actions arrived in a different order than the original order they were in fact received; in one example use case, this is done when an application throws a fault. This permits the system  100  to be thoroughly tested by virtue of allowing simulation of different timing errors that the system  100  may experience. The blocks of each of the nested blockchains  102   i - m  for a subset of the data contained within the blocks of the host blockchain  102   h . During debugging or testing, a user may select any action from the action queue  816  for routing to the blockchains  102   i - m  via the router  818 , regardless of the order in which the action queue  818  received the actions. The input/output operations are made to be procedural and deterministic; consequently, the hardware responds to an action in the same manner regardless of when it receives that action, which facilitates changing the order of actions during debugging or testing. 
     Another node may connect to the host blockchain  108   h , and the reverting of the application to an earlier state may be done in response to input from that other node. This other node may, for example, be that of a third provider providing technical support. 
     While the depicted example embodiment shows the blockchains  102   h - m  as paravirtualized on the hypervisor  800 , in different embodiments (not depicted) neither fully virtualization nor paravirtualization need be used. In some of those different embodiments, some of the nodes  104  fully virtualize or paravirtualize the blockchains  102   h - m  using the hypervisor  800  while others do not. Additionally, in some of those different embodiments in which at least one of the nodes  104  uses the hypervisor  800  for fully virtualization or paravirtualization, some or all of the blockchains  102   h - m  may be fully virtualized or paravirtualized. For example, while the flow diagram  400  of  FIG. 4  may be implemented using the hypervisor  800  of  FIG. 8B , in different embodiments (not depicted) virtualization need not be used for its implementation. 
     Chain Joining 
     While all of the nodes  104  on any given one of the blockchains  102  have access to all the data stored on the blockchain  102 , different blockchains  102  do not by default share data between each other. The method of chain joining, described below, permits data to be shared between different blockchains  102 . 
       FIGS. 5A and 5B  depict a UML sequence diagram  500  showing how two blockchains  102   a,b  perform a read join, according to the system  100  of  FIG. 1 . While the first and second blockchains  102   a,b  are used in the diagram  500 , a read join may be performed between any two blockchains  102 . For example, while the first and second blockchains  102   a,b  do not share any nodes  104 , a read join may be performed between blockchains  102  that share nodes  104  and, in some example embodiments, that are virtualized (fully or paravirtualized) on at least some of the same nodes  104  using, for example, the hypervisor  800 . 
     In the diagram  500 , the second blockchain  102   b  reads data from the first blockchain  102   a ; for the purposes of the diagram  500 , the second blockchain  102   b  is accordingly interchangeably referred to as the “consumer chain  102   b ” and the first blockchain is accordingly interchangeably referred to as the “provider chain  102   a”.    
     At operation  502 , the provider chain  102   a  updates its join management routine. A user commences this by providing input via one of the user input devices  108  of one of the nodes  104   a - d  comprising the provider chain  102   a . The user input is dispatched as an action (“@@CHAIN_SHARE_STATE”) by the router  818  to the provider chain  102   a  on that node  104  for performance by that chain&#39;s  102   a  reducer. The action&#39;s payload is digitally signed so that it is cryptographically verifiable (i.e., any tampering can be detected). The action&#39;s payload comprises a chain identifier of the consumer chain  102   b  (“&lt;chainID&gt;”), a path identifying the proper subset of the state data of the provider chain  102   a  to be read by the consumer chain  102   b  (“statePath: ‘/foo/’”), and an alias identifying this particular chain join (“joinName: ‘fooJoin’”). In the diagram  500 , the state information available to the provider chain  102   a  is represented using a directory tree. The root of the tree having path “I” represents all the state data available to the provider chain  102   a ; and subdirectories, such as “/foo/”, represent a proper subset or “slice” of that state data. 
     The chain identifier is unique and is generating by digitally signing a value comprising the provider chain&#39;s  102   a  genesis block modified to contain a random seed. The random seed ensures uniqueness. At any time during the read join, the provider chain  102   a  may confirm the identity of the consumer chain  102   b  using the chain identifier and only send the slice of state data to the consumer chain  102   b  when the attempt to confirm that identity is successful. 
     At operation  504 , the same or a different user provides input via one of the user input devices  108  of one of the nodes  104   e - h  comprising the consumer chain  102   b . The user input is dispatched as an action (“@@CHAIN_READ_STATE”) by the router  818  to the consumer chain  102   b  on that node  104  for performance by that chain&#39;s  102   b  reducer. The action&#39;s payload is a cryptographically secure chain identifier of the provider chain  102   a  (“&lt;chain ID&gt;”), a path identifying where the state data is to be stored (“mount: ‘/mnt/foo’”, with the state data that is read by the consumer chain  102   b  is stored using the model of a mounted filesystem), an alias identifying this particular chain join (“joinName: ‘fooJoin’”), and various options for the read join. Example options comprise a data age limit, which requires data being transmitted via the read join to be less than a certain age to be usable for all or some actions; a frequency threshold, which defines how quickly the read join is to repeat to update the state data on the consumer chain  102   b ; and a maximum size limit, which sets a flag if the data transmitted by the read join exceeds a maximum limit. 
     Once operations  502  and  504  have been performed, the read join is initialized. Operations  502  and  504  may be performed concurrently or one of the operations  502 , 504  may be performed before the other of the operations  502 , 504 . 
     Once the read join is initialized, the provider chain  102   a  enters into a loop comprising operations  506  and  508  that it performs for each block on the chain  102   a . An action (“@@CHAIN_BLOCK_CREATED”) is generated each time a new block is added to the provider chain  102   a . New block creation comprises the provider chain  102   a  application deciding to create a block, which triggers a side effect, which when the hypervisor  800  is used is handled by the side effect manager  814 . The action&#39;s payload is the block height for that new block (“currentBlockHeight: 1234”), the hash of that new block&#39;s header (“currentBlockHash: block1234Hash”), and a timestamp identifying when that block was created (“currentBlockTime: 12374433543”). In some example embodiments, the timestamp is omitted. At operation  508 , the provider chain  102   a  sends an update in the form of the @@CHAIN_BLOCK_CREATED action to the consumer chain  102   b , notifying the consumer chain  102   b  that a new block has been created. The update comprises the height and header hash of that new block. The consumer chain  102   b  may choose to accept and receive a copy of the slice of the state data stored by the newly created block, or skip the update. 
     When the consumer chain  102   b  chooses to receive an update from the provider chain  102   a , operations  510 ,  512 ,  514 , and  516  are performed for each update. At block  510 , the consumer chain  102   b  generates an action (“@@READ_JOIN_DIFF_REQ”) having a payload of the starting block height of the provider chain  102   a  for which the data transfer is to begin (“startBlockHeight: 1200”), which the consumer chain  102   b  knows from operation  504  (the last time it was set) and which the consumer chain  102   b  will update at operation  516  as discussed below; a hash of the header of the block at the starting block height (not shown in  FIG. 7B ) and the alias for the join (“joinNames: [fooJoin]”). At operation  512 , the consumer chain  102   b  requests the updated slice of state data from the provider chain  102   a  by sending the @@READ_JOIN_DIF_REQ action to the provider chain  102   a.    
     In response to the request, the provider chain  102   a  performs an action (“@@READ_JOIN_DIFF_RESP”) to generate the response to the request. In response to the action, the provider chain  102   a  retrieves a header for each of the blocks (regardless of whether a slice of state data is sent from that block, as the headers are used to verify lineage) (blocks  1200  to  1234 ). Each header comprises a hash of the header of the immediately preceding block in the chain  102   a  (“previousBlockHash: ‘block1199Hash’”); a hash of that block&#39;s entre application state, even though only a slice of that state data is to be transmitted (“payloadHash: ‘payloadHash’”); a sufficient number of digital signatures of the nodes of the first blockchain to establish that consensus was reached for that block; and a flag indicating whether an aspect of the chain configuration has changed (i.e., when an aspect that affects the ability to verify block lineage changes), such as when an encryption method (e.g., the type of hash) has changed, when the list of nodes that is entitled to vote for consensus changes, when the digital signature(s) used changes, and when header format changes (“configChanged: false”). The action also generates a hash of the block header (“blockHash: ‘block1200Hash”), which does not comprise part of the header itself. The chain  102   a  also determines a difference in the state data from the starting block height ( 1200 ) to the current block height ( 1234 ) (“stateDiff: {//Provider creates diff from 1200 to 1234}”), so as to avoid sending unnecessary data to the consumer chain  102   b . The provider chain  102   a  also determines a Merkle proof (“merkleProof”), which comprises one or more hash values selected to permit the consumer chain  102   b  to determine a Merkle path from a hash of the application data sent to the second blockchain to a Merkle root, which in this example is in the payloadHash field. The provider chain  102   a  sends the data generated in response to the @@READ_JOIN_DIFF_RESP action to the consumer chain  102   b  at operation  514 . 
     In this example embodiment, the hash of the application data is a Merkle root and comprises all actions used to make the block and the last state resulting from the application performing all of those actions in order. In a different example embodiment, the block may store each state that results from performing each of the actions, or a subset of those states. For each block being transmitted, the hash of that block and of the header of a block immediately below that block, the hash of that block&#39;s application data, and the hash of the digital signatures collectively represent one example of lineage verification data that the consumer chain  102   b  may use to verify the lineage of that block back to the genesis block of the chain. 
     In this example embodiment, the merkleProof field is one example of validity verification data, which permits the consumer chain  102   b  to verify validity of the application data it receives from the provider chain  102   a . While Merkle trees are used in this example, Merkle trees are only one example form of cryptographic proof. Other possible ways exist. The proof mechanism allows a single root hash, and a series of other hashes used in some structure, to allow verification of a piece of data by relating it back to the root hash without disclosing any of the other data that was not intended to be shared. Other data structures that may be used, for example, comprise Patricia Trees, Radix Trees, and chunked concatenations. 
     The consumer chain  102   b  subsequently verifies the authenticity of the data it receives at operation  516 . More specifically, it verifies the transmitted block&#39;s lineage using the lineage verification data, the validity of the proper subset of state data it received using the validity verification data, and adds a new block to the consumer chain  102   b . More specifically, the consumer chain  102   b  verifies the provider chain&#39;s  102   a  digital signature; verifies each transmitted block&#39;s lineage using the hashed header information; checks the validity of the transmitted state data using the data&#39;s Merkle tree; verifies the type of consensus method used, which may be changed using the configChange field as described above; verifies that a sufficient number of nodes  104  have contributed to the consensus of the block by checking the signatures of the nodes that voted in favor of consensus; and verifies the cryptographic validity of the block in accordance with the cryptographic method used by the chain  102   a.    
     The consumer chain  102   b  then updates the mounted directory where it stores state information (/mnt/foo), which itself comprises the consumer chain  102   b  adding a new block to itself with the non-header data of that new block comprising the data received from the provider chain  102   a  (i.e., the lineage verification data, proper subset of state data, and validity verification data). 
     In summary, the read join permits a user of the consumer chain  102   b  to read a slice of state data stored on the provider chain  102   a  as though that data were mounted locally on the consumer chain  102   b.    
     Referring now to  FIG. 6 , there is depicted a block diagram  600  showing how two blockchains perform a write join, according to the system  100  of  FIG. 1 . As with  FIGS. 5A and 5B , while the first and second blockchains  102   a,b  are used in the example of  FIG. 6 , a write join may be performed between any two blockchains  102  regardless of whether they have overlapping nodes  104  and regardless of whether any nodes are virtualizing chains using the hypervisor  800 . In  FIG. 6 , the first blockchain  102   a  writes data to the second blockchain  102   b ; the first blockchain  102   a  is accordingly interchangeably referred to as the “sender chain”  102   a  and the second blockchain  102   b  is accordingly interchangeably referred to as the “receiver chain”  102   b.    
     The sender chain  102   a  comprises a dispatch module  820   a , which dispatches actions to a reducer  602   a . As discussed in further detail below in respect of  FIGS. 7A to 7C , the reducer  602   a  delegates performance of certain actions to a join manager  604   b , which controls which actions are queued in a pending actions queue  606   a  for transmission to the receiver chain  102   b . The actions are sent to the receiver chain  102   b  via a read join. The sender chain  102   a  also comprises an action status queue  608   a  that reads, via a read join, a list of which actions have been completed by the receiver chain  102   b.    
     The receiver chain  102   b  analogously comprises a pending actions queue  606   b  that receives the actions via the read join from the sender chain&#39;s  102   a  pending actions queue  606   a . The received actions are sent to a join manager  604   b , which forwards them to a dispatch module  820   b  and updates an action status queue  608   b  to indicate that the action is pending. The dispatch module  820   b  forwards those actions to a reducer  602   b , which performs them, thereby changing the receiver chain&#39;s  102   b  state data and performing a write operation. The join manager  604   b  also, after the reducer  602   b  performs the action, updates the action status queue  608   b  to indicate that the action has been completed. The statuses in the action status queue  608   b  are sent to the sender chain&#39;s  102   a  action status queue via a read join. The write join of  FIG. 6  accordingly is implemented using two read joins. 
       FIGS. 7A to 7C  depict a UML sequence diagram  700  showing how two blockchains  102   a,b  perform a write join, according to the block diagram  600  system of  FIG. 6 . The objects in the diagram are the sender and receiver chains  102   a,b , the sender chain&#39;s  102   b  join manager  604   a , and the receiver chain&#39;s  102   b  join manager  604   b . While the join managers  604   a,b  are shown as being objects distinct from the chains  102   a,b , this is done for convenience only and the managers  604   a,b  comprise part of the application logic performed by the chains  102   a,b.    
     At operation  702 , the receiver chain&#39;s  102   b  join manager  604   b  performs an action (“@@CHAIN_AUTHORIZE_ACTIONS”) having a payload comprising a cryptographically secure chain identifier identifying the sender chain  102   a  (“sender: &lt;senderChainID&gt;”) and enumerating the actions that the sender chain  102   a  is permitted to have the receiver chain  102   b  perform (“permittedActions: [‘CREATE_FOO’; ‘CREATE_BAR’]”). The cryptographically secure chain identifier is generated in a manner analogous to the chain identifiers for  FIG. 5A . Following this, the receiver chain&#39;s  102   b  pending actions queue  606   b  is able to read actions from the sender chain&#39;s  102   a  pending actions queue  606   a , and the sender chain&#39;s  102   a  action status queue  608   a  is able to read the status of actions from the receiver chain&#39;s  102   b  action status queue  608   b . After the queues  606   a,b  and  608   a,b  are able to communicate, the write join is setup. In the depicted embodiment, the sender chain  102   a  is by default authorized to perform certain actions received from the receiver chain  102   b , so authorization is not explicitly shown in  FIGS. 7A to 7C . 
     For each action the sender chain  102   a  wishes to send to the receiver chain  102 , the sender chain  102   a  performs operations  704  and  706 . For each action, the sender chain  102   a  creates an action of one of the permitted enumerated types (“type: ‘CREATE_FOO’”). The action created by the reducer  602   a  may or may not be identical to the action that was dispatched to it. The reducer  602   a  then delegates the action at operation  704  to the join manager  604   a , following which the join manager  604   a  generates an identifier for that action and places it in the pending actions queue  606   a  at operation  706 . That action is transmitted, via a read join, from the sender chain&#39;s  102   a  pending actions queue  606   a  to the receiver chain&#39;s  102   b  pending actions queue  606   b  at operation  708 . 
     In order to make efficient use of the overhead accompanying each read join, such as that required for cryptographic checks and consensus, multiple actions may be queued in the sender chain&#39;s  102   a  pending actions queue  606   a  and transmitted via a single read join. 
     For each action that the receiver chain  102   b  receives, it performs operations  710 ,  711 ,  712 ,  714 , and  716 . At operation  710 , the receiver chain&#39;s  102   b  join manager  604   b  removes the pending action from the pending actions queue  606   b , dispatches the action to the reducer  602   b  at operation  711 , and updates the action status queue  608   b  to indicate that the action is in process. The reducer  602   b  performs the action, informs the join manager  604   b  at operation  714 , and the join manager  604   b  updates the action status queue  608   b  to indicate that the action is completed at operation  716 . 
     At operation  717 , the sender chain&#39;s  102   a  action status queue  608   a  is updated to correspond to the receiver chain&#39;s  102   b  action status queue  608   b  via a read join. 
     For each updated action status, the sender chain  102   a  performs operations  718 ,  720 , and  722 . At operation  718 , the join manager  604   a  compares the action&#39;s status in the action status queue  608   a  to the action&#39;s previous status. At operation  720  it updates the dispatch that originally dispatched the action to the reducer  602   a , returning to the user any information that is to be returned following completion of the action (e.g., a notification to the user indicating that the action has been completed). The join manager  604   a  then removes the completed action from the pending actions queue  606   a  at operation  722 . 
     At operation  724 , the pending action queues  606   a,b  of the chains  102   a,b  are synchronized using a read join, following which the receiver chain&#39;s  102   b  join manager  604   b  removes the action from the pending action queue  606   b  (operation  726 ). After the action is removed, the action status queues  608   a,b  are synchronized using a read join at operation  728 . 
     The sender chain  102   a  receives actions from the receiver chain  102   b  via read joins that the action is pending at the receiver chain  102   b  (operation  717 ) and that the action has been performed by the receiver chain  102   b  (operation  728 ). For each read join, the sender chain  102   a  also receives lineage verification data and validity verification data analogous to that described above for  FIGS. 5A and 5B . 
     The diagrams  500 , 700  of  FIGS. 5A-7C  depict actions being transmitted between chains  102 . Although not expressly illustrated in those figures, each action is sent in a block for which the first chain  102  has reached consensus, so that a second chain  102 , which receives the action, can verify that the action in fact comes from the first chain and has not been tampered with. 
     The embodiments have been described above with reference to flow, sequence, and block diagrams of methods, apparatuses, systems, and computer program products. In this regard, the depicted flow, sequence, and block diagrams illustrate the architecture, functionality, and operation of implementations of various embodiments. For instance, each block of the flow and block diagrams and operation in the sequence diagrams may represent a module, segment, or portion of code, which comprises one or more executable instructions for implementing the specified action(s). In some alternative embodiments, the action(s) noted in that block or operation may occur out of the order noted in those figures. For example, two blocks or operations shown in succession may, in some embodiments, be executed substantially concurrently, or the blocks or operations may sometimes be executed in the reverse order, depending upon the functionality involved. Some specific examples of the foregoing have been noted above but those noted examples are not necessarily the only examples. Each block of the flow and block diagrams and operation of the sequence diagrams, and combinations of those blocks and operations, may be implemented by special purpose hardware-based systems that perform the specified functions or acts, or combinations of special purpose hardware and computer instructions. 
     The terminology used herein is for the purpose of describing particular embodiments only and is not intended to be limiting. Accordingly, as used herein, the singular forms “a”, “an”, and “the” are intended to include the plural forms as well, unless the context clearly indicates otherwise. It will be further understood that the terms “comprises” and “comprising”, when used in this specification, specify the presence of one or more stated features, integers, steps, operations, elements, and components, but do not preclude the presence or addition of one or more other features, integers, steps, operations, elements, components, and groups. Directional terms such as “top”, “bottom”, “upwards”, “downwards”, “vertically”, and “laterally” are used in the following description for the purpose of providing relative reference only, and are not intended to suggest any limitations on how any article is to be positioned during use, or to be mounted in an assembly or relative to an environment. Additionally, the term “couple” and variants of it such as “coupled”, “couples”, and “coupling” as used in this description are intended to include indirect and direct connections unless otherwise indicated. For example, if a first device is coupled to a second device, that coupling may be through a direct connection or through an indirect connection via other devices and connections. Similarly, if the first device is communicatively coupled to the second device, communication may be through a direct connection or through an indirect connection via other devices and connections. 
     It is contemplated that any part of any aspect or embodiment discussed in this specification can be implemented or combined with any part of any other aspect or embodiment discussed in this specification. 
     In construing the claims, it is to be understood that the use of computer equipment, such as a processor, to implement the embodiments described herein is essential at least where the presence or use of that computer equipment is positively recited in the claims. It is also to be understood that implementing a blockchain inherently requires computer equipment, such as a processor for creating and authenticating new blocks, storage for storing the blockchain, and a network interface for allowing communication between nodes, which is required for consensus. 
     One or more example embodiments have been described by way of illustration only. This description is been presented for purposes of illustration and description, but is not intended to be exhaustive or limited to the form disclosed. It will be apparent to persons skilled in the art that a number of variations and modifications can be made without departing from the scope of the claims.