<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>imlearning.eth</title>
        <link>https://paragraph.com/@imlearning</link>
        <description>Blockchain research @DSRV labs, Seoul. I envision macro crypto market narratives with a technology &amp; philosophy basis.</description>
        <lastBuildDate>Fri, 22 May 2026 11:15:34 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>imlearning.eth</title>
            <url>https://storage.googleapis.com/papyrus_images/8e68f23e216872a0e83a41711efe0df30884d88aab08113d637bd7dfffb60fa8.png</url>
            <link>https://paragraph.com/@imlearning</link>
        </image>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[The very beginning of the Proof-of-Stake]]></title>
            <link>https://paragraph.com/@imlearning/the-very-beginning-of-the-proof-of-stake</link>
            <guid>bqT5s8Cl210beLaqoLR5</guid>
            <pubDate>Wed, 23 Mar 2022 04:46:13 GMT</pubDate>
            <description><![CDATA[PeercoinWe can spot Peercoin as the turning point from the proof-of-work to the proof-of-stake blockchain and might find it very interesting or even awkward based on the knowledge of current blockchain architecture because it is basically 90% bitcoin mixed with a pinch of coin staking. It seems that PeerCoin’s architecture failed to be included in the mainstream but still, it is meaningful to have a look at its idea as a kind of symbolic project. Peercoin blockchain has its unique hybrid arch...]]></description>
            <content:encoded><![CDATA[<h2 id="h-peercoin" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Peercoin</h2><p>We can spot Peercoin as the turning point from the proof-of-work to the proof-of-stake blockchain and might find it very interesting or even awkward based on the knowledge of current blockchain architecture because it is basically 90% bitcoin mixed with a pinch of coin staking.</p><p>It seems that PeerCoin’s architecture failed to be included in the mainstream but still, it is meaningful to have a look at its idea as a kind of symbolic project.</p><p>Peercoin blockchain has its unique hybrid architecture which implements both proof-of-work and proof-of-stake into a single UTXO blockchain. As a proof-of-stake implementation, Peercoin introduces a notion of “coin-age”, which is simply a “currency_amount * holding_period” and uses it to generate a proof-of-stake block. For example, Alice accumulates 900 coin-days if she has received 10 coins and held them for 90 days.</p><p>It is quite easy to be confused when grasping that the proof-of-work blocks and proof-of-stake blocks co-exist in the same blockchain, but it is the most important feature Peercoin has implemented. A proposer of the proof-of-stake block pays himself by consuming his coin-age in a special transaction called “coinstake” and by newly minting coins as a reward of his proof-of-stake.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/099fb5862e5fe29fe650429097d870bf725db707f1ca40b0be0e5473642c37df.png" alt="Source: Peercoin Whitepaper (https://decred.org/research/king2012.pdf)" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Source: Peercoin Whitepaper (https://decred.org/research/king2012.pdf)</figcaption></figure><p>The coinstake transaction includes “kernel input” as a hash target protocol similar to the mechanism of proof-of-work finding a nonce value smaller than the target. The most important difference is that the proposer just needs to search over the limited space, unlike proof-of-work protocol (e.g. bitcoin) which requires the proposer to find nonce out of much broader space. This is possible because the target of the stake kernel is proportional to the coin-age consumed in the coinstake transaction. In other words, the more the proposer accumulated his coin-age, the easier the proposer successfully mines the new proof-of-stake block. Peercoin is theoretically more energy-efficient (and thus eco-friendly) than bitcoin at this point although it still requires computational block mining.</p><p>The new way of block mining needs the new fork-choice rule, as it cannot reuse the traditional longest-chain rule because the overall hashpower decreases significantly thanks to the new mechanism, but at the same time became much easier to be attacked. So, the fork choice rule is replaced by the coin-age based rule, in which we calculate the score of the forks adding each transaction’s consumed coin-age, and choose the one that has consumed more coin-age (higher score) overall.</p><p>The new coins are minted also based on the consumed amount of coin-age, for example, 1 cent per 1 year coin-age. So as a whole, this process of mining a new proof-of-stake block resembles the recent blockchain implementation of coin lockup (staking) and proportional reward distribution as its result. A participant of the Peercoin network is incentivized to lock up his coin in the wallet to raise a probability of mining a new proof-of-stake block. Once it is done, he earns a newly minted coin reward proportional to his amount of stake.</p><h2 id="h-nxt" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Nxt</h2><p>Then Nxt comes after the Peercoin as a successive proof-of-stake experiment. Nxt discards the notion of “coin-age” Peercoin has introduced and devised a new mechanism called “pure proof-of-stake”. Every block in Nxt is generated using proof-of-stake, unlike Peercoin’s hybrid architecture. This is possible with the mechanism that makes an account simply having more balance more likely propose the next block and earn the transaction fees as a reward.</p><p>Each account calculates its target as follows: ‘base target value’ * ‘time since the last block’ * ‘effective balance of the account’. Effective balance is the only account-specific field, meaning that the more the account has its balance unmoved at least 1 day (this is the definition of ‘effective balance’ according to the whitepaper), the higher the target and thus probability of generating a new block becomes. Now you can see we have gotten closer to the current blockchain!</p><p>The interesting part of the Nxt is the “balance leasing”. An account may “loan” his block generation power to another account without giving up his control to spend the coin. One can set up a timeout until which the receiver can leverage the sender’s effective balance to raise the block generation power.</p><p>Transaction fees collected by the receiver will not be redistributed to the sender by default, but with some additional code, we can easily implement the system similar to the bitcoin mining pool. We might find out this “loan” resembles “delegation” in DPoS based blockchain (e.g. Cosmos-family blockchains) although it is intended to imitate pseudo-mining pool in PoS system with more flexibility.</p>]]></content:encoded>
            <author>imlearning@newsletter.paragraph.com (imlearning.eth)</author>
        </item>
        <item>
            <title><![CDATA[“Practical Byzantine Fault Tolerance, PBFT” Explained]]></title>
            <link>https://paragraph.com/@imlearning/practical-byzantine-fault-tolerance-pbft-explained</link>
            <guid>bbu8iGAddEF5aHEyreOF</guid>
            <pubDate>Thu, 10 Mar 2022 12:19:14 GMT</pubDate>
            <description><![CDATA[This article is mostly a paraphrase of “Practical Byzantine Fault Tolerance” by Castro and Liskov.IntroBy reviewing the paper “Impossibility of Distributed Consensus with One Faulty Process” [1], we went through the process of proving that no distributed consensus can satisfy both safety and liveness in an asynchronous network setting. That also means there is no ‘perfect’ distributed consensus, so we have to choose what to compromise between safety and liveness for the practical implementati...]]></description>
            <content:encoded><![CDATA[<blockquote><p>This article is mostly a paraphrase of “<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://pmg.csail.mit.edu/papers/osdi99.pdf">Practical Byzantine Fault Tolerance</a>” by Castro and Liskov.</p></blockquote><h2 id="h-intro" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Intro</h2><p>By reviewing the paper “Impossibility of Distributed Consensus with One Faulty Process” [1], we <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://mirror.xyz/imlearning.eth/1k-fGu6Lr4jUy9B1J0X2OYEizXXtjDYqR7URYDJHxCo">went through</a> the process of proving that no distributed consensus can satisfy both safety and liveness in an asynchronous network setting. That also means there is no ‘perfect’ distributed consensus, so we have to choose what to compromise between safety and liveness for the practical implementation.</p><p>We define safety and liveness as follows (I rephrased the definition mainly from the paper “Practical Byzantine Fault Tolerance” [2]):</p><ul><li><p>Safety</p><p>All non-faulty nodes can agree on the sequence of requests, like a centralized implementation that executes operations atomically one at a time. i.e., if there has been a consensus between all non-faulty nodes, every node should be able to access the identical value.</p></li><li><p>Liveness</p><p>Clients who cast their request must eventually receive replies. It implies that the distributed system eventually achieves consensus or in other words, agrees on the same state.</p></li></ul><p>PBFT is a practical implementation of a consensus algorithm that compromises liveness. Here, by ‘compromising’ I mean the existence of ‘synchrony’ because what we have proven to be impossible is the perfect consensus algorithm in an <strong>asynchronous</strong> network environment. In simple language, PBFT has introduced time-outs to ensure liveness.</p><p>This is quite an interesting phenomenon considering Nakamoto consensus because it chooses to compromise the safety, unlike PBFT choosing liveness. Safety can be understood as a blockchain term ‘finality’, and we know that there exist some forks in bitcoin generated mainly because of the network delay. The miners constructing blocks on fork A and fork B respectively do not access the identical value. But block production in bitcoin never stops, even in the asynchronous network environment.</p><p>“So, what’s better?”, you might raise a question, but that’s quite difficult to answer. Let’s figure it out step by step.</p><h2 id="h-definitions" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Definitions</h2><p>Firstly, we need to demystify a few fuzzy words in this paper before proceeding to the actual PBFT operation.</p><ul><li><p>Replica: A node under distributed network circumstance.</p></li><li><p>Fail-stop: Replicas might stop their operation due to errors. In this case, we call this abnormal status a ‘fail-stop’.</p></li><li><p>Byzantine Fault: Replicas might revise the codebase arbitrarily and behave maliciously to the whole network. This is not simply ‘fail-stop’ status, so in this case, we call that specific replica a faulty node or Byzantine node.</p></li><li><p>Asynchronous Distributed System: replicas are connected by a network that may fail to deliver the message by delaying them. i.e., no time-outs.</p></li></ul><p>The PBFT algorithm provides both safety and (compromised) liveness assuming no more than [n-1/3] replicas are faulty. That means, if there are f amount of Byzantine nodes, the PBFT algorithm works only if the total number of 3f + 1 nodes are in the network (thus, we need 2f + 1 normal replicas). But why 3f + 1?</p><ol><li><p>Faulty replicas might not be responding to the communication. So we need n-f replicas to be greater than 0 for successful communication, where n is the total number of replicas in the network. Thus, n &gt; f.</p></li><li><p>We can think of a possible situation where f faulty replicas are in fact responding to the communication requests (of course maliciously, but other normal replicas can’t ensure whether they are honest or not), but another f amount of normal replicas are not responding. Still, we want the communications to proceed so n - 2f (f replicas that do not respond + f replicas that do respond but are faulty) should be greater than f (faulty nodes). Thus n -2f &gt; f, and n &gt; 3f.</p></li><li><p>n &gt; f and n &gt; 3f. Thus n &gt; 3f</p></li></ol><p>n is an integer value, so we need minimal 3f + 1 replicas in the network.</p><h1 id="h-normal-case-operation" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Normal-case Operation</h1><p>So, finally we are here. Let’s now dig down the actual operation of the PBFT consensus algorithm. Here is the illustration for the lifecycle from the request to the reply:</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/cccee20df34105730de2b2c880c5f8dcee69eb5b098b398fd14c5056c75709c9.png" alt="PBFT Operation. Source: Practical Byzantine Fault Tolerance." blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">PBFT Operation. Source: Practical Byzantine Fault Tolerance.</figcaption></figure><p>‘C’ denotes a client who casts its request and expects to receive the result of its operation (or computation) in the form of ‘reply’. ‘0’ here is important in that it is the special replica that leads this stage, while the other 1, 2, 3 are the normal replicas. We call replica 0 as ‘primary’ and the others ‘backups’.</p><p>We need to keep in mind that all replicas (including primary) contain the state, a message log of accepted messages, and an integer denoting the replica’s current view which is a stage, or in a blockchain context, block number. A single view consists of roughly three phases: pre-prepare, prepare and commit.</p><p>As an overview of a view, a request from the client is handled through four steps: (1) a client sends a request to the primary, (2) the primary multicasts the request to the backups, (3) replicas execute the request and send a reply to the client, (4) the client waits for f+1 replies from different replicas with the same result. More sophisticated steps are shown below:</p><ol><li><p>Firstly, client C requests the execution of state machine (replica) operation by sending a ‘REQUEST’ type message to the primary.</p></li><li><p>The primary receives the request from the client. This is the ‘request’ phase of the illustration above.</p></li><li><p>The pre-prepare phase now starts. The primary multicasts ‘PRE-PREPARE’ message to all the backups, with the information about the view and sequence number (order of request to be operated within a view) to which the request is assigned. This ‘PRE-PREPARE’ message is important in that the information the message contains is used as proof later if the primary is revealed to be a faulty replica.</p></li><li><p>All the backups accept a ‘PRE-PREPARE’ message from the primary replica after validation: they check whether the message signature is valid, and it is in adequate view, etc. If the messages are successfully received, then the pre-prepare phase now ends.</p></li><li><p>Prepare phase starts. Each backup node multicasts a ‘PREPARE’ type message to all the other nodes and adds both the ‘PRE-PREPARE’ and ‘PREPARE’ message to its local log.</p></li><li><p>A replica (including primary) accepts prepare messages and adds them to its log provided the information match with the ‘PRE-PREPARE’ message and is valid: it checks whether their signatures are valid, and their view number equals the replica’s current view, etc. Also, it checks 2f ‘PREPARE’ messages match with the ‘PRE-PREPARE’ message. If all the processes were successful then prepare phase now ends.</p></li><li><p>The commit phase now starts. All the replicas multicast ‘COMMIT’ type message to the other replicas. Replicas accept commit messages and insert them in their log after the validation process same with the ‘PREPARE’ phase.</p></li><li><p>Each replica ensures that prepare phase was successful and it has accepted 2f + 1 ‘COMMIT’ type messages from different replicas that match the pre-prepare for the request. If everything so far is successful, then the replica executes (or computes) the request. The commit phase now ends.</p></li><li><p>A replica sends the ‘REPLY’ type message to the client. The message contains (1) information of view number (similar to block height), (2) timestamp, (3) result of executing the requested operation, and (4) the unique number of replica who sends this message.</p></li><li><p>The client waits for f+1 valid replies from different replicas before finally accepting the result of the operation.</p></li></ol><blockquote><ul><li><p>pre-prepare and prepare phases so far ensure requests are totally ordered within the same view.</p></li><li><p>prepare + commit phases are used to ensure that requests that commit are totally ordered across views.</p></li></ul></blockquote><p>Back to the illustration above, you might find backup replica 3 does not respond to the messages the others have sent. We don’t know whether it is in just fail-stop status or in fact a real Byzantine node but no matter what kind of replica it is actually, the client will successfully receive a reply of his request because there will be more than f (in this case, 1) confirmations from non-faulty replicas.</p><p>Even if the replica 3 is revealed to be a Byzantine node that <strong>responds</strong> to the message maliciously, the client will receive enough amount of correct messages thus should be able to confirm its validity.</p><h1 id="h-view-changes" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">View Changes</h1><p>But what if the primary replica is a Byzantine node? It would take forever to make a consensus if the primary stops multicasting any messages. This is totally possible in an asynchronous network setting where infinite message delay is acceptable behavior. As we know already, PBFT introduces time-out i.e., synchrony to solve this critical problem to the liveness property: distributed system eventually achieves consensus.</p><p>All the replicas have their own timer which starts counting once it receives a request. When the timer of a backup expires in a specific view (let us denote that view as ‘v’), it stops accepting messages and multicasts a ‘VIEW-CHANGE’ type message to all replicas.</p><p>The new primary replica of view ‘v + 1‘ would receive 2f (not 2f + 1, because the former primary replica turned out to be a faulty node) valid ‘VIEW-CHANGE’ message and start new view ‘v + 1’ by sending ‘NEW-VIEW’ message to all other replicas.</p><p>This view change mechanism is the most interesting point of PBFT because this is why this consensus mechanism has the word ‘practical’ in its name. Under the PBFT mechanism, all the nodes process the serializable requests atomically with almost instant finality, and it is a quite meaningful property in the context of blockchain considering blockchain-specific operations like P2P payment. There always exists a risk of chain reorganization(reorg) in the implementation using the longest-chain rule (e.g., Nakamoto consensus) but PBFT is not, due to its maximized safety property. But this is only possible with the trade-off: compromised asynchrony as we have seen in the implementation of view change mechanism for the enhanced liveness performance.</p><h1 id="h-outro" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Outro</h1><p>There is one more weakness in the PBFT algorithm: heavy network consumption. To finalize a single view, the system requires roughly three phases that need for the message multicast. One-to-many messaging protocol consumes network bandwidth exponentially even though the number of participant nodes grows linearly. This is why PBFT is often combined with DPoS because it limits the number of maximum validator nodes under a certain capable threshold. And surely this leads to the innate limit on the degree of decentralization in the context of blockchain.</p><p>It is not a matter of “what mechanism takes an absolute advantage over the other” when choosing between BFT-family consensus and Nakamoto consensus. Each offers its own advantages with trade-offs thus, what is truly important is to start by defining the general purpose of the system (or the blockchain) and then choosing the mechanism that ‘fits’ that purpose.</p><h1 id="h-references" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">References</h1><p>[1] M. Fisher, N. Lynch, and M. Paterson. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://pmg.csail.mit.edu/papers/osdi99.pdf">Impossibility of Distributed Consensus With One Faulty Process</a>. In <em>Journal of the ACM</em>, 1985.</p><p>[2] M. Castro and B. Liskov. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://pmg.csail.mit.edu/papers/osdi99.pdf">Practical Byzantine Fault Tolerance</a>. In <em>Proceedings of the Third Symposium on Operating Systems Design and Implementation</em>, 1999.</p>]]></content:encoded>
            <author>imlearning@newsletter.paragraph.com (imlearning.eth)</author>
        </item>
        <item>
            <title><![CDATA[Understanding “Impossibility of Distributed Consensus with One Faulty Process”]]></title>
            <link>https://paragraph.com/@imlearning/understanding-impossibility-of-distributed-consensus-with-one-faulty-process</link>
            <guid>AzqrE41dgTUl4FfObfSx</guid>
            <pubDate>Sun, 27 Feb 2022 11:42:45 GMT</pubDate>
            <description><![CDATA[Consensus ProtocolLet us start by integrating some unfamiliar definitions in this paper. By reading through these concepts, you should be able to grasp the big picture of how the consensus protocol works. I added some illustrations to further understand how these concepts are linked together to form a protocol.FIGURE 1. Concept of process, and message system.FIGURE 2. Concept of the configuration and sequence.consensus protocol: denoted by P (capital). This paper assumes that P is an asynchro...]]></description>
            <content:encoded><![CDATA[<h1 id="h-consensus-protocol" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Consensus Protocol</h1><p>Let us start by integrating some unfamiliar definitions in this paper. By reading through these concepts, you should be able to grasp the big picture of how the consensus protocol works. I added some illustrations to further understand how these concepts are linked together to form a protocol.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/fc39ed2f85e23972ae9251754510d7999984449ef92592267f0eb4b868fc8e06.png" alt="FIGURE 1. Concept of process, and message system." blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">FIGURE 1. Concept of process, and message system.</figcaption></figure><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/648f73f557e7e17ff201c9a1fce7799a521ddd97caddd9f43f1a933184a70146.png" alt="FIGURE 2. Concept of the configuration and sequence." blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">FIGURE 2. Concept of the configuration and sequence.</figcaption></figure><ul><li><p><strong><em>consensus protocol</em></strong>: denoted by <em>P</em> (capital). This paper assumes that <em>P</em> is an asynchronous system of N processes (N ≥ 2).</p></li><li><p><strong><em>process</em></strong>: denoted by <em>p</em> (lower case). A process can be understood as a node, which has its internal storage, and state that is determined by inputs and a <em>transition function</em>. See Figure 1 below.</p></li><li><p><strong><em>input register</em></strong>: process <em>p</em> has one input register <em>x_p</em> with values either of b or 0 or 1.</p></li><li><p><strong><em>output register</em></strong>: process <em>p</em> has one output register <em>y_p</em> with values either of b or 0 or 1. process <em>p</em> has its <em>y_p</em> value as b initially, but as soon as it becomes 0 or 1, it cannot be changed (thus, <em>output register</em> is “write once”).</p></li><li><p><strong><em>internal state</em></strong>: The values in <em>x_p</em> and <em>y_p</em> comprise the <em>internal state</em>.</p></li><li><p><strong><em>initial state</em></strong>: initial state has its <em>y_p</em> value “b” but <em>x_p</em> value can vary.</p></li><li><p><strong><em>decision state</em></strong>: a state in which <em>y_p</em> has a value either of 0 or 1. once a process becomes the <em>decision state</em>, <em>y_p</em> cannot be changed anymore.</p></li><li><p><strong><em>transition function</em></strong>: transition function determines <em>y_p</em> (output). but cannot change <em>y_p</em> anymore once <em>p</em> becomes <em>decision state</em>.</p></li><li><p><strong><em>message</em></strong>: a <em>message</em> is a pair (<em>p</em>, <em>m</em>), where <em>p</em> is the destination process and <em>m</em> is a message value from a fixed universe <em>M</em>.</p></li><li><p><strong><em>message buffer</em></strong>: a FIFO queue of <em>messages</em> that have been sent but not yet received. <em>message buffer</em> supports two operations:</p><ol><li><p>send(<em>p</em>, <em>m</em>): send message <em>m</em> to the process <em>p</em>. place (<em>p</em>, <em>m</em>) in the message buffer.</p></li><li><p>receive(<em>p</em>): deletes some message (<em>p</em>, <em>m</em>) from the <em>buffer</em> and returns <em>m</em> OR returns null and leaves the buffer unchanged.</p></li></ol></li><li><p><strong><em>configuration</em></strong>: <em>configuration</em> consists of 1. <em>internal state</em> of each process and 2. contents of the <em>message buffer</em>. See Figure 2.</p></li><li><p><strong><em>initial configuration</em></strong>: a <em>configuration</em> in which each process starts at an <em>initial state</em> and the <em>message buffer</em> is empty.</p></li><li><p><strong><em>step</em></strong>: a <em>step</em> takes one <em>configuration</em> C to another <em>configuration</em> C’.</p></li><li><p><strong><em>event</em></strong>: event is denoted by <em>e</em>. <em>e</em> = (<em>p</em>, <em>m</em>), which means a receipt of m by <em>p</em>. e(C) denotes the <em>resulting configuration</em>, and we say that <em>e</em> can be applied to C.</p></li><li><p><strong><em>sequence</em></strong>: <em>sequence</em> σ is a set of multiple <em>events</em>.</p></li><li><p><strong><em>schedule</em></strong>: finite or infinite <em>sequence</em> σ that can be applied starting from C.</p></li><li><p><strong><em>resulting configuration</em></strong>: σ(C).</p></li><li><p><strong><em>reachable</em></strong>: if σ(C), σ(C) is <em>reachable</em> from C.</p></li><li><p><strong><em>accessible</em></strong>: a configuration <em>reachable</em> from some <em>initial configuration</em> is <em>accessible</em>.</p></li></ul><p>So, with the background knowledge above, we are going to prove that:</p><blockquote><p>Theorem: There is always a sequence of events in an asynchronous distributed system such that the group of processes never reach consensus</p></blockquote><p>by showing that there is a case in which protocol remains forever indecisive.</p><h2 id="h-lemma-1" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Lemma 1</h2><blockquote><p>LEMMA 1. <strong>Commutativity</strong> property of schedules. Suppose that from some configuration C, the schedules σ1, σ2 lead to configurations C1, C2, respectively. If the sets of processes taking steps in σ1 and σ2, respectively, are disjoint, then σ2 can be applied to C1 and σ1 can be applied to C2, and both lead to the same configuration C3.</p><p><strong>i.e., σ1(σ2(C)) = σ2(σ1(C)), if the sets of processes taking steps in σ1 and σ2 are disjoint.</strong></p></blockquote><p>PROOF: The result follows at once from the system definition, since σ1 and σ2 do not interact.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/0b76c396f09ff0dfe9585fd59e73fa61d03b0017da84586a2fdb3543adb9cfe6.png" alt="Source: Impossibility of Distributed Consensus with One Faulty Process, p.377" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Source: Impossibility of Distributed Consensus with One Faulty Process, p.377</figcaption></figure><p>So, LEMMA 1 proves that <strong>schedules are applicable without considering an order, resulting in the same resulting configuration.</strong> This “commutativity” property of schedule is used to prove Lemma 3.</p><h2 id="h-lemma-2" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Lemma 2</h2><p>We need to understand what the “valency” is before we step into the proof of lemma 2. Here is a table for the grasp.</p><ul><li><p><strong>univalent</strong>: if all reachable configurations have decision value v (thus in a decision state), we just call the configuration univalent.</p></li><li><p><strong>0-valent</strong>: univalent, with all of the reachable configurations having decision value 0.</p></li><li><p><strong>1-valent</strong>: univalent, with all of the reachable configurations having decision value 1.</p></li><li><p><strong>bivalent</strong>: if all reachable configurations do not have the same decision value v, we just call the configuration bivalent.</p></li></ul><blockquote><p>LEMMA 2. Consensus protocol <em>P</em> has a <strong>bivalent initial configuration</strong>.</p></blockquote><p>PROOF: We use contrary proof. Assume that <em>P</em> must have only univalent initial configurations. So, <em>P</em> must have both 0-valent and 1-valent initial configurations.</p><p>Let us call two initial configurations <em>adjacent</em> if they differ only in the initial value <em>x_p</em> of a <strong>single process <em>p</em></strong>.</p><p><strong>(REMINDER</strong>: <em>initial configuration</em>: a <em>configuration</em> in which each process starts at an <em>initial state</em> and the <em>message buffer</em> is empty. <em>initial state</em>: initial state has its <em>y_p</em> value “b” but <em>x_p</em> value can vary.<strong>)</strong></p><p>If we list all the possible initial configurations, there must be two adjacent initial configurations, 0-valent and 1-valent respectively, and the only difference between them is the x_p value of a single process <em>p</em>.</p><p>Now we consider applying sequence σ to both initial configuration n and n+1 assuming that the process <em>p</em> does not take any step.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/00099300ba89838160cb6c1c422ce86b34314ba9c614bdc2dd0ceb45ed09eaec.png" alt="FIGURE 3. initial configurations and contradiction." blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">FIGURE 3. initial configurations and contradiction.</figcaption></figure><p>If sequence σ can be applied to initial configuration n, then it is also applicable to initial configuration n+1 because they are identical except the x_p value of a single process <em>p</em>, and now <em>p</em> is halted by the assumption. σ(config n) = σ(config n+1). If the decision value of configuration C is 1, then config n is bivalent. Reversely, if the decision value of configuration is 0, then config n+1 is bivalent. This contradicts the assumed nonexistence of a bivalent initial configuration. End of proof.</p><p>So, in short, LEMMA 2 proves that <strong>there exists a bivalent initial configuration.</strong></p><h2 id="h-lemma-3" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Lemma 3</h2><blockquote><p>LEMMA 3. Let C be a bivalent configuration of P, and let e = (p, m) be an event that is applicable to C. Let <strong><em>C</em></strong> be the set of configurations reachable from C without applying e, and let <strong><em>D</em></strong> = e(<strong><em>C</em></strong>) = {e(E) | E ∈ <strong><em>C</em></strong> and e is applicable to E}. Then, <strong><em>D</em></strong> contains a bivalent configuration.</p></blockquote><p>PROOF: Since e is applicable to C, then by the definition of C and the fact that messages can be delayed arbitrarily (by LEMMA 1), e is applicable to every E ∈ <strong><em>C</em></strong>.</p><p>We also use contrary proof here again. Now assume that <strong><em>D</em></strong> contains no bivalent configurations, so every configuration F ∈ <strong><em>D</em></strong> is univalent.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/bf47a54ed27354d665839b6210432897dcc4293ef0b30c276a55b645b04c53be.png" alt="FIGURE 4. Reachable configurations from C." blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">FIGURE 4. Reachable configurations from C.</figcaption></figure><p>If F is a configuration reachable from E, then F is also either 0-valent or 1-valent since D contains no bivalent configuration by the assumption. As <em>e</em> is applicable to every E ∈ C, by an easy induction, there exist E_n and E_n+1 such that F_n = e(E_n) and F_n+1 = e(E_n+1).</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/ad3f85181a09ae0e7dbb9fa2a4191bc81cb06f001e8e33b78bfa894ff6c7804f.png" alt="FIGURE 5. Case 1, when p’ ≠ p." blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">FIGURE 5. Case 1, when p’ ≠ p.</figcaption></figure><p>Let event e = (p, m) and e’ = (p’, m’).</p><p><strong>CASE 1</strong>: If p’ ≠ p, then F_n+1 = e’(F_n) by LEMMA 1. This is impossible, since any successor of a 0-valent configuration is 0-valent. i.e., F_n(0-valent configuration) → F_n+1(1-valent configuration) is impossible.</p><p><strong>CASE 2</strong>: If p’ = p, then consider any finite deciding schedule from E_n in which <em>p</em> takes no steps:</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/9faa7f8b6be9cc86931a0c23534f9867f41f352fdb2718ff0d8377054a22315c.png" alt="FIGURE 6. Case 2, when p’ = p." blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">FIGURE 6. Case 2, when p’ = p.</figcaption></figure><p>Let σ the schedule, and let configuration A = σ(E_n). By LEMMA 1, σ is applicable to F_n and F_n+1, and it leads to 0-valent configuration G_n = σ(F_n) and 1-valent G_n+1 = σ(F_n+1). Also by LEMMA 1, e(A) = G_n and e(e’(A)) = G_n+1. So, configuration A is bivalent, but this is impossible since the schedule to A is deciding by the assumption. So A must be univalent. In this case, we reach a contradiction. End of proof.</p><p>So, LEMMA 3 proves that <strong>there exists a bivalent configuration that can be reached from the bivalent configuration.</strong></p><h2 id="h-integration" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Integration</h2><p>Let us integrate the lemmas we have just proved so far and build a conclusion.</p><blockquote><p>(LEMMA 1: schedules are applicable without considering an order, resulting in the same resulting configuration. i.e., commutativity property of schedules.)</p><p>LEMMA 2: there exists a bivalent initial configuration.</p><p>LEMMA 3: there exists a bivalent configuration that can be reached from the bivalent configuration, proved with LEMMA 1.</p></blockquote><p>Considering LEMMA 2 and LEMMA 3, we can finally prove that <strong>there is a case in which protocol remains forever indecisive.</strong></p><p>If there is a schedule that runs from bivalent configuration (whose existence is proved by LEMMA 2 and 3) to a univalent configuration, there must be a some single step that goes from a bivalent to a univalent configuration. Such a step determines the eventual decision value. It is always possible to run the asynchronous system in a way that avoids such steps by failing single process.</p><h3 id="h-references" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">References:</h3><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://groups.csail.mit.edu/tds/papers/Lynch/jacm85.pdf">https://groups.csail.mit.edu/tds/papers/Lynch/jacm85.pdf</a></p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.cs.purdue.edu/homes/peugster/classes/CS505Spring09/10-Consensus.pdf">https://www.cs.purdue.edu/homes/peugster/classes/CS505Spring09/10-Consensus.pdf</a></p><div data-type="youtube" videoId="KpJ6pENjrtE">
      <div class="youtube-player" data-id="KpJ6pENjrtE" style="background-image: url('https://i.ytimg.com/vi/KpJ6pENjrtE/hqdefault.jpg'); background-size: cover; background-position: center">
        <a href="https://www.youtube.com/watch?v=KpJ6pENjrtE">
          <img src="{{DOMAIN}}/editor/youtube/play.png" class="play"/>
        </a>
      </div></div><p><strong>FEEDBACK IS ALWAYS WELCOMED! Please DM(@ysjlitt twitter) me if you find any errors in this article.</strong></p>]]></content:encoded>
            <author>imlearning@newsletter.paragraph.com (imlearning.eth)</author>
        </item>
    </channel>
</rss>