This application relates generally to managing a distributed system of record across a set of computing resources in a distributed network.
Distributed computer systems are well-known in the prior art. One such distributed computer system is a “content delivery network” (CDN) or “overlay network” that is operated and managed by a service provider. The service provider typically provides the content delivery service on behalf of third parties (customers) who use the service provider's shared infrastructure. A distributed system of this type typically refers to a collection of autonomous computers linked by a network or networks, together with the software, systems, protocols and techniques designed to facilitate various services, such as content delivery, web application acceleration, or other support of outsourced origin site infrastructure. A CDN service provider typically provides service delivery through digital properties (such as a website), which are provisioned in a customer portal and then deployed to the network.
A blockchain is a continuously growing list of records, called blocks, which are linked and secured using cryptography. Each block typically contains a cryptographic hash linking it to a previous block, and transaction data. For use as a distributed ledger, a blockchain typically is managed by a peer-to-peer network collectively adhering to a protocol for validating new blocks. Once recorded, the data in any given block cannot be altered retroactively without the alteration of all subsequent blocks, which requires collusion of the network majority. Blockchains are suitable for the recording of events, various records management activities (such as identity management, transaction processing, documenting provenance, etc.) and others. Generalizing, a blockchain is a decentralized, distributed and digital ledger that is used to record transactions across many computers so that the record cannot be altered retroactively without the alteration of all subsequent blocks and the collusion of the network. In a typical blockchain, blocks hold batches of valid transactions that are hashed and encoded into a data structure. In this structure, and as noted above, each block includes the cryptographic hash linking it to the prior block in the blockchain. The linked blocks form a chain. This iterative process confirms the integrity of the previous block, all the way back to the original genesis (or first) block.
Blockchain implementations may be used to support a variety of application areas, some of which have elevated security requirements. In known systems, such as Bitcoin, Etherium and their derivatives, a main focus is on securing the private keys that are used by wallets (namely, to spend value associated with the wallet). In addition, wallet security continues to be an important consideration in the design and implementation of such systems, and there are also a set of extended use cases, e.g., hosted or server-based wallets, server based co-signing or multiple signature-based transactions, and administrative management of accounts and associated value, that present additional security challenges. In particular, these capabilities offer significant benefits, but they may also increase the attack surface, i.e., the number of and paths of potential compromise.
This disclosure leverages the use of a high performance distributed ledger and transaction computing network fabric over which large numbers of transactions (involving the transformation, conversion or transfer of information or value) are processed concurrently in a scalable, reliable, secure and efficient manner. In one embodiment, the computing network fabric or “core” is configured to support a distributed blockchain network that organizes data of the blockchain in a manner that allows communication, processing and storage of blocks of the chain to be performed concurrently, with little synchronization, at very high performance and low latency, even when the transactions themselves originate from remote sources. This data organization relies on segmenting a transaction space within autonomous but cooperating computing nodes that are configured as a processing mesh. Each computing node typically is functionally-equivalent to all other nodes in the core, and preferably each node can carry the entire load of the system. A computing node typically comprises a cluster of computing, communications and storage elements. More generally, all computing nodes that comprise the core network preferably are considered to be equal to one another, and no individual node, standing alone, is deemed to be trustworthy. Further, with respect to one another, the nodes operate autonomously, and preferably no node can control another node. The nodes operate on blocks independently from one another while still maintaining a consistent and logically complete view of the blockchain as a whole.
According to this disclosure, a distributed system of record architecture of the type described above is divided into ledger services that creates and maintains the system of record supporting a set of blockchain based transaction capabilities, and wallet services that implements business logic and policy using those capabilities. Wallet Services is one embodiment is implemented as a server side wallet abstraction. In one embodiment, Wallet Services performs functions related to implementing a set of business logics and policies, in this case supporting financial use cases, using the native transactional capabilities supported by the ledger services. Unlike ledger services, which typically is envisioned as a fully replicated structure ruled by consensus, Wallet Services is structured to perform more complex and expensive processing while relying on ledger services for consensus over enforced policy. Briefly stated, the approach herein addresses the problem in Wallet Services of achieving prescribed levels of resilience to component and subsystem failures. The design scales linearly in cost to accommodate greater or lesser degrees of resilience, e.g., as dictated by business considerations.
According to a particular aspect, multiple active wallet replicas are used to enable the system (i) to rely on collision detection and blockchain idempotency to produce a single correct outcome, and (2) to rely on various collision avoidance techniques to drive the cost of nominal handling to near the cost of non-redundant handling with acceptable additional messaging overhead. Using a ledger services idempotency feature (namely, ITXO), multiple actors may form independent valid intents and know that no more than one intent will get finalized on the ledger. This ensures correct behavior does not depend on coordination between replicas. While the above approach provides significant advantages, it does increase the resources necessary to handle a given message throughput, To address this, the techniques herein add delays and utilize so-called “intent” messages. By adding the delays (e.g., on the order of milliseconds), decision logic is biased logic towards one intent. The intent messages are used to intercede before a wallet handles the same original upstream message and forms a different intent. Seeing the replica's intent, the wallet can adopt the same intent and proceed with downstream processing. For completeness, and after adopting intent, preferably a wallet also informs its replicas of its intent.
Blockchain-based wallet services are known, but they do not provide for executing transaction requests on a set of regionally-distributed wallet replicas for each wallet involved in the request such that if at least one replica of each wallet is operational the request will be successfully handled. Preferably, and according to this disclosure, the replicas run in an active-active mode where different replicas may form different (colliding) intents for the disposition of a transaction. Preferably, the replicas use an idempotency feature of ledger services transactions handling to detect and resolve such collisions, thereby ensuring at most one intent is successfully recorded on the ledger. To reduce the cost multiplier inherent in this arrangement, and as an optimization, the replicas insert delays and exchange intent messaging to avoid collisions in nominal circumstances.
The foregoing has outlined some of the more pertinent features of the subject matter. These features should be construed to be merely illustrative. Many other beneficial results can be attained by applying the disclosed subject matter in a different manner or by modifying the subject matter as will be described.
For a more complete understanding of the subject matter and the advantages thereof, reference is now made to the following descriptions taken in conjunction with the accompanying drawings, in which:
Overall High Level Design
The core 100c refers to elements associated with boundary 103. As will be described, preferably the core 100c is a high performance network of nodes that together support the processing and storage of transaction blockchain(s) meeting specified performance requirements including, but not limited to, throughput, response time, security and data integrity. A node (sometimes referred to as a “computing node”) in this context typically is a cluster of computing, communications, and storage elements. More generally, a cluster as used herein refers to one or more, and possibly many, computing, communications, and storage elements. In one embodiment, the core 100c comprises overlay network nodes, although this is not a requirement, as the core 100c may comprise a set of nodes distinct from the CDN and dedicated to the core operations (as will be described). Typically, computing nodes are interconnected by network transits and have a high degree of interconnectivity to reduce or eliminate topological bottlenecks.
To facilitate high performance, preferably the core network is constructed using a high quality, high capacity, and diverse interconnect. The particular configuration of the core network typically is implementation-dependent, at least in part based on the nature of the consensus protocol that is implemented in the blockchain. Depending on the consensus protocol used, the size of the core network (and/or the distribution of various computing nodes therein) may also be constrained as necessary to ensure sufficiently low latency network communications across the core.
In one non-limiting implementation, the CDN edge 100b supports a globally-based service having associated therewith a core network 100c (e.g., that is located across a plurality of networked data centers in a given geography).
Referring again to
Message 105 is an example of an edge element routing transactions (possibly including the one contained in message 104) to an appropriate element in a core node 110 (a set of which nodes 110 are depicted). For a given transaction there may be multiple messages 105 that route the same transaction or a hash (or other digest) of the same transaction to the appropriate element in other core nodes. It is not required that all messages 105 contain a full representation of a transaction. A digest of a transaction may be transmitted (1) to make core elements aware of the existence of a transaction, and (2) to provide a robust way to check the integrity of messages containing full transactions. This enables complete, yet efficient, propagation of incoming transaction messages to the appropriate elements in all core nodes. It also greatly reduces the network loading associated with traditional gossip protocols and yet provides protection, e.g., from compromised edge elements censoring or corrupting transactions.
Message 106 is an example of a core node element routing transactions to the appropriate element in another core node. There may be multiple messages 106, such that a core node element participates in propagating transactions or transaction digests across the core nodes of the system. Core nodes receiving message 106 may, in turn, generate other messages 106, further propagating the messages across the core nodes of the system.
Topology-Aware Data Propagation
While any data propagation protocol may be employed, one preferred approach herein is to improve upon cost and latency of traditional randomized peer-to-peer gossip protocols by shaping the propagation to the underlying network topology. In concert, messages 104, 105, and 106 comprise paths of propagation starting with topologically most proximate elements and reaching topologically less- or least-proximate elements. A device that sends messages 104 to other edge elements typically follows different paths of propagation across the network. This is illustrated by the messages 107, 108, and 109 propagating in a different direction. Further, the path of propagation starting from a given device, in general, may change over time to achieve proper load balancing and security.
Service Discovery and High Performance Mapping
Again referring to
An alternative embodiment utilizes location or direction-aware mapping. Thus, for example, a core node element may use domain names encoded with location or direction information (either geographic or topological direction) such that responses provide addresses to node elements that are in a desired location or direction or that comprise a directional graph. This capability may be intrinsic to the mapping system or an adjunct thereto. Topological mapping in this manner provides for a low latency, topology aware data propagation mechanism.
Generalizations
As used herein, a block generally refers to any aggregation or association of transaction data. There is no specific format required. A blockchain is a continuously growing list of records, called blocks, that are linked and secured using cryptography. Each block in a blockchain typically contains a cryptographic hash linking to the previous block, and transaction data. For use as a distributed ledger, a blockchain is typically managed by a peer-to-peer network collectively adhering to a protocol for inter-node communication and validating new blocks. Once recorded, the data in any given block cannot be altered retroactively without the alteration of all subsequent blocks, which requires collusion of the network majority.
While the techniques herein may use a blockchain to record transaction data, this is not a limitation, as the architecture and associated transport mechanism of this disclosure system is also applicable to other organizations of transaction data. Moreover, the notion of a blockchain, as in a chain or sequence of blocks, may be any organization of blocks including, without limitation, a block tree, a block graph, or the like.
Mining is the act of generating an ordered block of transactions with a header that references a previous block in the blockchain. In public (permissionless) blockchain consensus systems, mining generally is structured as a competition; if a generated block (and its ancestors) survive the mining competition and subsequent consensus process, it is considered finalized and part of the permanent record. In an ideal system, mining responsibility from one round to the next (i.e., from one block to the next) is randomly-dispersed across participants. Formally, in an ideal system, mining decisions are not predictable, not capable of being influenced, and are verifiable. In real world applications, however, the dispersion need not be perfectly random. For example, in proof-of-work systems, the dispersion is not actually random, as entities with more mining power have a higher probability of winning the competition.
Segmentation
Traditional blockchain implementations treat the blockchain as a simple sequence of blocks. Such approaches severely limit the achievable performance of blockchain implementations, typically by creating bottlenecks in processing, communicating and storing the blockchain in its aggregate form.
In contrast, the approach described here departs from known techniques by organizing the data of a single chain in a manner that allows its communication, processing and storage to be performed concurrently, with little synchronization, at very high performance. Preferably, and as will be seen, this data organization relies on segmenting the transaction space within each node while maintaining a consistent and logically complete view of the blockchain. This approach may also be applied to each of multiple chains that comprise a set of federated or sharded blockchains, and to improve the performance of the blockchain operation thereby reducing the work and increasing the performance of off-chain (so-called “Layer-2”) systems.
In this approach, the consensus algorithm that spans the network is used to ensure the system produces correct finalized results. The particular consensus algorithm(s) that may be used are not a limitation. Operations within each node, however, assume the elements of the node are correct and trustworthy. If a node fails or is corrupted by an adversary, the system relies on the rest of the network to maintain service integrity and availability as well as to support failure and intrusion detection functions. As will be seen, this design architecture enables the internals of a node to be organized as a loosely-coupled distributed system running on a high performance, low latency communications fabric such that system elements are aligned with the blockchain data organization. The resulting architecture provides a much higher performance implementation as compared to known techniques.
Block Segmentation
Referring to
In this embodiment, block segmentation typically is an externally visible attribute shared by all nodes of the network. As will be seen, organizing the block data by segment significantly improves the performance and efficiency of nodes exchanging block information. In particular, the approach herein enables the components of a node responsible for handling a given segment to communicate directly with the components of other nodes responsible for handling the given segment. Moreover, the mapping of segments to components may differ across nodes, thereby allowing for scaled-up (or scaled-down) deployments, e.g., by allowing nodes to employ a different number of resources in handling the overall amount of transaction data.
In an alternative embodiment, the details of the segmentation may remain strictly a node internal attribute. In such an embodiment, the mapping of segments to the components of a node may be arbitrary. This alternative allows greater independence in the configuration of nodes, but it generally requires more granular (e.g., transaction-by-transaction) exchange of data between nodes involving some form of transaction layer routing inside the nodes.
As used herein, the term segmentation is used to mean any grouping, partitioning, sharding, etc. of transaction data, whether implicit or explicit, such that the elements of one node may interact with elements in another node to exchange data for more than one transaction at a time.
A header 204 includes several required elements, namely, a hash 210 of the previous block header, a Merkle root 208 of the block's contents, and a proof 206 indicating that a miner of the block in fact was a legitimate miner. Other information may be included.
Blockchain Segmentation
Referring to
Referring to
Segmentation and Inter-Node Communication
Referring to
As will be described, in a preferred embodiment the computing nodes of the system are each capable of performing (and often do perform) multiple distinct functions or modes (operating roles) such as transaction validation, as well as block mining and verification. Indeed, a given computing node often operates in multiple such modes at the same time. In a typical operating scenario, particular nodes may be used for mining, although typically all computing nodes verify what is mined.
Once a mined segment is finished, message 504 is sent from the element responsible for that segment to the element responsible for the block header. The message includes, among other things, the Merkle root of the generated segment. Once all messages 504 are sent and received, the element responsible for the block header creates the top of the block Merkle tree and saves the Merkle root in the header. It then transmits messages 505 to the elements in the other nodes responsible for handling header generation and verification. In performing validation, and upon receiving messages 503 for a segment, the receiving node element handling the segment validates the received transactions, computes the segment's Merkle tree, and upon completion sends message 506 to the element in the node handling the header. That element reconstructs the block header from the messages 506 for all segments and compares it to the header received from the mining node in message 505. If the headers match, the block is accepted and added to the set of pre-finalized blocks in that node.
In one embodiment, if the transactions fail to verify or the reconstructed header does not match the header transmitted from the mining node, the block is rejected, and all changes are reverted and expunged from the node.
In another embodiment, validating nodes can flag machines that mine to a different value of message 506 for the same segment, thereby safeguarding the system from one or more faulty or malicious machines.
The above-described processing is described in more detail below.
Segmentation and Node Orchestration
As depicted in
By way of background, and as noted above, preferably each node is functionally-equivalent to all other nodes in the system, and each node carries the entire load of the system. More generally, all nodes in the system are considered to be equal to one another and no individual node, standing alone, is deemed trustworthy. Further, with respect to one another, the nodes operate autonomously, and no node can control another node.
A node operates in general as follows. For transaction validation, and with reference to
To this end, upon receipt (i.e. ingress of a raw transaction to the node), the transaction handler 609 typically carries out two basic actions. As depicted in
Once all inputs are verified in this manner, the raw transaction is then placed in the transaction handler's mem pool. The raw transaction (that has now been validated) is then output (i.e. propagated) to all other nodes via 613, and each other node that receives the raw transaction carries out a similar set of operations as has been just described. This completes the local validate operation for the raw transaction, which as a consequence is now in the transaction handler's mem pool. The above-described process continues as raw transactions are received at the node (once again, either from edge machines or from other nodes).
Thus, a transaction handler that receives a raw transaction determines (from querying the UTXO handler) whether inputs to the transaction exists and, if so, what are their values and locking scripts (containing public keys sometimes referred to as addresses or wallet addresses). It checks each input's unlocking script (digital signature), and if all signatures are valid, the transaction handler commits (saves) the raw transaction to its associated memory pool. In this manner, validated raw transactions accumulate in each handler's mem pool. Thus, in each transaction handler's mem pool there are a collection of transactions in effect “waiting” to be mined (i.e., assigned) to a block segment (and thus a block) in the blockchain. Preferably, the system enforces a minimum wait time to allow the new transactions to propagate and be validated by the other nodes of the system.
Assume now that the node coordinator 601 determines it is time to mine a block into the blockchain. The notion of mining a block is distinct from the notion of actually adding the block to the blockchain, which happens (as will be described in more detail below) when the node coordinator decides a block is final according to a prescribed consensus algorithm of the system. Typically, at any given time there is a subset of the nodes that act as “miners.” According to the techniques herein, and as has been described, in lieu of mining a block as a composite, a block is mined in “segments,” i.e., individual segments of the block are mined separately (albeit concurrently or in parallel) and, in particular, by the segment handlers 604.
To this end, and with reference now to
As will be described, preferably the actual persistence of each segment in the block (and the persistence of the block in the blockchain itself) does not occur until the segment handlers are instructed by the node coordinator to finalize a block. Typically, there is a 1:1 relationship between a segment handler 604 and a transaction handler 609, although this is not a limitation. As noted above, these functions may be combined in an implementation and while a 1:1 relationship is depicted, a node could be configured with any number of either type of handler.
Upon receipt of the command to initiate mining, at 610 the segment handler 604 requests the transaction handlers (handling segments for the segment handler) to assign transactions in their respective mem pools to the block and return each raw transaction (or a hash thereof). Before the transaction handler returns a raw transaction from its mem pool to the requesting segment handler, however, the transaction handler must first “spend” the transaction inputs with respect to the block being mined (i.e., apply the actual transaction values to the inputs), which it does by sending spend requests (via 620) to the UTXO handlers; as depicted, the UTXO handlers apply the spend requests, update their local data, and return the result (success or failure) to the transaction handler (via 621).
In the event of a failure response, the transaction handler must instruct the UTXO handlers via 620 to undo all successful spend operations for the transaction. This collision detection and rollback constitutes an optimistic concurrency control mechanism that obviates, and thus avoids the high costs of, acquiring a lock (or a distributed lock in the case of a node with multiple UTXO handlers) on the UTXO handler(s). This enables efficient high throughput, low latency handling of UTXO spend operations.
Upon successfully spending all the transaction inputs, the transaction handler instructs a UTXO handler via 620 to assign the transaction outputs (the transaction's UTXOs) to the block, and it forwards via 611 the raw transaction (and/or a digest thereof) back to the requesting segment handler.
The segment handler-transaction handler interactions here as just described are carried on as the transaction handler(s) continue to receive and process the raw transactions as depicted in
Once a segment handler 604 determines that a segment is valid, it returns the result of its processing, namely, the root of a Merkle tree computed for the segment, to the node coordinator via 606. During mining the node coordinator trusts that the segments are valid. The other segment handlers 604 (operating concurrently) function similarly and return their mining results indicating that their segments likewise complete.
Once all of the segment handlers respond to the node coordinator (with the Merkle roots of all segments), the node coordinator then computes an overall block Merkle tree (from all the segment Merkle roots) and generates a block header incorporating the overall block Merkle root and other information. The node coordinator then transmits/propagates a Mining Done message via 602 containing the block header to the other node coordinators in the network, and those other node coordinators then use the block Merkle root to complete their block verification process as will be described next.
In particular, assume now that the node coordinator 601 receives a Mining Start message via 603 transmitted from the node coordinator of another node initiating its own block mining operation. This begins a block verification process for block data mined and transmitted from the other node. The block verification process is a variation on the block mining process, but the two are distinct and frequently a node will be engaged in both processes simultaneously. Indeed, while a node typically mines only one block at a time, it can be verifying multiple incoming blocks simultaneously. As with mining, according to the techniques herein, and as has been described, in lieu of verifying a block as a composite, preferably a block is verified in “segments,” i.e., individual segments of the block are verified separately (albeit concurrently or in parallel) and, in particular, by the segment handlers 604.
To this end, via 605 the node coordinator 601 instructs its associated segment handlers 604 to receive transaction hashes at 608 from other nodes and, in response, to verify the associated transaction block assignments made by the mining node's segment handlers as they mine/assign transactions to a block in the mining process. Preferably, verification of segment data is performed progressively (as the data is received) and concurrently with the mining/assignment of additional transactions to the block segments in the mining node.
Upon receipt of a transaction hash, via 608, a segment handler 604 forwards the transaction hash via 610 to the transaction handler 609 responsible for handling transactions for the segment. Upon receiving a transaction hash from a segment handler, the transaction handler 609 looks up the associated transaction record in its mem pool.
In the event the transaction is missing from the mem pool, transaction handler 609 sends a request (via 622) to receive the missing raw transaction (via 623), preferably from the transaction handler in the mining node responsible for having mined the transaction. This request/response action preferably is handled at high priority in an expedited manner Upon receiving the missing raw transaction, and prior to resuming verification of the transaction's block assignment, the transaction handler 609 must validate the transaction as described above before adding it to its mem pool.
Upon successfully retrieving the transaction from its mem pool, the transaction handler performs an assignment of the transaction to the block segment being verified just as it assigns transactions to blocks being locally mined as described above; if, however, the assignment fails, verification of the segment and the block of which it is a part fails (i.e., the block is rejected).
Subsequently, the node coordinator, applying a prescribed consensus algorithm, decides to finalize a block. To this end, the node coordinator persists the block header, and it instructs the node's segment handlers to finalize the block. In so doing, the node coordinator provides the overall block Merkle tree to each segment handler. Each segment handler, in turn, persists its set of segments associated with the block, and it instructs its associated transaction handlers to finalize the block. In so doing, the segment handlers generate and provide to the transaction handlers the portion of the block's overall Merkle tree each transaction handler needs for its set of segments. Each transaction handler, in turn, removes the finalized transactions from its active mem pool, and it responds to any outstanding transaction requests it received from the edge (or wallet) for finalized transactions and, in particular, with a Merkle proof derived from the portion of the block's overall Merkle tree the transaction handler received from the segment handlers. The transaction handler then saves the finalized transaction in memory, where it may be used to support subsequent queries that the transaction handler may receive concerning the disposition of a transaction. The transaction handlers then instruct all UTXO handlers to finalize the block. In response, the UTXO handlers mark UTXOs spent in the finalized block as permanently spent, and mark UTXOs assigned to the finalized block as permanently created. Persisting the block header and segments to disk in this manner thus adds the block to the blockchain. Depending on implementation, the block so written to the blockchain may then be considered final (and thus in effect immutable).
Summarizing, in the node processing described above, transaction handlers receive raw transactions, typically from the edge machines. After a transaction handler validates the raw transaction (and places it in its local mem pool), the transaction handler propagates the raw transaction to the appropriate transaction handlers in other nodes that are also responsible for validating that raw transaction. Subsequently, and in response to a determination by the node coordinator to begin mining a block segment, the transaction handler mines (assigns) a set of raw transactions from its mem pool to the block segment, and sends those raw transactions (and their associated digests) to the requesting segment handler that is handling the respective segment. The segment handler sequences the received transactions into the segment and, as it does so, the segment handler forwards the list of digests for the transactions comprising the segment to the other segment handlers responsible for handling those segments in the other miner nodes. Thus, raw transactions propagate across the transaction handlers in all nodes, but segment handlers preferably only send the transaction digests for the segments to be verified. During block segment mining and verification, transaction handers consult their local segment handler(s), which as noted communicate with the segment handlers of other nodes. Transaction handlers in different nodes thus communicate with one another to populate their respective mem pools with transactions that have been validated (using the UTXO and signature-verifiers). The segment handlers (and thus the node coordinator handling the mining) communicate with one another to populate the blockchain with a block comprising the segments. As previously noted, the transaction handlers and segment handlers need not be separate services.
As described above, block verification is similar to block mining, except that for verification the segment handler is feeding transaction hashes to its transactions handlers, which transaction handlers then respond with “valid” (with respect to the raw transaction) or “invalid” (with respect to the entire received block), and the latter response should not happen unless the miner is behaving erroneously or in an adversarial manner. The above-described technique of generating and handling of Merkle trees and roots is the preferred cryptographic mechanism that ties transactions to their block. In verification, and upon completion when the node coordinator gets results from all the segment handlers, the coordinator once again computes the overall block Merkle root, but this time it compares that root with the root provided in the block header sent to it by the mining block coordinator. If they do not match, the block is discarded as invalid.
The terminology used herein is not intended to be limiting. As used herein, the term “validate” is used for the operation that the transaction handler does when it receives a raw transaction to be put in its mem pool. As noted above, to validate a transaction, the transaction handler queries the UTXO handler(s) to check the availability of the referenced UTXOs and talks to the signature-verifier to check signatures (on the inputs). In contrast, the term “verify” is used for the act of verifying the contents of block segments received from other nodes that are likewise performing the consensus initiated by the node coordinator. A transaction validation may also be deemed an “initial transaction verification” as contrasted with the “block segment verification” (what the coordinator and segment handlers do with block segment data received from other nodes) in response to the coordinator initiating a mining operation on the block (comprising the block segments). Also, the term “mine” is sometimes referred to as “assign,” meaning what a transaction handler does when it is told by the segment handler to assign or associate a transaction with a block segment, i.e., the transaction handler's verification of the transaction with respect to its inclusion in a block segment by the segment handler. As noted above, to accomplish this, the transaction handler communicates with its UTXO handler to “spend” existing UXTOs, and to “assign” new UTXOs to a block segment.
Also, the notion of a “handler” is not intended to be limited. A handler is sometimes referred to herein as a “coordinator,” and the basic operations or functions of a handler may be implemented as a process, a program, an instance, an execution thread, a set of program instructions, or otherwise.
While the above describes a preferred operation, there is no requirement that a handler handle its tasks on a singular basis. Thus, a segment handler can handle some or all of the segments comprising a block. A transaction handler can handle the transactions belonging to a particular, or to more than one (or even all) segments. A UTXO handler may handle some or all partitions in the UTXO space. The term “partition” here is used for convenience to distinguish from a segment, but neither term should be deemed limiting.
The following provides additional details regarding the above-described node components in a preferred implementation.
Node Coordination
Node coordinator 601 participates in a network consensus algorithm to decide whether the node should mine a block or not, and from what other nodes it should expect to receive mined block data. If the node is to mine a block, node coordinator 601 sends messages (via 602) to the other node coordinators in the network. Node coordinator 601 also receives messages (via 603) from other node coordinators in nodes that are mining a block. As has been described, node coordinator 601 informs the node's segment handler 604 in messages (via 605) to start mining block segments and from what other nodes to receive and validate mined block segments. The node's segment handler 604 will return to the node coordinator 601 in a message (via 606) the Merkle root of the transactions comprising each block segment.
Another aspect of node coordination is managing node local representations corresponding to the one or more chain branches that may be active in the network at any given time. Typically, a blockchain consists of a single sequence of blocks up to the point of finalization. Finalization often is set to be some number of blocks deep in the chain, but the decision of what and when to finalize is subject to the rules governing consensus across the network. The part of the blockchain that is pre-finalized consists of potentially multiple branch chains that get resolved before finalization. As indicated above, for example, when multiple nodes mine simultaneously, they fork the blockchain into multiple branches that have some common ancestor block. The node coordinator 601 is responsible for tracking active branches and informing the segment handlers 604 which branch they are mining, if the node is mining, and which branch each remote miner is mining.
Segment Handling
As also described, segment handlers 604 handle the generation and/or validation of some number of block segments representing a portion of block segmentation space. Specifically, the segment handlers begin generating block segments as directed by the node coordinator 601 in messages (via 605). When mining, a segment handler 604 transmits mined block segment data via 607 to segment handlers in the other nodes to be verified. A segment handler 604 receives block segment data in messages (via 608) from segment handlers in mining nodes. To perform transaction mining and validation, a segment handler 604 interacts with an associated set of transaction handlers 609 as also previously described.
Transaction Handling
Transaction handlers 609 handle the validation of transactions to be added to the mem pool and propagated to the network, the generation of transactions to be included in a mined block, and the verification of transactions to be included as part of a block received from a mining node. As noted above, the distribution of the transaction segmentation space may be the same for a transaction handler 609 and a segment handler 604, or it may be different. For example, the computational resources needed by the segment handler function may be sufficiently low that only a few such handlers are used to handle all the block segments, whereas the computational resources required by the transaction handler function might be sufficiently high so as to require that each such handler manage the transactions for a smaller number of segments than their associated segment handler 604.
The transaction handler function plays another important role in the system as also previously described, namely, transaction admissions (also referred to as “validation”) and propagation. A transaction handler 609 receives transactions in messages (via 612) from the edge either directly or indirectly via other transaction handlers in the network. The transaction handler 609 validates all received transactions and if valid, saves the transactions to a pool of unprocessed transactions (its mem pool) and optionally propagates the transactions to other nodes in the network in messages (via 613). In this way, the transaction handler function orchestrates the propagation of transaction data such that all nodes receive all incoming transactions and associated incoming transaction digests in a timely and efficient manner.
UTXO Handling
Preferably, UTXOs are identified by an identifier (txid), which is a hash or digest of the originating transaction, and the index of the output in the originating transaction. A UTXO also has two other pieces of information (not used in its identification), namely, a value, and a “locking script.” Generally, the locking script is a set of instructions or simply a public key associated with the output. Sometimes the public key is called an address or wallet address. The locking script (e.g., the public key) is conveyed in the output of a transaction along with the value, and typically it is stored in a UTXO database along with the UTXO identifying information and its value. Thus, a query to the UTXO handler during initial transaction validation returns both the value and the locking script (public key). To spend a UTXO as an input to a new transaction, the new transaction (essentially its outputs), must be signed by the private key cryptographically matching the public key of the UTXO to be spent. This signature is provided with each transaction input and is generally called the “unlocking script.” The unlocking script can be a set of instructions or simply a digital signature. Thus, the digital signatures bind the output values of the transaction to the locking scripts (public keys) for which the receivers of the values presumably have the corresponding private key (later used to formulate an unlocking script). The signature verifier does not have the private key (as only the wallet or cryptographic element thereof has the private key). The signature verifier receives the public key (from the locking script) and a signature (from the unlocking script), and the signature verifier verifies the signature against the public key, thereby proving the signature was produced by the matching private key. To summarize, a transaction output at a given index has a locking script (public key) and value. A transaction input has the originating txid, index, and an unlocking script (signature).
To handle transactions, and as noted above, the transaction handler interacts with a set of UTXO handlers 614 with messages (via 615 and 620) to create, query, spend, and assign Unspent Transaction Outputs (UTXOs) associated with each transaction. Each UTXO operation may also be reversed using an undo request in messages (via 620). This reversibility is valuable because it allows for a transaction handler 609 to undo the parts of transactions that may have completed successfully when the transaction as a whole fails to complete. Instead of locking UTXO databases to allow concurrency and prevent conflicts, here the system preferably relies on detecting conflicts and reversing UTXO operations for partially complete transactions. Conflicts in this context include, but are not limited to, an attempt to spend a UTXO before it exists or is finalized (as policy may dictate), spending a UTXO that has already been spent by another transaction, or any other UTXO operation failure that renders the transaction incomplete.
As noted above, each UTXO has a value and an locking script that must be executed successfully for the transaction to validate. The script is a set of instructions that must be executed to lock the use of a UTXO as an input to another transaction. Commonly, the script contains public key material that corresponds to the private key that must be used to sign transactions that consume the UTXO as an input.
Because the number of UTXOs that accumulate can grow large, the UTXO space preferably is also partitioned by transaction identifier in a manner similar to how blocks are segmented by transaction identifier, although preferably the partitioning and segmentation spaces are divided according the needs of each independently. While UTXO handling could be performed by the transaction handlers that produce the UTXOs, preferably the handling of UTXOs is separated out from transaction handling for two reasons: (1) because the resource demands are different, and (2) because isolating the transaction handler function enables the transaction and UTXO handlers to perform more efficiently. Preferably, the UTXO space also is partitioned to make more efficient use of a node's aggregate memory and storage resources. By applying this segmentation (namely, through the transaction segmentation space), a highly scalable and timing-constrained solution is provided.
Signature Verification
The final element in the block diagram in
Pipelined Block Generation, Transmission, and Verification
Referring to
When attempting to build a system with high performance requirements, e.g., such as being capable of processing millions of real-time transactions per second, such current implementation approaches are entirely inadequate. For this reason, in the approach herein (and as described above), preferably these processing stages are pipelined for concurrency. Thus, according to the techniques herein, while a miner generates 704 block data, previously-generated block data is transmitted 705 to nodes for verification. The verifying nodes receive the mined block data and begin verifying 706 the block's transactions before receiving the complete block and likely long before the miner has finished mining the block.
It should be appreciated that in accordance with
Streaming Block Generation, Transmission, and Validation
Referring to
Generation
As shown in
Transmission
Segment handler 803 collects one or more transaction digests from the stream of messages 814 and sends the transaction digests in a stream of messages 815 to the segment handler 807 in each validating node 805 responsible for validating the generated segment data. As shown, the number of messages in the stream of messages 814 may differ from the number of messages in the stream of messages 815, though the total number of transaction digests transmitted in both streams typically will be the same.
In validating node 805, segment handler 807 receives a stream of messages 815, extracts the transaction digests, and sends one or more messages 816 to transaction handler 808. The number of messages comprising the streams of messages 815 and 816 may differ. In this embodiment, transmitted message 810, stream of messages 815 ending with message 833, and message 823, may be transmitted unicast or multicast, directly from node element to node element, indirectly propagated through elements in other nodes, or routed or forwarded through network elements. The data may travel aggregated or separated.
Verification
Verifying transaction handler 808 receives the transaction digests and lookups unprocessed transactions it has received from the edge (directly of via transaction coordinator in other nodes). If the lookup is successful, it verifies the transaction assignment. Upon successful verification, transaction handler 808 (1) sends verification acknowledgements in messages 818 to segment handler 807, and (2) adds the full transaction record 817 to block segment 832.
End of Stream Handling
In one embodiment, the streaming generation, transmission, and verification process ends when mining node coordinator 802 sends a stop generation message 819 to all mining segment handlers 803. In this scenario, nodes are assumed to be running asynchronously, and with no explicit time boundary between execution rounds. In another embodiment, nodes may run in a synchronous manner, and the process would end when a specific time is reached.
When the process ends, each segment handler 803 sends a stop generation message 820 to its associated transaction handler 804. Each transaction handler 804 finishes or aborts any transaction assignments that are still in progress and acknowledges that it has stopped mining along with any remaining assigned transactions included in the block segment in message 821 to segment handler 803.
Segment handler 803 sends any unsent transaction hashes and an end-of-stream indication in message 833 to validating node's segment handler 807. Each segment handler 803 computes a Merkle tree from the transaction hashes of each segment and sends the Merkle tree root (Merkle root or MR) to the node coordinator 802 in message 822. When the node coordinator 802 receives a Merkle root for all segments of the block, it computes the top of the Merkle tree for the overall block from the segment Merkle roots and generates a block header composed a hash of the previous block header, its mining proof, and the overall block Merkle root, and other data. On failure, node coordinator 802 send purge message 827 to each segment handler 803 which in turn sends a purge message 828 to its associated transaction handler(s) 804 that then discards the block segment. On success, node coordinator 802 sends the block header in messages 823 to all validating node coordinators 806.
When each verifying node's segment handlers 807 receives end-of-stream indications in messages 833, they in turn send to their associated transaction handlers 808 messages 834 indicating the end-of-stream verification. When each segment handler 807 has received acknowledgements for all outstanding transaction assignment verifications from its associated transaction coordinator 808, it computes the Merkle trees for its segments and sends the Merkle root for each segment in messages 824 to verifying node coordinator 806. When verifying node coordinator receives Merkle roots for each segment, it generates a block header, and verifies that the block header it generates matches the block header it received in message 823. If the block header does not match, it sends purge message 825 to each validating segment handler 807 which, in turn, sends purge message 826 to its associated transaction handler(s) 808 that then discards the block segment.
Finalizing a Block
As noted above, in the above-described system a block is not persisted until it is finalized. Preferably, the block is not finalized until the node coordinator concludes that is should be finalized based on having adhered to a prescribed consensus algorithm. In contrast, preferably at the conclusion of mining, a block is not persisted. Rather, after mining, a block is simply tracked until it is either finalized (per the consensus algorithm) or thrown away (purged), in the latter case because it did not survive the application of the consensus algorithm.
Thus, and as described, the approach herein leverages a high-quality, low-latency, highly-interconnected core network (the mesh) in conjunction with block segmentation and other above-described features (e.g., topology-aware data propagation, non-blocking architecture, optimistic concurrency control, partitioning, multicast and the other features) to provide a computationally-efficient transaction processing system, all without any central transaction routing or switching (e.g., a Layer 7 switch that needs to account for an route large numbers of transactions). Preferably, the architecture is used in conjunction with a global CDN network to provide global reach, and this approach advantageously enables CDN mapping technologies to be conveniently leveraged (e.g., by clients and other transaction services) to discover and interact with the computing elements in the core network.
By way of additional background, leader election and miner selection are activities performed at prescribed times. In a blockchain system, example scenarios include, but are not limited to, periodic intervals, system initialization, system or component error and failure recovery, and start/stop block generation events.
The distributed system of record described herein provides for a permissioned, highly-secure computing environment comprising a set of computing nodes. For mining, a mining proof is data presented by a computing node that mathematically proves the node is a legitimate miner of a block or portion thereof. The data preferably is recorded in a block header such that proper blockchain construction (namely, trust), is self-verifiable. According to this disclosure, mining proof is provided, preferably using some available source of trusted random numbers. In this approach, preferably a node uses a memory-encrypted trusted computing element to generate real random numbers to facilitate producing mining proofs that exhibit the properties desired.
The following is an additional glossary of terms used herein.
A blockchain is an append-only immutable chain of data blocks, wherein the presence of a transaction recorded within a block, and a block within the chain, are verifiable via cryptographic hashes. A block is a collection of transactions. It contains a cryptographic hash linking it to a previous block, forming a chain. Multiple blocks can be linked to a previous block, but only one finalized block can be linked to a previous block.
A merchant is an entity that executes a trade of goods or services for payment. A merchant has a bank account that is managed by an acquiring bank, and typically it maintains point-of-sale terminals (or other legacy infrastructure) responsible for generating valid payment requests. More generally, a point-of-sale terminal is a type of merchant connector (MCM) that generates payment requests.
A wallet is a collection of private-public key pairs and reference to unspent transaction outputs, which are “stored value,” and that are used to create transactions. A “wallet service” typically is a software entity that securely maintains a collection of wallets, proxies requests between external entities and a core network of computing nodes that support the blockchain, and that process the corresponding reesponses.
A wallet service may utilize a multiple wallet processor (WP) or equivalent processing function.
As described above, an Unspent Transaction Output (UTXO) is an output from a finalized transaction that contains some value and that is associated with an address. UXTOs can be passed as an input (spent) to a transaction that is created by a wallet holding the associated private key. A UXTO can only be spent once.
An acquirer is an institution where a bank account is held. An acquirer typically operates legacy infrastructure that is responsible for authorizing payment requests. This infrastructure is sometimes referred to connection module for an acquirer or an operator.
A administrative server is a service external to the payment network that provides one or more services, such as clearing, operator and merchant bank processes, regulatory compliance, and the like.
A ledger service (sometimes referred to as “ledger services”) is a distributed system that processes transactions and maintain a core ledger. The core ledger is the system of record maintained by the ledger service utilizing the blockchain technology described herein. The core ledger is a distributed system that processes transactions and creates the blockchain.
A payment network is a network that combines wallet services and the blockchain core ledger (ledger service). Wallet services receives client transactions, routes the transactions to a wallet processor (e.g., a WP), applies the necessary payment logic, and then forwards valid transactions to the ledger services. Ledger services, in turn, receives transactions from the wallet services, validates, processes, and records them onto the blockchain-based ledger. Processed transactions, consisting of the original legacy transaction and its corresponding blockchain transaction from ledger services, may be stored in a storage services for long-term persistence. The storage system may be used to respond to historical queries, and to provide backup for disaster recovery. A payment network may also include a data cooperation service to provide an interface to handle administrative traffic. Customer transactions enter the system via wallet services, while administrative requests (wallet updates, data center updates, historical queries, etc.) enter the system via the data cooperation service, which validates requests before forwarding them to the correct service. Preferably, the data cooperation service exposes a set of RESTful application programming interface (API) endpoints and, as a result, supports any client that can make a TLS mutually-authenticated REST-based HTTP request and send data represented by JSON.
Extended Transaction Capability
The above-described design focuses on the major functional units of the system and on how to organize and handle the data to meet high performance requirements. As described, one preferred design involves segmenting blocks of transactions and partitioning the Unspent Transaction Output (UTXO) data structures. As a variant, the UTXO concept is now generalized into a more general concept of Transaction Output (TXO) exhibiting a variety of behaviors supporting different use cases.
For example, a TXO may be used to produce data or attributes that are intended to be referenced by, but not consumed by, future transactions. Or, for example, a TXO may represent value that can be partially-consumed instead of wholly consumed by transactions. Or, as another example, an TXO may be used to transitively impart an inherent idempotency of a blockchain transaction to some external messaging regime. Generalizing, the resulting data organizations supports a wide variety of new capabilities while retaining the concurrent processing of the above-described basic design, thereby resulting in additional capabilities but still with equally high transaction throughput and low transaction processing times.
Formally, the following introduces a set of extensions to transactions and their associated TXOs and addresses. These extensions, as will be described below, support a variety of new transaction capabilities, e.g., that enable the enforcement of business logic associated with loyalty point programs and other generalized applications of a distributed system of record, while at the same time exhibiting the high performance characteristics previously described. These extensions are not limited in their application.
Indeed, there are a wide variety of applications that are enabled by or would benefit from a high performance distributed system of record. The challenge is that many such applications require the application of business logic in addition to or instead of simple value management. Accordingly, the following describes incorporating more complex transaction processing capabilities, thereby extending the benefits of the system to those applications while retaining the performance and scale the original design achieved. To ensure correct and trustworthy application of such logic, it is important that the logic and its applicable inputs and outputs be expressed on the ledger. To that end, the following describes the traditional concept of an Unspent Transaction Output (UTXO) and generalizes it to be Transaction Outputs (TXOs) that may be used to support rich expression of business logic while allowing controlled global changes to a set of TXOs, as well as the specification of timing and conversion information.
The following techniques are or may be implemented. First, the approach herein provides for the addition of attributes attached to TXOs that can be checked when TXOs are used as input to transactions. In general, the value of a TXO includes its attribute information. Second, the approach provides for the addition of attributes attached to blockchain addresses that can be checked when TXOs are processed. In this approach, transaction handler transaction processing recipes preferably are formulated to check the relationships among the attributes in the input and output TXOs and their respective addresses. Further, transactions that use TXOs may do so in a manner such that the value and attributes of the TXOs are used, but not consumed, in the processing of the transactions. That is, the TXO is referenced, but not spent. Further, and depending on implementation, transactions that use TXOs may do so in such a manner that the transaction may only succeed if the referenced TXO represents a sequence of state transitions of associated client entities. In another aspect, preferably transactions that use TXOs do so in a manner such that the value of the TXO can be mutated (e.g., only partially consumed) by transactions. Further, the approach provides for the ability to set, reset, change, or conditionally mutate the value of TXOs in the transition from one block to the next. This is also referred to as edge-triggered action. According to still other features, transaction processing may be deferred if a conflict is detected in the mutation of a TXO. Transactions that use TXOs preferably do so such that the transaction can only succeed if the TXO or an attribute of the TXO does not already exist. This capability may be used to create idempotency, collision resilience, and history for external messaging regimes. According to one embodiment, transactions that use TXOs may have a limited lifespan (e.g., valid-after, valid-before) expressed in terms of blockchain time. The disclosure herein also provides for extensions to transaction formats and semantics that incorporate the handling of different types of TXOs and the implementation of extended business logic (e.g., rules, limits, contract provisions, conversions, etc.) enabled by the new types of data associated with TXOs.
The following provides additional details regarding these properties and how they work together to allow complex interactions to be recorded on the blockchain while maintaining very high performance and scalability.
By way of background, transaction logic may be expressed on the chain in a variety of ways including, but not limited to, transaction types that cause specified transaction processing (however this processing is embodied), transaction rules expression (as described herein), and programmatic expression generally associated with smart contract execution. The value associated with a transaction input or output may be any data, structured or unstructured, in addition to or instead of a simple numeric. Transaction inputs include material used to unlock value including, but not limited to, a signature information with or without an associated public key, a set of attributes that may or may not include signature information, a set of instructions that may or may not include attribute information. Transaction outputs include material used to lock value including, but not limited to, a public key, a hash of a public key, an address identifier, attribute information that may or may not include public key or address information, and a set of instructions to execute in creating locked value that may or may not include attribute information.
The following section describes the notion of TXO types and attributes. One aspect provide for the ability to include attribute information with transaction outputs (TXOs). This attribute information may be encoded and used in a variety of ways. For compatibility reasons, and in one implementation, the attribute information may be thought of as an extension to a monetary value of a TXO, though there is no requirement for a TXO to have any monetary value or any attributes for that matter. TXO attributes may be used simply to store data by blockchain consensus. Wallet information, for example, can be stored this way instead of relying on lower performing, less reliable databases. Another use case for TXO attributes is to enhance and constrain transaction execution. Transaction execution may require certain attributes exist or require that they do not exist or that a particular attribute or set of attributes be consistent across all transaction inputs. For example, if business rules dictate that value in the system be differentiated by type, TXO attributes can be used to identify the value's type and ensure that different types of value are not mixed inappropriately.
In one embodiment, the TXO attribute approach herein includes the following aspects.
This list is not intended to be exhaustive. The transaction would contain this logic and the type would be specified.
Reference TXOs
TXOs may be used as Reference TXOs, which is now described. In particular, some business logic systems such as loyalty points and prepaid cards often require some notion of contract or external state. The nature of the contract or external state may well be shared across a number of TXOs in the system. Examples would include expiration times, “not before” times, and currency (or point) exchange rates, as well as merchant, product, and service restrictions. More generally, the rules and data governing transaction handling in such systems can be extremely diverse and complex.
An example is a set of loyalty points, represented by several different TXOs sharing a common expiration date. If these points are part of a program where the expiration date is reset every time there is activity in the account for the point program, there must be a mechanism to efficiently update the expiration dates for each affected TXO. In this case, and according to a further aspect of this disclosure, a Reference TXO (RTXO) is employed such that a group of TXOs are associated with a common RTXO. When the RTXO is updated, all of the associated parameters with the RTXO are effectively updated or inherited by the referencing TXOs at the same time. Another example involves exchange rates. For some use cases, it may be necessary to exchange one kind of currency for another, for example, converting points to Yen, or computing the number of points associated with a particular kind of transaction. Setting the exchange rate using a signed reference containing the current exchange rate allows a trackable, unforgeable, repeatable computation of the appropriate outputs.
Idempotency TXOs
Blockchain transactions execute only once and are naturally collision-resilient. To faciliate using the above-described blockchain technology in connection with message regimes that are not native to the blockchain (e.g., legacy ISO8583 based financial systems), support for either idempotent or collision resilient handling of external messages is generally required. The database technology required often makes it difficult and expensive to support these properties in a highly-scalable distributed manner, and maintaining consistency between the database and the blockchain is generally not possible in all cases.
To address this problem, and according to a further aspect, an Idempotency TXO (ITXO) is provided. The ITXO as described herein enables a blockchain-based ledger to be used as a high performance database for handling the external messaging. In one embodiment, a blockchain TXO output is defined with a key and value and optionally an expiry whereby the key is derived from, and uniquely identifies, the external message. In this case, the ITXO identity is then the same for all blockchain transactions that attempt to create it. If multiple blockchain transactions attempt to create the TXO, at most one will succeed while others fail because they attempt to create a TXO that already exists. Preferably, expiry is expressed in blockchain time and all correctly behaving blockchain nodes apply the expiry in exactly the same manner with respect to the block generation time when assigning transactions to the block in the blockchain. This ensures that the external construction of the blockchain transaction cannot result in honest nodes making different decisions about the validity of the transaction.
Generalizing, ITXOs enable services external to the blockchain to send multiple transactions that represent a single intent with the guarantee that only one transaction representing that intent will succeed. The alternative handling of the external messages can either all respond with the one handling that succeeded, thereby achieving idempotency, or all but one can be allowed to fail, thereby achieving collision resilience. In this way, and among other advantages, multiple unsynchronized or only loosely synchronized actors can safely and efficiently act to achieve active-active or multi-active redundancy.
Wallet Services Resiliency
As noted above, a wallet is a collection of private-public key pairs and reference to unspent transaction outputs, which are “stored value,” and that are used to create transactions. A “wallet service” typically is a software entity that securely maintains a collection of wallets, proxies requests between external entities and a core network of computing nodes that support the blockchain, and that process the corresponding responses. Wallet services receives client transactions, routes the transactions to a wallet processor (e.g., a WP), applies the necessary payment logic, and then forwards valid transactions to the ledger services. Ledger services, in turn, receives transactions from the wallet services, validates, processes, and records them onto the blockchain-based ledger.
According to a feature of this disclosure, improved wallet resiliency is enabled by configuring up to “n” replicas of a wallet such that a given transaction ends up being submitted to the ledger up to “n” times. In a default case, there is one replica for a given wallet, and thus the transaction is submitted to the ledger twice. In one example embodiment, a wallet and its replica are configured for active-active operation such that a particular transaction being handled by the primary wallet is also processed by the replica. In this way, and if the transaction cannot be processed by the primary wallet into the ledger (e.g., due a timeout), the transaction can still be processed by virtue of the replica wallet, and vice versa. The use of wallet replica(s) in this manner thus ensures that response timeouts (or other processing issues) do not prevent the transaction from being recorded.
According to a particular aspect, multiple active wallet replicas are used to enable the system (i) to rely on collision detection and blockchain idempotency to produce a single correct outcome, and (2) to rely on various collision avoidance techniques to drive the cost of nominal handling to near the cost of non-redundant handling with acceptable additional messaging overhead. Using a ledger services idempotency feature (namely, ITXO), multiple actors may form independent valid intents and know that no more than one intent will get finalized on the ledger. This ensures correct behavior does not depend on coordination between replicas.
As shown in
A representative wallet services implementation is based on the following design constructions:
Using Ledger for Wallet Services Canonical State
Preferably, the data necessary for the instantiation of any wallet services state is recorded on the ledger. On a practical level, any object that needs to retrieve state during instantiation would do so by retrieving that state, e.g., by performing an address query from the ledger. State data is recorded in the form of address attributes (static state) or attributes carried in UTXO(s) associated with the address (dynamic state). The latter option is more flexible and likely preferred in most cases. While the state in question could be for any wallet services object, even objects not visible to the external API, several API entities are referenced in the following design: merchant (MER) wallets, and PAN (primary account number) wallets. A merchant wallet is a data object that corresponds to a merchant's account, and a PAN is data object that typicaly corresponds to a customer's credit card account. A PAN typically is implemented as a given function (e.g., a salted hash) of the customer's 16 digit credit card account number.
In the approach herein, and via wallet services, a hash of the user's transaction is recorded into a transaction on the ledger (blockchain). Generally, wallet services is structured to perform complex and expensive processing while relying upon ledger services for consensus over enforced policy.
Object Instantiation
By the previous point, it follows that object instantiation can always be accomplished by retrieving object state from the ledger. This can be done as needed or preemptively. The former represents a required mode, the latter a potential optimization; thus, there will be cases where an object needed to handle a request flow is not yet (or is no longer) instantiated and such an object will need to be instantiated during the handling the flow. Typically, all cases devolve to this case.
Object Eventual Consistency
When the state of an object changes—when wallet attributes change, for example—instances of the object are made aware about the state change at different times. This gives rise to various race and failure conditions where object state may be inconsistent across instances at the time transaction requests are processed. As long as only one transaction handling intent can prevail, this is an acceptable condition over short timeframes. In some sense this has to be true because transaction handling is concurrent throughout the system and over any short period of time a set of received transactions can have no ordering dependencies—they can arrive at the edge in one order, arrive at wallet services in a completely different order, and so forth.
To give a concrete example: importing value to a PAN wallet may race with attempts to spend money from that wallet. Though not a common case for a PAN wallet, two (or more) transactions processed at around the time of the import could, in theory, be processed in different orders relative to the value import. Eventually, the coordinator of the import will inform all wallet instances of the import, but this will be skewed over time.
Types of Fault Tolerance
In one embodiment two levels of fault tolerance are supported: (1) the ability to successfully process in-flight transactions in the presence of a set of faults, and (2) the ability to successfully process newly arriving transactions in the presence of a set of faults. By supporting these two levels of fault tolerance, the system can be built with different cost/resilience profiles. In particular, the cost of the system can be tuned so that in-flight transactions survive relatively common component and region failures, while in the event of rare larger failures, the system immediately starts handling new transactions successfully even though in-flight transactions may be impacted.
Wallet Partitioning
Preferably, merchants and PAN wallets are partitioned, e.g., based upon their identifying information. One partitioning scheme preferably has the following characteristics. In particular, the partition mapping is stable over time and allows for scalability. A partition has some number of potential regional replicas that is a function of a Wallet Service (WS) failure resilience factor (f), therefore transitively creating that number of potential regional replicas of its associated wallets. So long as the number of WS region failures are less than or equal to f, there should be at least one region of processing elements available to process a message with respect to a given wallet. This does not mean, however, that a given message must survive any constellation of component failures less than or equal to f; message survival typically will depend on the actual replication and retry logic applied to the message (as described below for Types of Fault Tolerance). A region that supports a partition has the keying material necessary to create ledger transactions involving the wallets associated with a partition. A region that does not support a partition does not have the necessary keying material. A wallet replica may run in any region that supports the wallet's partition, but there will nominally be more regions that can support a partition than the number of replicas used to support any given message.
A request router decides (e.g., based on liveliness, load, and/or resilience criteria) what processing elements will be involved in processing any given message. The addressing and ordering of processing elements used to handle a given message constitute a routing map and be part of the processing context of that message. The processing elements chosen for a message with a given set of affected partitions may be different than the processing elements chosen for a different message with the same set of affected partitions. Given the previous characteristic, typically there will be no guaranteed or deterministic way to know after the fact which processing elements have instantiated wallet replicas other than to probe the processing elements. In one embodiment, mapping biases towards creating a statistical likelihood of reusing wallet replicas, but this is not required. Preferably, there is a means of notifying or invalidating all wallet replicas (that may be located on any processing element on which its partition is supported) when the wallet entity changes. To accomplish this, wallet attributes preferably are encoded as TXO attributes and used in two ways: (1) to generate an ETag associated with the wallet, and (2) to fail transactions that use a nonexistent TXO (presumably because wallet attributes have changed) so replicas can update their state.
For any given number of regions (a region being a unit of key distribution and often the unit of failure during maintenance and scorch events), preferably there is a number P of partitions that minimizes the maximum impact of a combination of failed regions above F. Given the stable mapping requirement and the fact that the number of regions will hopefully increase over time, there is no requirement to use P partitions.
With the above as background, the following provides details of a design of the wallet services.
Multi-Active Wallet Redundancy
Preferably, the following design is based on using multiple active wallet replicas (i) to rely on collision detection and blockchain idempotency to produce a single correct outcome, and (ii) to rely on various collision avoidance techniques to drive the cost of nominal handling to near the cost of non-redundant handling with acceptable additional messaging overhead.
Collision Detection
Using the ledger services idempotency feature as described above (i.e., ITXO), multiple actors may form independent valid intents and know that no more than one intent will get finalized on the ledger. This ensures correct behavior does not depend on coordination between replicas. In fact, any constellation of replication and failures cannot result in more than one intent from getting finalized.
In a typical transaction example, a customer credit card transaction originates at a merchant and is being processed to the ledger via the MER and PAN. Without the techniques of this disclosure, the transaction would be routed to the merchant wallet 1204, and from there on to the PAN wallet 1208, which corresponds to the customer's account balance. When the transaction completes, it is recorded on the ledger 1212, and the customer's funds (from the PAN wallet 1208) are received in the merchant wallet 1204.
The following observations are specific to this example. In particular, the request router (R) 1202 coordinates the handling of a transaction. Based on multi-wallet processor (MWP) liveliness measurements, R selects on which MWP each wallet replica should run thereby creating a routing map for the transaction. As long as wallets are behaving honestly, it can be seen that any combination of lost or duplicated messages results in at most one transaction on the ledger. In particular, and on the return path, if the 2nd PAN wallet (replica 1210) dies before responding, the response will not make its way back to the request router. The request router will see an indeterminate result. In this approach, the cost of message processing is generally multiplied by the number of replicas. In this example, the probability of alternative transactions being submitted to the ledger is approximately 25%. With just one replica (per MER and PAN), there is a 50% chance of alternative intents by the MER wallet, and a 50% chance of the PAN wallets adopting different MER intents. This assumes PAN wallets have consistent state. PAN wallets, having seen alternative requests for the same original message from the MER wallets, need to respond to those requests indicating which request they choose to act upon. Request/response closure is used to indicate what downstream action was taken. The PAN wallet that gets a timeout on its transaction submission will need to query the UTXOs of its address to update its UTXO view. This need not be done in the real time path, though the longer the period of time the greater the chance it could form an invalid intent in subsequent message handling. With failures no additional work is required to achieve the result, although in this basic case, additional work may be required to discover what that result was achieved.
Collision Avoidance
While the above-described active-active wallet replica approach provides significant advantages, it multiplies the resources necessary to handle a given message throughput. To address this, and according to an optimization, the approach herein adds delays and intent messages.
In particular, by adding the delays (typically on the order of milliseconds, but this is not a limitation), decision logic is biased (e.g., towards one intent). The delays alone tend to result in the PAN wallets both submitting the same transaction. This is desirable because the ledger can handle duplicates inexpensively, while handling a conflicting transaction is a full cost operation. The intent messages are used to intercede before a wallet handles the same original upstream message and forms a different intent. Seeing the replica's intent, a wallet can adopt the same intent and proceed with downstream processing. For completeness, after adopting intent, and as depicted in
When the request router R coordinates the handling of a transaction and produces a routing map, it also indicates replica ordering. This enables each replica to know when to delay, from which other replica to expect intent messages during that delay, and to which other replicas it should send intent should it form an independent intent. Preferably, the intent messages are sent when a wallet replica forms an independent intent (versue adopting the intent formed by some other replica). This represents additional throughput and message handling load. This load, however, is relatively invariant and under conditions of failure the messaging load decreases. In the approach herein, intent messages are asynchronous and non-blocking. An intent communicated can be checked for correctness and consistency. This can be done across the replica tier and also across the MER PAN tier. In particular, the intent can contain the current wallet ETag, thereby allowing replicas to detect and remedy inconsistency in wallet attribute state. Further, a wallet receiving inappropriate requests or intents can record this event such that the issue is detectable and alertable.
Intent Messaging
The intent messaging depicted in
Request Router as Request Coordinator
In the above design, the wallet services request router R acts as the “coordinator” (in distributed systems terms) for the requests it receives. The disposition of a request at the RR is typically a “success,” a “failure” or an “error.” Success means that the request has resulted in a given response being sent back to the client. Any successful response constitutes success. Failure means that a determinate outcome of the request handling has occurred but with no transaction submitted to ledger. Failures occur when downstream handling is known to have failed. Errors refer to indeterminate outcomes. Errors occur with downstream component failure and the effects of the request are non-deterministic. Here, one can attempt to retry the handling or to query the outcome. Once the transaction timeout period has elapsed, if the ITXO does not exist, it is safe to proceed.
Flow Identification
Preferably, the original external message is uniquely identified for each request comprising the above flows. This way an element can know when it receives a duplicate or alternative request or response mapping to the same original. This technique is used to occlude requests and ignore responses based on an established strategy.
Request Occlusion
When an element receives more than one request mapping to the same original message, generally the element will ignore all but the first. In this case, the requests that have been ignored are considered to be “occluded” by the first. Other strategies may be used, but generally only one requested action of a set of requested actions related to the same original message should get processed; preferably, the rest are occluded.
Request Closure
All requests must have closure, which means that, for every request transmitted, exactly one response must be received. A failure to receive a response in a timely manner should not block other request handling. A request timeout constitutes a non-deterministic error condition in these flows.
Because different intents may get expressed in requests to downstream elements, it is important that the closure of those requests indicate which of potentially multiple requests were acted upon and which were occluded. This enables lazy replica state synchronization and should greatly reduce the cases where replicas need to query wallet state from the ledger.
It is also acceptable to use closure of intent requests to convey whether the intent was adopted or ignored, and if ignored, what intent was actually adopted. This information is not canonical and should not cause flows to block, but it may be used to optimize subsequent state synchronization.
Wallet State on Ledger
Preferably, the approach herein is based on being able to retrieve the current wallet attributes from the ledger. As an optimization, wallet state may be retrieved from other wallet replicas, as long as it is always be retrievable from the ledger. Preferably, a UTXO is created for each wallet address and that UTXO carries a current attribute set. The txid and index of that UTXO are used to derive the wallet ETag.
Wallet Attributes UTXO and Wallet eTag
Preferably, wallet attribute changes are orchestrated differently than real-time transactions. First, attribute changes are administrative operations that require a wallet services admin signature. The processing of administrative operations are rendered idempotent not by using an ITXO, but by always consuming the old and producing a new attribute UTXO which is tantamount to consuming the old ETag and producing a new one. For this reason, administrative operations may safely be processed using the active-active model described above, but this is not required.
The main issue in coordinating attribute changes as well as value import and export is that an admin wallet needs to consult the ledger (or a wallet replica) to learn the identity of the wallet attribute UTXO, check its planned action against those attributes, and then consume the attribute UTXO and produce a new one. Once this has been done, the admin wallet (or more likely the request router) notifies all multi-wallet processors (MWP) where replicas of the affected wallet may run—if a replica is not running on the MWP it can ignore the notice.
If an MWP is not reachable and therefore cannot be notified, some means of making sure it eventually gets the notice or is otherwise invalidated is supported. Thus, e.g., on attribute change, preferably the following occurs: (1) retrieve identity of the attribute UTXO and check action against current attributes; and (2) update the wallet attribute UTXO by consuming the old one using the admin wallet signing key and producing a new one. Wait for this to finalize. While this is happening, wallet replicas simply continue to use the previous attribute state. Thereafter, the view of attribute state in replicas is updated.
RTXOs
In an alternative embodiment, transactions reference a transaction output containing the wallet's current state. This would be an input to the transaction referencing a transaction output that represents the wallet attributes. This attests that the wallet is using the current attributes from the Ledger's point of view. This ensures that multiple racing wallets can safely coexist even if one or more have a stale set of attributes. The ones with stale attributes will fail to find the RTXO.
ITXOs
Each transaction needs to produce at least one Idempotency Transaction Output. The ITXO is constructed from original transaction material such that at most one transaction for the same original message can succeed in getting put on the chain.
This ensures that multiple racing wallets can safely coexist even if they form different intents. For example, different destination wallets may produce request responses that differ by their signature. Or, for example, source wallets may have the same attributes, but a different view on the current UTXO set.
UTXO Aggregation
The above-described calls for wallets (generally merchant wallets (MERs)) to detect the need to aggregate UTXOs so as not to exhaust the Ledger's UTXO database capacity. This detection is bound to live transaction handling such that if while processing a transaction a wallet replica sees an accumulation of UTXOs exceeding some threshold, it will do the following. When a transaction is successfully processed by a destination wallet, the need to perform aggregation on a wallet is communicated in the response to the request router. The request router then, out-of-band from the original request, coordinates the aggregation. The rationale is that all wallet processors where replicas may be instantiated need to learn of or participate in the aggregation. This process, though not administrative, may be processed similarly to how wallet attribute changes are processed. This makes sense in so far as the UTXO set of a wallet is considered wallet state.
Sample Flows
While wallet services designed to support financial use cases, the approach to resilience as described above can be applied to virtually any set of services using Ledger Services to form a system of record. Other areas of application may include, but are not limited to, loyalty points systems, exchange of stocks, bonds, and commodities, logistics and control systems.
Enabling Technologies
As noted above, the techniques of this disclosure may be implemented within the context of an overlay network, such as a content delivery network (CDN), although this is not a limitation. In a known system of this type, such as shown in
As illustrated in
A CDN edge server is configured to provide one or more extended content delivery features, preferably on a domain-specific, customer-specific basis, preferably using configuration files that are distributed to the edge servers using a configuration system. A given configuration file preferably is XML-based and includes a set of content handling rules and directives that facilitate one or more advanced content handling features. The configuration file may be delivered to the CDN edge server via the data transport mechanism. U.S. Pat. No. 7,111,057 illustrates a useful infrastructure for delivering and managing edge server content control information, and this and other edge server control information can be provisioned by the CDN service provider itself, or (via an extranet or the like) the content provider customer who operates the origin server.
The CDN may include a storage subsystem, such as described in U.S. Pat. No. 7,472,178, the disclosure of which is incorporated herein by reference.
The CDN may operate a server cache hierarchy to provide intermediate caching of customer content; one such cache hierarchy subsystem is described in U.S. Pat. No. 7,376,716, the disclosure of which is incorporated herein by reference.
The CDN may provide secure content delivery among a client browser, edge server and customer origin server in the manner described in U.S. Publication No. 20040093419. The approach described there is sometimes referred to as an SSL-protected edge network. In a typical operating scenario, secure content delivery enforces SSL-based links between the client and the edge server process, on the one hand, and between the edge server process and an origin server process, on the other hand. This enables an SSL-protected web page and/or components thereof to be delivered via the edge server. To enhance security, the service provider may provide additional security associated with the edge servers. This may include operating secure edge regions comprising edge servers located in locked cages that are monitored by security cameras, providing a key management service, and the like. In one embodiment here, wallet services may be located in front of or behind an SSL-protected edge network.
In a typical operation, a content provider identifies a content provider domain or sub-domain that it desires to have served by the CDN. The CDN service provider associates (e.g., via a canonical name, or CNAME) the content provider domain with an edge network (CDN) hostname, and the CDN provider then provides that edge network hostname to the content provider. When a DNS query to the content provider domain or sub-domain is received at the content provider's domain name servers, those servers respond by returning the edge network hostname. The edge network hostname points to the CDN, and that edge network hostname is then resolved through the CDN name service. To that end, the CDN name service returns one or more IP addresses. The requesting client browser then makes a content request (e.g., via HTTP or HTTPS) to an edge server associated with the IP address. The request includes a host header that includes the original content provider domain or sub-domain. Upon receipt of the request with the host header, the edge server checks its configuration file to determine whether the content domain or sub-domain requested is actually being handled by the CDN. If so, the edge server applies its content handling rules and directives for that domain or sub-domain as specified in the configuration. These content handling rules and directives may be located within an XML-based “metadata” configuration file.
The above-described client-to-edge server mapping technique may be used to associate a wallet or wallet service (the “client”) with an edge server. In a typical use case, a transaction initiated from or otherwise associated with that wallet or wallet service then passes through the edge server and onward to the core for further processing as described herein. As noted above, the wallet or wallet service (or some portion thereof) may also reside inside the edge, such that wallet requests pass through the edge to the wallet or wallet service and onward to the core. Some portion of the transaction processing may be carried out at the edge server.
Each above-described process preferably is implemented in computer software as a set. of program instructions executable in one or more processors, as a special-purpose machine.
Representative machines on which the subject matter herein is provided may be Intel hardware processor-based computers running a Linux or Linux-variant operating system and one or more applications to carry out the described functionality. One or more of the processes described above are implemented as computer programs, namely, as a set of computer instructions, for performing the functionality described.
While the above describes a particular order of operations performed by certain embodiments of the invention, it should be understood that such order is exemplary, as alternative embodiments may perform the operations in a different order, combine certain operations, overlap certain operations, or the like. References in the specification to a given embodiment indicate that the embodiment described may include a particular feature, structure, or characteristic, but every embodiment may not necessarily include the particular feature, structure, or characteristic.
While the disclosed subject matter has been described in the context of a method or process, the subject matter also relates to apparatus for performing the operations herein. This apparatus may be a particular machine that is specially constructed for the required purposes, or it may comprise a computer otherwise selectively activated or reconfigured by a computer program stored in the computer. Such a computer program may be stored in a computer readable storage medium, such as, but is not limited to, any type of disk including an optical disk, a CD-ROM, and a magnetic-optical disk, a read-only memory (ROM), a random access memory (RAM), a magnetic or optical card, or any type of media suitable for storing electronic instructions, and each coupled to a computer system bus. A given implementation of the present invention is software written in a given programming language that runs in conjunction with a DNS-compliant name server (e.g., BIND) on a standard Intel hardware platform running an operating system such as Linux. The functionality may be built into the name server code, or it may be executed as an adjunct to that code. A machine implementing the techniques herein comprises a processor, computer memory holding instructions that are executed by the processor to perform the above-described methods.
While given components of the system have been described separately, one of ordinary skill will appreciate that some of the functions may be combined or shared in given instructions, program sequences, code portions, and the like.
While given components of the system have been described separately, one of ordinary skill will appreciate that some of the functions may be combined or shared in given instructions, program sequences, code portions, and the like. Any application or functionality described herein may be implemented as native code, by providing hooks into another application, by facilitating use of the mechanism as a plug-in, by linking to the mechanism, and the like.
The techniques herein generally provide for the above-described improvements to a technology or technical field, as well as the specific technological improvements to various fields.
Each above-described process preferably is implemented in computer software as a set of program instructions executable in one or more processors, as a special-purpose machine.
The edge network may communicate with the core using various technologies. Representative overlay network technologies that may be leveraged include those described in U.S. Publication Nos. 2015/0188943 and 2017/0195161, the disclosures of which are incorporated herein by reference. Among other things, these publications describe the CDN resources being used facilitate wide area network (WAN) acceleration services over the overlay in general, as well as between enterprise data centers (which may be privately-managed) and third party software-as-a-service (SaaS) providers. In one typical scenario, a so-called routing overlay leverages existing content delivery network (CDN) infrastructure to provide significant performance enhancements for any application that uses Internet Protocol (IP) as a transport protocol by routing around down links or finding a path with a smallest latency. Another approach is to provide messages from the edge to the core using multicast, unicast, broadcast or other packet-forwarding techniques.
The techniques herein generally provide for the above-described improvements to a technology or technical field, as well as the specific technological improvements to various fields including distributed networking, distributed transaction processing, wide area network-accessible transaction processing systems, high performance, low latency transaction processing systems, non-blocking full mesh interconnect systems, and the like, all as described above.
Number | Date | Country | |
---|---|---|---|
63141651 | Jan 2021 | US |