<?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>Mark Odayan</title>
        <link>https://paragraph.com/@mark-odayan</link>
        <description>Researcher</description>
        <lastBuildDate>Fri, 08 May 2026 08:14:53 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>Mark Odayan</title>
            <url>https://storage.googleapis.com/papyrus_images/805b0a8594d8a688e60abd714c09666c47d4e98c6443298dfd66dbe17e305a90.jpg</url>
            <link>https://paragraph.com/@mark-odayan</link>
        </image>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[Resource Pricing and TFM Design in Ethereum (Part 1 - Blockchain Resources)]]></title>
            <link>https://paragraph.com/@mark-odayan/resource-pricing-and-tfm-design-in-ethereum-part-1-blockchain-resources</link>
            <guid>QXnlVFeSwepbiidDyN3h</guid>
            <pubDate>Thu, 25 Apr 2024 21:15:46 GMT</pubDate>
            <description><![CDATA[Over the last decade, Ethereum has emerged as one of the first working examples of a decentralised economic system capable of supporting varying degrees of complex interactions between users in trustless and permissionless manner. Given the nature of the decentralised domain, building such an economic system has come with many unique challenges which generally are not prevalent in the domains of centrally-planned and mixed economies that we are more familiar with today. Given the unique setti...]]></description>
            <content:encoded><![CDATA[<p>Over the last decade, Ethereum has emerged as one of the first working examples of a <strong>decentralised economic system</strong> capable of supporting varying degrees of complex interactions between users in trustless and permissionless manner.</p><p>Given the nature of the decentralised domain, building such an economic system has come with many unique challenges which generally are not prevalent in the domains of centrally-planned and mixed economies that we are more familiar with today. Given the unique setting, we find that many of the proposed solutions and mechanism design approaches adopted by Ethereum consider aspects of both <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://youtu.be/VynhT3qdT-A?t=293">neoclassical and complexity economics</a>. This demonstrates the sort of “uncharted waters” we are dealing with here, therefore it will be a goal of ours with this article series to help describe Ethereum’s economic system and highlight some of the key features that characterise it in the novel, decentralised setting. While we will not go over the economic system in its entirety, a higher level overview of what it entails will be covered later in this introductory section.</p><h3 id="h-what-is-this-article-series-about" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">What is this article series about?</h3><p>This article series is intended to describe the subsystem of Ethereum responsible for <strong>allocating and distributing resources</strong> - a task that is universally important in all economic systems. While this topic may seem highly-specific, you may find that it answers a lot of different questions about Ethereum and how it actually works beyond the basic picture of “its a blockchain”.</p><p>To understand how Ethereum manages this task we first need to understand the nature of the resources being distributed in the system, how costs are allocated to them, and finally how they are paid for. This series is therefore structured into three parts:</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/89a03c17eeb6a348a6524726328d3d420aebcad61e53a0aff18d3f8434829597.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><ol><li><p><strong>Blockchain Resources</strong>: The nature of the resources utilised by Ethereum are identified along with useful abstractions.</p></li><li><p><strong>Resource Pricing</strong>: How costs are assigned to different resources and patterns of resource usage are described.</p></li><li><p><strong>Transaction Fee Mechanism</strong>: How transaction fees are determined and to whom payments are directed are described.</p></li></ol><h3 id="h-defining-an-economic-system" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Defining an economic system</h3><p>Before starting with this article series, lets go over a basic definition of an economic system:</p><blockquote><p>An <strong>economic system</strong> is a system of production, resource allocation and distribution of goods and services within a society.It includes the combination of various actors, decision-making processes, and patterns of consumption that comprise the economic structure of a given community.</p></blockquote><p>With this context, there are a few details we can identify that characterise an economic system:</p><ul><li><p><strong>System of production &lt;1, 2&gt;</strong>: How and how many resources are produced for usage.</p></li><li><p><strong>Resource allocation &lt;2&gt;</strong>: How is a resource type assigned across different use cases.</p></li><li><p><strong>Distribution of goods and services &lt;3&gt;</strong>: How are deliverables produced from resources made available to consumers, how are these deliverables paid and who gets paid for them.</p></li><li><p><strong>Various actors &lt;3&gt;</strong>: Who are the actors involved and what roles do they play in the system.</p></li><li><p><strong>Decision-making processes &lt;1,2,3&gt;</strong>: How and what are the decisions that were made around system of production, resource allocation, and distribution of goods and services.</p></li><li><p><strong>Patterns of consumption &lt;2&gt;</strong>: In what manner are resources utilised (directly related to distribution of goods and services).</p></li></ul><p>While the above is by no means a comprehensive blueprint for an economic system, it gives us a starting point to reason about Ethereum.</p><h3 id="h-ethereum-as-an-economic-system" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Ethereum as an economic system</h3><p>As mentioned earlier, this series is split into three sections: <strong>blockchain resources, resource pricing,</strong> and the <strong>transaction fee mechanism</strong>. The diagram below illustrates where the above-mentioned economic system characteristics will be discussed in the relevant sections, contributing towards giving a full picture of how two sub-components (resource pricing component, transaction fee mechanism) help manage the distribution of blockchain resources in Ethereum.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/35e459b502d5a839d5fac776a5013c1a3233c7e49fb27b660306177964d504b5.jpg" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><h3 id="h-identifying-system-components" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Identifying system components</h3><p>While there are three sections to this article, the first section is different from the two that follow because it is purely describing the blockchain resources which drive the economic system. The following two sections (<strong>resource pricing</strong>, <strong>transaction fee mechanism</strong>) describe crucial system components that help realise the characteristics of the economic system, each also consisting of their own design goals which will be discussed later on. We will refer to these two system components collectively as the <strong>resource allocation system</strong>. The rationale for this shall be made apparent shortly as it allows us to group specific functionality under one label within a more complex global system model.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/031459c85f7913e53c5be34dcaa0654212450d077631267adcde4824751bb83c.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><h3 id="h-defining-the-resource-allocation-system-of-ethereum" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Defining the resource allocation system of Ethereum</h3><p>So far our understanding of the resource allocation system introduced above is limited to knowing that it consists of two components, therefore we will now explicitly describe it:</p><blockquote><p>The <strong>resource allocation system</strong> is a subsystem that integrates two different components, each serving unique purposes. It effectively links the resource pricing component together with the transaction fee mechanism.The interaction of these two components with each other aims to produce specific outcomes in service of economic efficiency as a result of more careful management of available blockchain resources.</p></blockquote><p>Lets briefly go over these two components that are a part of the resource allocation system:</p><p><strong>Resource Pricing:</strong> Determines resource costs of transactions</p><blockquote><p>This component can be understood as a system responsible for metering resource usage imposed by transaction processing, therefore determining the total resource costs associated with each transaction. We use the term “metering” because transactions can be broken down into chains of lower-level operations, each with its own individual resource costs. The cost of lower-level operations are defined by a specification known as the <strong>resource pricing policy.</strong> With this framework, the resource pricing component utilises the policy, along with a systematic approach, to accurately assess and aggregate individual costs and determine the total resource costs of a transaction. A key design goal of the resource pricing component is to accurately price the impact of all transactions by reflecting the cost overhead that users incur on the rest of the network. To achieve this goal, the component must assign costs to transactions that closely align with the true social costs generated by their activities.</p></blockquote><p><strong>Transaction Fee Mechanism</strong>: A market mechanism for transactions which decides which transactions get included and how much users pay for them</p><blockquote><p>The transaction fee mechanism is a system that users and block producers interact with where the resulting outcome is a block being produced consisting of a list of executed transactions. In Ethereum, the TFM guides how the finite amount of blockchain resources made available for distribution in a block get allocated and involves interactions between a block producer and users within every block period (every 12 seconds). It is also where transaction fee payments are made by users where such payments are a function of the total resource cost of their transactions (produced by the resource pricing component) and a bid (incentivising for sale of resources which translate to transaction inclusion). Because block producers are the actors who ultimately perform the task of creating a block and hence choosing which transactions get included (in anticipation of revenue), we characterise this interaction between users and block producers as a <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://en.wikipedia.org/wiki/Principal%E2%80%93agent_problem">principal-agent problem</a> where block producers perform actions on behalf of users. The transaction fee mechanism therefore serves to align the interests of principals (users) and the agent (the block producer) in such a way that honest interaction with the mechanism leads to the optimal outcome for both these groups of self-interested actors. The result therefore is that a higher level of economic efficiency is achieved through mechanism design.</p></blockquote><h3 id="h-other-factors-that-impact-ethereums-economic-model" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Other factors that impact Ethereum’s economic model</h3><p>To better understand where the resource allocation system defined above fits in, consider the following conceptual model that is a more detailed representation of Ethereum’s economic system which considers other factors that influence its inner workings:</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/d2afac04a1e73505e0791b7231321e38e3939a2211b3843578829ca0215761d3.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>Along with the resource allocation system, we have other areas of influence that impact the economic balance of Ethereum as illustrated in the conceptual model such as the monetary policy, cryptoeconomic security, and macroeconomic influence. <strong>These influences on Ethereum’s economic system will not be covered in this blog post</strong>, but here is what they roughly describe:</p><ul><li><p><strong>Monetary Policy</strong>: Aspects that affect Ethereum’s circulating supply on the native asset ETH, such as validator rewards and burning (the burning of ETH is mechanism design decision related to the implementation of the transaction fee mechanism but an effect of this feature is experienced within monetary policy - more on this later).</p></li><li><p><strong>Cryptoeconomic Security</strong>: The consensus protocol influences validator rewards and network security which impacts the economic dynamics of Ethereum.</p></li><li><p><strong>Macroeconomic Influence</strong>: Describes the effect that external market factors may have on Ethereum’s economic system, such as demand for ETH, price volatility, regulatory risk and much more.</p></li></ul><p>Its worth mentioning that all these mentioned areas within Ethereum’s economic model do interact with one another, however we will be focussing more on the interactions between the subcomponents of the resource allocation system in helping Ethereum achieve its economic efficiency goals as well as its decentralisation properties.</p><p>So now that the tone has been set for this article series, I hope you are ready to start diving into what I hope will be an informative read. The goal will be to convince you of how all these interconnected parts come together to produce some incredible outcomes - it is testament to how interdisciplinary innovation has the potential to change the way we do things. While this will be fairly technical, I hope to leave you with a lot of food in a similar way to how these topics continue to impact me and my perspective.Anyways, lets get started 🫡.</p><h2 id="h-prologue-the-tragedy-of-the-blockchain-commons" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Prologue: The Tragedy of the Blockchain Commons</h2><blockquote><p><em>“Therein is the tragedy. Each man is locked into a system that compels him to increase his herd without limit – in a world that is limited. Ruin is the destination toward which all men rush, each pursuing his own best interest in a society that believes in the freedom of the commons”</em></p><p><em>— </em><strong><em>Garrett Hardin, The Tragedy of the Commons</em></strong></p></blockquote><p>Ethereum, by nature of its design, is a decentralised economic system. There are strong reasons to emphasise this detail repeatedly because this characteristic of being “decentralised” is only made possible by ensuring the ability to permissionlessly join the network and perform crucial roles that maintain its operation, remains accessible.</p><p>An important requirement for having such a property is to <strong>ensure the resource requirements to perform such duties remains modest and predictable</strong>. Without careful planning that considers this goal, we risk Ethereum losing its valuable properties afforded by decentralisation.</p><p>However at the same time, an economic system must be able to operate efficiently to serve those who participate in it, and must demonstrate elements of sustainability and reliability as a medium of commerce. Given this understanding, <strong>the ideal outcome is that we maintain the decentralised properties of the system (by bounding resource consumption) but try to make use of the available resources as efficiently as possible and maximise </strong><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://en.wikipedia.org/wiki/Economic_surplus"><strong>social surplus</strong></a>. Given the permissionless nature of how Ethereum works, <strong>there are various agents whose strategic behaviour will ultimately influence how well these resources are put to work</strong>.</p><p>Therefore designing and implementing the mechanisms of Ethereum which coordinate how these resources get utilised is of great importance. If the mechanisms in place tasked with doing this are not well designed, we risk Ethereum experiencing a “<strong>tragedy of the commons</strong>” problem.</p><blockquote><p>The <strong>tragedy of the commons</strong> describes a scenario in which access to a common pool of resources (a public good) is not regulated efficiently by a mechanism.</p><p>The consequence of this lack of planning can result in excessive resource consumption, poor incentives to motivate public participation in maintenance or improvement of the system, and encouragement of participation that favours short term gain over long term sustainability (myopic behaviour).</p></blockquote><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/cc55dc166633ac89d426198e6536f3c78f3e9415fd51c2829e9ed1cbc094555a.jpg" alt="Figure 3: Tragedy of the commons - how greed and inferior rules destroy what could be." blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Figure 3: Tragedy of the commons - how greed and inferior rules destroy what could be.</figcaption></figure><p>The “Tragedy of the Commons” risk can be directly applicable to the <strong>resource allocation system</strong> of Ethereum because it demonstrates that if we implement parts of this system poorly, we risk upsetting the incentive balance between various types of participants in the network which can undermine Ethereum’s security, efficiency and accessibility. In addition to this, inadequate pricing of resource usage can contribute to abuse of shared resources.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/8a34220167fa480bf02eee5f53ee406fe3ded000be2899171c6e5a07737e772a.jpg" alt="Figure 4: The resource allocation system comprises of two components that work together to produce emergent behaviour." blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Figure 4: The resource allocation system comprises of two components that work together to produce emergent behaviour.</figcaption></figure><p>For us to prevent the tragedy of the commons, we must design the resource allocation system in such a way that the manner through which resource access is managed in Ethereum is <strong>fair, long-term sustainable</strong>, and <strong>economically productive</strong>.</p><p>To achieve this, we identify some core principles that guide the design and operation of the resource allocation system that seek to prevent the risk of falling into the “tragedy of the commons” problem:</p><ul><li><p><strong>Accurate resource pricing</strong>: Ethereum must have a system that is capable of charging users as close as possible to the social costs associated with their transactions. In order to do so, we must internalise as much of the external costs associated with transactions as possible to ensure that users bear the full cost of the burdens that having their transaction included on Ethereum has on the rest of the network and hence the shared blockchain resources.</p></li><li><p><strong>Economically efficient TFM</strong>: Ethereum’s transaction fee mechanism should drive optimal market outcomes by providing both principals (users) and the assigned agent (block producer) with useful economic signals and tools to express preferences. The TFM should provide transparent and timely information about the current market-clearing price so that users can decisively express bids for their transactions. On the other side, the TFM should be effective at informing the block producer about how best to maximise their revenue when building a block.</p></li><li><p><strong>Incentive-compatible TFM</strong>: Ethereum’s transaction fee mechanism should be incentive-compatible in such a way that principals (users) and the assigned agent (block producer) are incentivised to act honestly and according to the prescribed rules of the mechanism. An incentive-compatible TFM should align the incentives of both users and block producers in such a way that their dominant strategies to strictly increase their respective utilities is to act truthfully with the mechanism, demonstrating a social-welfare maximising equilibrium. This equilibrium reflects an achievement of a socially optimal outcome where no other strategic deviation will strictly benefit either of these participants more than interacting in truthful manner, therefore making the economic system of Ethereum as efficient but fair as possible.</p></li></ul><p>There are, of course, much more considerations that contribute towards the prevention of the tragedy of the commons (e.g. governance mechanisms, scalability solutions, consensus protocol upgrades), but these are somewhat external to the scope of the resource allocation system and what job it has within Ethereum.</p><p>The core principles above therefore describe some of the key goals we wish to satisfy with the design of the components of the resource allocation system. Some of these goals are even dependent on the effectiveness of others, for example, accurate resource pricing guarantees that transactions costs are assigned fairly and reflect the impact they have on the network. The implementation of resource pricing, which aims to capture all dimensions of costs around transaction processing, therefore impacts how well the economic allocation outcomes guided by a transaction fee mechanism actually are. T<strong>his demonstrates how accurate resource pricing is a pre-requisite to ensuring a more economically-efficient and fair transaction fee mechanism</strong>.</p><p>Having described how important these core principles are, we will observe how many of the engineering design decisions within Ethereum reflect this strong desire to be in line with these principles. In a future article, we will also see what future upgrades are actively being researched and proposed to further improve Ethereum’s resource allocation system.</p><h2 id="h-part-1-blockchain-resources" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Part 1: Blockchain Resources</h2><p>In this section, we will familiarise ourselves with the concepts of nodes and what part they play in the blockchain. We do so in order to get a good understanding of what what sort of tasks they actually carry out and the underlying computational resources required to do so. These are important details to understand because they lay the groundwork for later introductions to matters of resource pricing.</p><p>By understanding the tasks that nodes perform and the computational resources they consume in the process, we gain valuable insight into the costs involved in running Ethereum. This knowledge, in turn, helps us comprehend why and how certain decisions around the pricing of these resources are made.</p><h3 id="h-nodes-from-first-principles" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Nodes (from first principles)</h3><p>Lets start off by defining what we mean by the term &quot;node&quot;:</p><blockquote><p>A <strong>node</strong> describes a computer that participates in a blockchain network.</p></blockquote><p>In decentralised blockchains, nodes operate <strong>independently</strong>, maintaining and updating their own current view of the blockchain with help of the protocol specification (being enforced by node software) and P2P network communication. Nodes receive and broadcast messages engaging in “information gossip” upon which the blockchain protocol is capable of making these independent nodes converge on a canonical view of the network.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/52ab294df11093cd466f62ccde61f12a04bc3d288fdd8964d4f1b522eecf9f75.png" alt="Figure 5: Abstract diagram illustrating the network topology for a decentralised blockchain." blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Figure 5: Abstract diagram illustrating the network topology for a decentralised blockchain.</figcaption></figure><p>From this above description, we can describe Ethereum nodes in greater detail.</p><blockquote><p>An <strong>Ethereum node</strong> describes a computer that participates in its blockchain. It runs Ethereum client software which implements the required functionality (which follows the protocol specification) to participate and interact with other reliable nodes in the network.</p></blockquote><p><em>To keep this blog post as simple as possible, we consider an Ethereum node as a combination of its consensus and execution client and will not be referring to these parts individually unless specified.</em></p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/4dd1497e2df24f755776b0a7d300f759ab7ab383801f3fa011f148cb910710ad.png" alt="Figure 6: Some of the functionality provided by an Ethereum node." blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Figure 6: Some of the functionality provided by an Ethereum node.</figcaption></figure><p>An Ethereum node performs various tasks to maintain the operation of the blockchain, including participating in distributed consensus as well as engaging in information gossip, among many other crucial jobs.</p><p>From our earlier description about blockchain nodes, we were made aware that nodes are in fact independent and are responsible for maintaining their own local copy of the blockchain and participating in network communication with other nodes for the discovery of new information. Therefore, Ethereum can be thought of as a decentralised network of its nodes**.**</p><p>Ethereum also possesses the characteristics of being both a permissionless and trustless network. By this we mean:</p><ul><li><p><strong>Permissionless</strong>: Anyone is able to run a node and participate in the network.</p></li><li><p><strong>Trustless</strong>: A consensus protocol ensures all nodes can trustlessly agree on the current the view of the blockchain history, sequence of valid transactions to execute next, as well as the result of such execution. Nodes assert correctness by performing local computation and comparing their results to what was provided over the network (e.g. Merkle root assertions).</p></li></ul><blockquote><p>We will not be going through how the consensus protocol works in Ethereum. All that is relevant to know going forward in this blog post is that it is responsible for ensuring nodes come to agreement about the global ordering of transactions from network inception as well as the result of executing them in that order.</p></blockquote><p>Now that we have covered all the above information around node functionality in Ethereum, we can start to practically think about how resources are expended by nodes.</p><h3 id="h-computational-resources" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Computational Resources</h3><p>A node depends on a variety of hardware resources, including <strong>CPU</strong>, <strong>RAM</strong>, <strong>disk</strong>, and <strong>network bandwidth</strong>, to perform its functions:</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/3ba62e1c4ecbcb5fcc6d48ff8b58cfb079c5c88d6f7fcb40152449d3a30db702.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>These resources are <strong>heterogeneous</strong>, each differing in their characteristics and serving unique roles within the operation of the node at a low-level. They are also <strong>orthogonal</strong> in nature, meaning that changes in one resource do not directly impact the others.</p><p>These resources being heterogeneous in nature basically describes that each of these resources serves a distinct purpose and has its own specific properties and limitations. We can point out these different purposes in very brief manner below:</p><ul><li><p><strong>CPU</strong>: Responsible for processing instructions. Typically measured by percentage of utilisation.</p></li><li><p><strong>RAM</strong>: Stores data that needs to be readily accessible. Typically measured by capacity utilisation (GB).</p></li><li><p><strong>Disk</strong>: Serves as long-term storage. We consider overall capacity utilisation (GB) as well as read/write disk I/O interactions (MB/second).</p></li><li><p><strong>Network bandwidth</strong>: Determines the maximum rate of data transfer that a node can handle. Typically measured by data transfer rates (MB/second).</p></li></ul><p>As mentioned above, we also described these resources as <strong>orthogonal</strong> in nature. This essentially means that the resources are independent of each other and therefore an increase or decrease of one does not directly influence the others. For example:</p><ul><li><p>Increasing RAM does not directly enhance CPU processing power.</p></li><li><p>Expanding disk storage does not directly increase network bandwidth.</p></li></ul><p><strong>This orthogonality allows each resource to be considered and optimised independently</strong>. This detail plays an important role in some future mechanisms that are being proposed around fee markets and resource allocation.</p><h3 id="h-properties-of-computational-resources" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Properties of Computational Resources</h3><p>In understanding the roles and interplay of the various computational resources within an Ethereum node, two critical aspects demand our attention: their finite nature and the varying externalities they impose on the blockchain:</p><ol><li><p><strong>Finite nature of resources</strong>: Each computational resource is intrinsically limited. The capability of a node to process transactions, maintain the state of the blockchain, and communicate with other nodes is bound by these constraints.</p></li><li><p><strong>Varying externalities</strong>: Beyond the intrinsic limitations, the use of these resources also carry different externalities which impact the broader network in particular ways. An example of this is how the growth of blockchain state and history imposes increasing burden on disk space and can lead to greater computational effort being required to access increasingly nested state data that needs to be fetched, modified, or appended to. Another example could be CPU utilisation for transaction processing which, in contrast, poses a more temporary burden.</p></li></ol><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/c58cc90fff273d0f2a66938b17aaf012b62d319fa42e66930cd4b10bbf195e68.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>It is important that we acknowledge that nodes have a finite amount of computational resources because this, in turn, emphasises the importance of efficiently provisioning resources to maintain the network’s functionality and robustness.</p><p>The second property of varying externalities is equally as important. Let us briefly describe what externalities are:</p><blockquote><p><strong>Externalities</strong> describe outcomes that affect parties who did not choose to be involved in a transaction or operation.These outcomes are not accounted for in the cost of the transaction/operation, which means they represent a form of <strong>market failure</strong> (remember this term, it will be an important one in Part 2).</p></blockquote><p>Externalities can be either positive or negative. <strong>Positive externalities</strong> occur when actions have beneficial effects on third parties. You can imagine an example of this being if a transaction leads to increased network security or value for all network participants. <strong>Negative externalities</strong> describe outcomes associated with actions that impose costs on third parties. One of the most popular examples of this in Ethereum is that of transactions contributing to “<strong>state bloat</strong>” which describes an increase to the size of Ethereum’s state of which is a permanent effect. The consequence of this is that it leads to increased costs for all nodes in the network as they are required to maintain copies of state and apply updates to it that modify it further. Another negative externality that is often discussed is that of <strong>increased network congestion</strong> where the high volume of transactions lead to higher fees and therefore slower transaction inclusion for users.</p><p>An understanding of the externalities present in Ethereum is extremely important because it directly informs the design of the resource pricing component of the resource allocation system, a topic we dive into in Part 2 of this article. But before we dive into the mechanics of resource pricing, it is crucial that we shed light on the actual operations that nodes undertake.</p><h3 id="h-expenditure-classes" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Expenditure Classes</h3><p>We are now going to take a closer look at some of the actual tasks/operations performed by nodes. These tasks, each with their own unique resource requirements, form the backbone of Ethereum’s functionality. They can be categorised into three main expenditure classes - <strong>networking costs</strong>, <strong>computation costs</strong>, and <strong>storage costs</strong>.</p><blockquote><p>An <strong>expenditure class</strong> can be described as the categorisation of certain operations or tasks by the type of computational activity they engage in.</p></blockquote><p>Understanding these expenditure classes not only deepens our understanding of a node’s role but also lays the groundwork for the discussions to follow on how these tasks, and their associated costs, influence the way we approach resource pricing.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/03f9bb9fba950a1e7549c8078d52b1642ea14e483c29893f35b4d8598b3da136.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>As previously mentioned, our primary categories of operations/tasks fall into three key expenditure classes. Let’s look at each of these classes to get a better understanding of the specific activities they encompass:</p><p><strong>1) Networking Costs</strong></p><p>These are tasks related to the transmission and reception of data across the network, this includes:</p><ul><li><p><strong>Initial blockchain sync</strong>: This is a once-off cost incurred when a node first joins the Ethereum network. The node is required to download all blocks and transactions from genesis to the current block, which requires significant bandwidth.</p></li><li><p><strong>Download</strong>: Nodes need to continuously download new blocks and transactions from the gossip network to stay in sync with the latest state of Ethereum.</p></li><li><p><strong>Broadcast</strong>: Nodes need to broadcast new transactions and new valid blocks it learns about.</p></li></ul><p><strong>2) Computational Costs</strong></p><p>These are tasks that require computational processing, this includes.</p><ul><li><p><strong>Transaction execution</strong>: This process, in its most basic form, entails updating the account balances during an ETH transfer from one account to another. Beyond this simple case, transaction execution commonly involves interactions with smart contracts (or deployments of them). Such interactions require access to memory and disk (to copy state to the EVM execution context) in preparation of execution. The execution of these smart contract invocation utilises both CPU processing power and RAM.</p></li><li><p><strong>Cryptographic operations</strong>: Task that requires the use of cryptographic operations to perform signature verification or generation of cryptographic hashes.</p></li><li><p><strong>Data serialisation</strong>: Tasks that require the use of encoding/decoding operations like Recursive Length Prefix (RLP) and Simple Serialise (SSZ).</p></li></ul><p><strong>3) Storage Costs</strong></p><p>These are tasks involved with updating storage (history, state), this includes:</p><ul><li><p><strong>Persisting state updates</strong>: After the execution engine of Ethereum (EVM) has executed a block’s transaction, the resulting updated state is written to disk.</p></li><li><p><strong>Block appending</strong>: Task that appends a new block to the blockchain. Whenever a new block is verified and added to the blockchain, it increases the history of the network. Blockchain history is “prunable” because you do not necessarily require parts of it (such as transaction bodies of previous blocks) once you have executed them to reach blockchain sync. Pruning is an important feature that makes the costs of running a full node feasible by reducing storage requirements and discarding of data that is no longer essential to the operation of the node.</p></li></ul><p>Now that we have a better understanding of these expenditure classes and the kind of tasks that are conducted by nodes, it is clear to see how these tasks are diverse in nature and intrinsically connected to different types of computational resources. With the groundwork established, lets dive deeper into these specific tasks associated with each expenditure class and identify the particular computational resources that they consume.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/1f9e8c9ec361f42c176ebf9bf897006151e8ae46c4a649937d8cd8634354c96d.jpg" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>The illustration above shows how we identified the computational resources that are utilised with the tasks belonging to each expenditure class. We can therefore make the following statements regarding the computational resource utilisation of each of these classes.</p><ul><li><p><strong>Networking costs</strong> consumes bandwidth resources.</p></li><li><p><strong>Computational costs</strong> consumes RAM, CPU, disk resources.</p></li><li><p><strong>Storage costs</strong> consumes disk resources.</p></li></ul><p>There are many more tasks that are actually performed by nodes in Ethereum to contribute towards continued operation of the network, however <strong>the tasks mentioned above represent the subset of activities that </strong><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.merriam-webster.com/dictionary/extrinsic"><strong>extrinsically</strong></a><strong> depend on information produced by the resource allocation system</strong>. These tasks represent a collection of deterministic processes (described together as the block processing procedure) which carry out the underlying blockchain execution through which the invocation of these tasks with payloads are guided by the decisions made within the resource allocation system which itself is guided by its goal to adhere to its core principles.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/4d58b976d8dd863e15f9d3bb796b4e7ccc2829554c8630f1e64bd971aceaced7.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>The execution of these tasks therefore describe the realisation of the goals of the resource allocation system by virtue of nodes performing execution based on optimal inputs:</p><ul><li><p><strong>Resource pricing component</strong>: Transactions are thoughtfully assigned computational costs, therefore users pay for the burden they have introduced to nodes to perform the tasks mentioned above.</p></li><li><p><strong>Transaction fee mechanism component</strong>: The transaction fee mechanism ensures that the transactions of a block were chosen in such a way that the execution of the block led to an economically-efficient outcome demonstrating that the utilisation of blockchain resources was done in the most optimal manner. The incentive-compatible properties of the mechanism also help ensure that the execution resulted in a socially-optimal outcome.</p></li></ul><p>This therefore motivates why we have mentioned the various tasks above, these tasks each play a role in a specific procedure that uses the results of the resource allocation system (determination of the contents of a block) to perform execution and updates on Ethereum. The procedure being referred to here is called the <strong>block processing procedure</strong> and is performed by every single node part of the network to update the current view of the blockchain. In the next section we describe the steps taken in the block processing procedure made up of the tasks described above. Thereafter, we will walk through a computational complexity analysis of this procedure, assessing the computational resource requirements and unique resource consumption dynamics of each step involved. <strong>The goal in doing so is to get a good understanding of what factors may influence the implementation of the resource pricing component of the resource allocation system</strong>.</p><h2 id="h-computational-complexity-of-block-processing-procedure" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Computational Complexity of Block Processing Procedure</h2><p>The <strong>block processing procedure</strong> describes a process involving a series of steps in which nodes in Ethereum process computational tasks to update the current view of the blockchain. This procedure is performed when a node receives a block over the network, therefore we can describe the carrying out of this procedure as an activity performed by nodes regularly as part of Ethereum’s operation.</p><blockquote><p>The <strong>block processing procedure</strong> describes a procedure involving the carrying out of multiple steps in order to process a new block shared across the network. If the block is valid, the result is that the node executes the transactions and applies the results to update their current view of the blockchain.</p></blockquote><p>At the end of the previous section we highlighted why the block processing procedure is relevant to the <strong>resource allocation system</strong>, this being that this procedure is extrinsically linked to it due to the fact that a block’s contents are determined by outcomes produced by the features of the system. Given the nature of this relationship, we seek to get a better understanding of how the computational resource demands of the block processing procedure can vary given the contents of a block.</p><p>In preparation of doing this, we will first get familiar with all the steps involved in this procedure which describe the sequence of tasks required to be carried out.</p><p>The block processing procedure starts when a node first receives a block. It then follows the steps below:</p><ol><li><p><strong>Block Format Verification</strong>: This step involves checking that the incoming block adheres to the expected format and meets the necessary field requirements, along with general validity checks (e.g. checking block timestamp is greater than its parent).</p></li><li><p><strong>Transaction List Processing</strong>: During this step, the node fetches the relevant state from disk storage and loads it into memory. Transactions are the executed sequentially corresponding to the order specified by the block. A record of state modifications is kept in memory throughout the process.</p></li><li><p><strong>State Root Validation</strong>: This step involves comparing the computed state root, resulting from the execution of transactions, with the state root specified in the block header. If the state roots do not match, the block is deemed invalid.</p></li><li><p><strong>Local View Update</strong>: This step involves:</p><ol><li><p>Appending the newly verified block to the blockchain.</p></li><li><p>Applying the state changes resulting from the transaction execution to disk.</p></li><li><p>Generating receipts for transactions.</p></li></ol></li><li><p><strong>Block Propagation</strong>: The final step involves broadcasting the newly processed block to other nodes in the network, contributing to the overall synchronisation of the blockchain. The node will then listen for future blocks that other nodes broadcast that build upon its latest view of the blockchain.</p></li></ol><p>Now that we have described the steps of the block processing procedure, let’s look at each of them and identify the expenditure classes they fall under as well as the computational resources that they need for their execution:</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/641fddb5bfc374a67c00011d8e041ceff211c786df0fe9d402060864c3473b18.jpg" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>In the table above, we can observe how the five primary steps of the block processing procedure were listed along with the expenditure class they belong to, and the computational resources they require. We also can observe that step 4 is broken down into three parts - appending block, applying state updates to disk, receipts generation. The reason for doing so is to show that step 4 involves performing certain tasks that fall under different expenditure classes, but together they describe what is required in step 4 to update the blockchain once a block has been deemed valid.</p><p>Having identified the different computational resources required by each of these steps, we have a better understanding of the unique resource requirements corresponding to these steps. While this is certainly useful, we still don’t know how what sort of quantities of resources these steps require nor if there are dynamics at play which affect how much the resource requirements to perform these tasks may grow or whether they remain constant regardless of the block’s contents.</p><p>In order, to understand the resource consumption characteristics of these steps, we need more information. We can gain this desired insight, by means of assessing the computational complexity involved with carrying out each step.</p><p><strong>Computational complexity analysis of the block processing procedure</strong> will help us find out what sort of tasks involved with steps are more resource-intensive than others as well as help us better understand how usage patterns of certain computational resources can contribute towards execution bottlenecks given that these resources have unique properties and limitations.</p><blockquote><p><strong>Computational complexity</strong> describes the quantification, characterisation, and measurement of computational resources required to execute a specific process or task.Analysing computational complexity can help us observe any behavioural phenomena that emerges during the execution of a process, providing useful insights in the form of bottleneck identification, patterns of resource use, and much more.</p></blockquote><p>There are two aspects of computational complexity that will tell us useful things about the resources that each of these steps consume:</p><ul><li><p><strong>Time complexity</strong>: Time required to execute a given task. Time complexity is proportional to the quantity of computational resources consumed by computational processing.</p></li><li><p><strong>Space complexity</strong>: Computer memory required in executing a given task. We typically use space complexity to describe the consumption of memory or disk resources in executing a task.</p></li></ul><p>With these two aspects, we can learn a lot about the resource consumption characteristics of each step in the procedure. The table below describes the time and space complexity associated with each step:</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/3ef40b8f4266758989c5fa531db45cd4a9a2dfe1b0bcbd8f7e643dac17eb2028.jpg" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>With regards to the table results above, you don’t have to necessarily understand how we arrived at the specific complexity figures. Instead, consider them as broadly accepted assumptions that describe the resource consumption characteristics of each step.</p><h3 id="h-what-does-the-computational-complexity-analysis-reveal" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">What does the computational complexity analysis reveal?</h3><p>The computational complexity analysis shows us that there are a combination of fixed and variable costs involved with the block processing procedure. Let us define what we mean by both fixed and variable costs below:</p><blockquote><p><strong>Fixed costs</strong> describe costs that do not change in relation to the volume of activity within a system. These costs are remain constant regardless of how the input to a process varies.</p></blockquote><blockquote><p><strong>Variable costs</strong> describe costs that fluctuate based on the level of activity within a system. These costs typically change depending on the size, complexity, or quantity of inputs provided to a process.</p></blockquote><p>These definitions help us understand what we mean by these two types of costs. Let us get a bit of a more intuitive understand of what it means for either of the two aspects of computational complexity to have these costs.</p><p><strong>Time complexity</strong>:</p><ul><li><p><strong>Fixed costs</strong>: The amount of computational steps required in processing remains constant.</p></li><li><p><strong>Variable costs</strong>: The amount of computational steps can grow depending on the contents of information fed into the process.</p></li></ul><p><strong>Space complexity</strong>:</p><ul><li><p><strong>Fixed costs</strong>: The amount of memory or disk space required in computation remains constant.</p></li><li><p><strong>Variable costs</strong>: The amount of memory or disk space required in computation can grow depending on the contents of information fed into the process.</p></li></ul><p>Now that we have explained what fixed and variable costs mean for both time and space complexity, let us walk through the block processing procedure step-by-step and explain the nature of computational complexity brought about by the execution of the various tasks involved:</p><h4 id="h-1-block-format-verification" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">1) Block Format Verification</h4><p>This step has a time complexity of O(1) and a space complexity of O(1).</p><ul><li><p>This operation has only <strong>a fixed cost</strong>.</p></li><li><p>The resources consumed during this step remains constant, irrespective of the contents of a block.</p></li></ul><h4 id="h-2-transaction-list-processing" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">2) Transaction List Processing</h4><p>This step has a time complexity of O(n) and a space complexity of O(n*m).</p><ul><li><p>This operation has <strong>variable costs</strong>.</p></li><li><p>As the number of transactions (n) increase, so too does the amount of required computational processing steps.</p></li><li><p>As the number of transactions (n) and the number of unique account storage entries (m) increase, so too does the amount of required memory and disk computational resources.</p></li></ul><h4 id="h-3-state-root-validation" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">3) State Root Validation</h4><p>This step has a time complexity of O(1) and a space complexity of O(1).</p><ul><li><p>This operation has only <strong>a fixed cost</strong>.</p></li><li><p>The resources consumed during this step remains constant, irrespective of the contents of a block.</p></li></ul><h4 id="h-4a-local-view-update-appending-block" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">4a) Local View Update: Appending Block</h4><p>This step has a time complexity of O(1) and a space complexity of O(1).</p><ul><li><p>This operation has <strong>fixed costs</strong>.</p></li><li><p>The resources required to append a new block to the blockchain remain constant.</p></li></ul><h4 id="h-4b-local-view-update-applying-state-updates-to-disk" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">4b) Local View Update: Applying State Updates to Disk</h4><p>This step has a time complexity of O(m) and a space complexity of O(m).</p><ul><li><p>This operation has <strong>variable costs</strong>.</p></li><li><p>As the number of state changes accrued during transaction execution increase, so too does the amount of computational steps and memory/disk space resources required to service the state update.</p></li></ul><h4 id="h-4c-local-view-update-receipts-generation" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">4c) Local View Update: Receipts Generation</h4><p>This step has a time complexity of O(n) and a space complexity O(n).</p><ul><li><p>This operation has <strong>variable costs</strong>.</p></li><li><p>Each executed transaction has a receipt generated alongside it which includes useful information such as log events and filters.</p></li><li><p>As the number of transactions (n) in a block increase, so too does the amount of required computational processing steps.</p></li><li><p>As the number of transactions (n) in a block increase, so too does the amount of required memory/disk resources to generate and store the receipts in Ethereum’s receipts trie.</p></li></ul><h4 id="h-5-block-propagation" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">5) Block Propagation</h4><p>This step has a time complexity of O(p) and a space complexity of O(1).</p><ul><li><p>This operation has both a <strong>fixed and variable costs</strong>.</p></li><li><p>The required computational processing steps increases with the number of connected peers a node has (p).</p></li><li><p>The required memory/disk resources remains constant because broadcasting a block does not require additional space per peer.</p></li></ul><p>We have once again walked through the block processing procedure, but this time we did so in order to understand the computational complexity involved with carrying out each step. In doing so, this revealed to us that there are several fixed and variable costs that describe the manner in which various computational resources are consumed in each step, highlighting that some tasks require different resource types and varying quantities to fulfil their computational objectives.</p><p>In the next section, we will use all our findings related to the block processing procedure to motivate a need to constrain the resource consumption involved in this procedure. In doing so, we will also get an understanding of why this is important to do for a decentralised system like Ethereum.</p><h2 id="h-constraining-resource-consumption" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Constraining Resource Consumption</h2><p>In the previous section we found out that there are several fixed and variable costs involved in the block processing procedure. We summarise our findings in the table below:</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/540aa47fc750dc0c224b74f63c9cf4450ef1e72140a875c5bf5744a93e0a6eb2.jpg" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>Our analysis shows us that there are several variable costs that exist within the block processing procedure. These identified variable costs are explicitly pointed out below:</p><h4 id="h-transaction-list-processing" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0"><strong>Transaction List Processing</strong>:</h4><ul><li><p><strong>Variable Cost</strong>: Computational processing steps required increases as the number of transactions increase.</p></li><li><p><strong>Variable Cost</strong>: Memory/disk resources required increases as the number of transactions and unique accounts involved in transactions increase.</p></li></ul><h4 id="h-applying-state-updates-to-disk" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0"><strong>Applying State Updates to Disk</strong>:</h4><ul><li><p><strong>Variable Cost</strong>: Computational processing steps required increases as the number of required account state changes increase.</p></li><li><p><strong>Variable Cost</strong>: Memory/disk resources required increases as the number of required account state changes increase.</p></li></ul><h4 id="h-receipts-generation" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0"><strong>Receipts Generation</strong>:</h4><ul><li><p><strong>Variable Cost</strong>: Computational processing steps required increases as the number of transactions increase.</p></li><li><p><strong>Variable Cost</strong>: Memory/disk resources required increases as the number of transactions increase.</p></li></ul><h4 id="h-block-propagation" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0"><strong>Block Propagation</strong>:</h4><ul><li><p><strong>Variable Cost</strong>: Computational processing steps required increases as the number of connected peers a node has increase.</p></li></ul><p>Looking at the variable costs described above, we notice a common source that drives most of these costs, this being the amount of transactions involved as well as the complexity of the interactions described by them. Given this understanding, we can reason that <strong>if we do not limit the resource consumption involved with processing a list of transactions that these costs could continue to increase significantly</strong>. We can also observe that a variable cost exists in the block propagation step, however this variable cost is not relevant because the number of connected peers is not part of the protocol specification and is left up to the agency of the participant running the node, we can therefore consider this variable cost as negligible.</p><h3 id="h-consequence-of-unconstrained-resource-consumption" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Consequence of Unconstrained Resource Consumption</h3><p>In earlier sections we introduced the key properties of computational resources, one of which was being <strong>finite in nature</strong>:</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/29a0043cfc8aa0ef005cc5d87898e878d216fd717bcf8179137bf6f0a46d23ac.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>In a decentralised system like Ethereum, it is vital that we keep the resource requirement to run nodes reasonably low and accessible. Given that we identified how transactions have a significant influence on how costly the resource consumption of the block processing procedure is, we can reason that it may be one of the greatest variable factors that determine how demanding the resource requirements to run a node are.</p><p>Therefore if we do not impose reasonable limitations on the amount of computational resources that can be expended in executing transactions and updating the blockchain accordingly, we risk many nodes part of the decentralised set running into problem like <strong>resource exhaustion</strong> due to their modest capacities of computational resources.</p><blockquote><p><strong>Resource exhaustion</strong> describes a scenario in which all available resources of a node have been fully consumed and are now depleted, resulting in the node no longer being able to function efficiently or at all.This can happen due to hardware limitations, badly-optimised software, or network-related factors.</p></blockquote><p>Given that a diverse set of nodes is crucial for ensuring changes to the blockchain are trustlessly computed and verified and are thus vital to serving the network, the implication of not constraining resources will likely result in many nodes experiencing resource exhaustion and therefore dropping out the network. Participants with modest computer systems will therefore no longer be able to participate in the network by running nodes, leaving the duty of trustlessly computing the changing state of the blockchain in the hands of participants in the form of a small minority of sophisticated actors with high-performance computer systems.</p><p>In this scenario we undermine the permissionless property of being able to participate in Ethereum and trustlessly compute the state of the blockchain, and the consequence of this is that users who interact with Ethereum by sending transactions have no other option but to trust this minority set of sophisticated actors to honestly receive and broadcast their transactions as well as report the state of the blockchain. While Ethereum still possesses the characteristics of being trustless, the barrier to entry to run a full node means this is only possible given you have extraordinary computational resources at your disposal. Given this high barrier to entry, Ethereum still technically remains permissionless and trustless, but these properties are significantly undermined - <strong>the penultimate consequence of this is that decentralisation of the entire system is undermined</strong>.</p><h3 id="h-protecting-permissionless-and-trustless-properties" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Protecting Permissionless and Trustless Properties</h3><p>By now it is quite clear how severe the consequences of not constraining resource consumption of key activities like the block processing procedure can be for Ethereum. We put the diverse set of nodes at risk of running into problems like resource exhaustion, thus undermining who gets to trustlessly compute the current state of the blockchain and interact directly with it. If we do not address this resource exhaustion concern, we essentially render running a node on modest, consumer-grade hardware unmanageable. We thus regard the failure to constrain resource usage as making the ability to run a node severely unaccessible to the average person.</p><p>From all of the reasoning above, you will now understand by bounding resource consumption of critical blockchain tasks like the block processing procedure is vital to maintaining the decentralisation of Ethereum. We seek to preserve the strong guarantees of permissionless and trustless properties that have always been core principles of the network:</p><ul><li><p><strong>Permissionless</strong>: By keeping the resource requirements sufficiently modest, it remains possible for a broad range of participants with varying levels of computational resources at their disposal to run a node and interact with the network without an intermediary.</p></li><li><p><strong>Trustless</strong>: By keeping the resource requirements sufficiently modest, we ensure that running a node is accessible therefore allowing participants to trustlessly compute the current state of the blockchain without the need an intermediary.</p></li></ul><p>Keeping the costs associated with running an Ethereum node is a crucial requirement for maintaining a resilient, censorship-resistant, decentralised network. If we cannot maintain a sufficiently decentralised network, we lose all the valuable properties of a blockchain that justifies its value proposition.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/5e8a4b079b8ab57e7ad5547d8eeabe5f85b024a25eb0373331599f6db1f81124.jpg" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>Its worth mentioning that while constraining resource consumption is important in preserving the decentralisation properties of Ethereum, it is only one of many factors that influence this property. There are various other concerns such as the barrier to entry to become a block producer and more that play an important role, but such matters are out of the scope of this article.</p><h3 id="h-practical-solutions-to-constrain-resource-consumption" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Practical Solutions to Constrain Resource Consumption</h3><p>In order to address the risks posed by resource exhaustion, <strong>we thoughtfully place constraints on the maximum amount of computational resources that are allowed to be expended while processing a block of transactions</strong>. You can thus imagine this taking the form of some sort of computational resource provisioning, in which the impact of transaction set execution can be measured and thus have a cumulative amount of resource usage that must fall within some maximum limit specified by Ethereum through the protocol specification:</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/1eadef9aac1d6db2d0f71f4b4353c8138e138464b4cd933c0e96896fb9e138fb.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>We mentioned earlier on in this section that the amount of variable costs involved with carrying out the block processing procedure depends on the amount of computational resources utilised while executing the transactions of a block and updating the blockchain accordingly. While the amount of transactions present in a block did demonstrate that if you increase the amount, so too does the resource costs of the entire procedure; but we also found out that the complexity of transactions is a decisive factor as well. So with this information, <strong>what sort of solutions can we propose that both sets a maximum limit on resource consumption and is able to meter resource consumption?</strong></p><h4 id="h-solution-1-set-maximum-limit-of-transactions-allowed-in-a-block" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">Solution 1: Set maximum limit of transactions allowed in a block?</h4><p>What if we decided to constrain the resource consumption of the block processing procedure by setting a hard limit on the amount of transactions that are allowed within a single block?</p><p>From a naive point of view, this would indeed set some constraint on resource consumption if we imagined all the transactions involved executed in timely manner. However, setting such a limit would likely encourage users to send more complex transactions ,which are very resource-intensive, to make the most of the opportunity of getting their transaction included in a block. This demonstrates one example of how such a design decision could lead to resource abuse by users. Unfortunately, this isn’t even the biggest problem, it only gets worse from here.</p><p><strong>While the above shows that this method is inefficient, the following point of failure we are about to describe shows that Ethereum would simply stop working</strong>. Because the EVM (Ethereum’s execution environment) is capable of performing generalised computation, we can describe it as having the characteristic of being <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://en.wikipedia.org/wiki/Turing_completeness"><strong>Turing-complete</strong></a>. The implications of this are that transactions are capable of triggering very complex execution and can potentially cause infinite loops. Therefore if Ethereum were to limit resource consumption by means of restricting the number of transactions allowed within a block, any one of these transactions could potentially exhaust a node’s computational resources thus demonstrating <strong>a resource exhaustion vector</strong>. Given the undecidable nature of the **<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://en.wikipedia.org/wiki/Halting_problem">halting problem</a> **and the EVM being Turing-complete, it would be impossible for Ethereum to determine whether such invocation of transaction execution would ever terminate. <strong>This therefore demonstrates why attempting to constrain the resource consumption of the block processing procedure by means of restricting the number of transactions will not work</strong>.</p><p>This clearly is not a viable option for managing resource consumption. Given the nature of how Ethereum’s execution model works and what sort of generalised computation that transactions may invoke. We need a more nuanced solution that more closely meters the computational burdens imposed by transaction execution.</p><h4 id="h-practical-solution-measurement-system-of-transaction-execution-work" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">Practical Solution: Measurement System of Transaction Execution Work</h4><p>By nature of design, Ethereum is a programmable blockchain. It has features that support the deployment of smart contracts, which enable participants to deploy executable programs on the blockchain. As with many computer programs, these contracts typically contain callable functions through which transactions on Ethereum are capable of calling them with or without external arguments depending on the function description. This functionality demonstrates the wide variety of blockchain execution that can be performed on Ethereum. Given this context, we can understand that transaction execution could demand resources ranging from minimal to theoretically infinite amount given the Turing-complete properties of the EVM.</p><p>Having a better understanding of the environment and dynamics at play, <strong>we need a more precise method that considers the complexity of transaction execution in order to produce a solution that can effectively constrain the resource consumption involved with the block processing procedure</strong>.</p><p>Ethereum therefore introduced the <strong>gas model</strong> to help achieve this goal.</p><blockquote><p>The <strong>gas model</strong> is a solution designed to constrain resource consumption during the block processing procedure. It introduces a measure called &quot;<strong>gas</strong>&quot; which assigns computational costs to every operation in the EVM. It is with this same measure that the maximum limit of a block is expressed.</p></blockquote><p>The measure of gas is introduced to Ethereum and is used to measure the computational effort involved with executing transactions and updating the blockchain. Ethereum establishes this unit of measure to assign costs to primitive computational operations used by the EVM, effectively <strong>enabling nodes to meter the computational effort involved with executing the transaction</strong>. Because the EVM is a stack based machine, the method of metering computational steps is fairly trivial and requires summing up the total amount of computational work described by the execution trace of the transaction. <strong>Ethereum therefore sets a max amount of computational effort (described as a max quantity of gas) that a block is allowed to use</strong>, therefore if the execution of transactions in a block exceed this amount - the block will be deemed invalid.</p><p>The diagram below illustrates the intuition around the use of the gas model to constrain and meter the resource consumption caused by transaction execution:</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/7a7da5629621ec4bc27ef298ec6577a2b57e16a6760fc50825a734d858eef755.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>While the gas model does not explicitly constrain every aspect of the block processing procedure, <strong>it has helped us bound the main cause of the variable cost</strong> which we identified as being caused by transaction processing-related tasks. We can therefore think of the finite amount of gas allowed to be used in a block as <strong>achieving the same effect as constraining the heterogenous computational resources of a node</strong>, thus the introduction and use of the new measurement system has helped us tangibly achieve a desired goal:</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/65a42b5b8c32f444bffa593b1978ca22c484939adbf055cda445f70e7cf7ea31.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>In summary, the gas model can be considered Ethereum’s solution to bounding the resource consumption imposed by the block processing procedure. Given this procedure is carried out by all Ethereum nodes in the network <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.paradigm.xyz/2023/04/mev-boost-ethereum-consensus">every 12 seconds</a>, the importance of trying to keep the resource footprint of this procedure sufficiently modest in terms of computational resource requirements cannot be emphasised enough.</p><p>We are not yet familiar with how exactly the gas model is implemented nor what challenges are faced in implementing such a system utilising this, <strong>but we will find out soon enough how the resource pricing component of the resource allocation system explicitly deals with this</strong>.</p><h2 id="h-reflections-leading-into-part-2" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Reflections Leading into Part 2</h2><p>It was important that we went through Part 1 in this article to get a strong understanding of the underlying computational resources that drive Ethereum’s operation.</p><p>In doing so we were introduced to a crucial activity carried out by all nodes on the network, this being the <strong>block processing procedure</strong>. As mentioned earlier, this activity essentially describes the execution of upon information provided by the <strong>resource allocation system</strong>, of which we have yet to even start exploring!</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/4d58b976d8dd863e15f9d3bb796b4e7ccc2829554c8630f1e64bd971aceaced7.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>By walking through the block processing procedure and getting a good understanding of the resource consumption dynamics, <strong>we discovered that the execution of transactions are a significant variable cost in this activity</strong>. Given the goals around preserving the permissionless and trustless properties of Ethereum that contribute to the emergent decentralisation characteristic of the network, we understood the importance of targeting the bottlenecks around transaction execution and therefore providing a reasonable solution to enforcing constraints on the amount of execution that can be done in each block.</p><p>In the upcoming Part 2 of this article series, we will explore how the <strong>resource pricing component</strong> of the resource allocation system makes use of the introduced gas model to assign costs to transaction execution steps as well as showing how execution is metered. We will also understand the factors that influence the design of the gas system of measure.</p><p>With the foundations of our computational resource deep-dive along with our upcoming exploration of the resource pricing component, <strong>we will therefore have a strong understanding of the entire block processing procedure by the end of Part 2</strong>. Thereafter, Part 3 will show how transaction fee mechanisms deal with the principal-agent problem at hand and drive the creation of welfare-maximising block payloads which get executed in the block processing procedure.</p><p>So what all that out of the way, lets get started on Part 2: Resource Pricing (soon™️) 🫡.</p>]]></content:encoded>
            <author>mark-odayan@newsletter.paragraph.com (Mark Odayan)</author>
        </item>
    </channel>
</rss>