Skip to content

Instantly share code, notes, and snippets.

@DonGuillotine
Created August 6, 2024 00:58
Show Gist options
  • Save DonGuillotine/94e58315874515c1ff249dbf2df0070c to your computer and use it in GitHub Desktop.
Save DonGuillotine/94e58315874515c1ff249dbf2df0070c to your computer and use it in GitHub Desktop.
Ethereum 101
<title>Ethereum 101</title>

What is Ethereum?

  1. World Computer:
    • Ethereum is often called the “world computer.” This means it’s a huge network of computers working together around the world.

Computer Science Perspective:

  1. Deterministic but Practically Unbounded State Machine:

    • Deterministic: It follows a set of rules to always produce the same output from the same input.
    • Practically Unbounded: It can handle a wide range of tasks and data.
    • State Machine: It keeps track of different states or conditions of the system. Think of it as a giant ledger that records every transaction or change.
  2. Globally Accessible Singleton State:

    • Globally Accessible: Anyone, anywhere can access it.
    • Singleton State: There’s only one version of the state (the ledger) that everyone agrees on.
  3. Virtual Machine:

    • A virtual computer within the network that processes and executes changes to the state.

Practical Perspective:

  1. Open Source and Decentralized:

    • Open Source: Anyone can look at the code and contribute to it.
    • Decentralized: It’s not controlled by any single entity; it’s spread out over many computers globally.
  2. Smart Contracts:

    • Programs that run on Ethereum. These are like regular contracts but digital and automatically enforceable.
  3. Blockchain:

    • A technology that records and synchronizes changes across the network. It’s like a secure, public ledger.
  4. Ether:

    • The cryptocurrency used on Ethereum. It’s like digital fuel to run programs and transactions on the network.

Benefits of Ethereum:

  1. Decentralized Applications:

    • Developers can build applications that don’t rely on a central server. These apps are more resilient and harder to censor.
  2. Built-in Economic Functions:

    • The platform has financial features integrated, which can be used for various purposes like transferring money or creating financial contracts.
  3. High Availability, Auditability, Transparency, and Neutrality:

    • High Availability: Always accessible.
    • Auditability: Easy to check and verify what has happened.
    • Transparency: Everyone can see what’s going on.
    • Neutrality: No one can unfairly influence the system.
  4. Reduces Censorship and Counterparty Risks:

    • Harder for authorities or companies to censor or shut down applications.
    • Reduces risks of one party not fulfilling their side of a contract since smart contracts are automatically enforced.

In essence, Ethereum is a powerful global network that allows for the creation and execution of decentralized applications using smart contracts, with built-in economic incentives and robust security and transparency features.

Compared to Bitcoin

  1. Similarities with Bitcoin:

    • Peer-to-Peer Network: Both Ethereum and Bitcoin connect participants directly without intermediaries.
    • Consensus Algorithm: Both use a method to agree on the state of the network, specifically a proof-of-work system. This makes the network fault-tolerant (Byzantine fault-tolerant), meaning it can continue to operate correctly even if some participants are corrupt or malfunctioning.
    • Cryptographic Primitives: Both use digital signatures and hashes to ensure security and integrity.
    • Digital Currency: Both have a digital currency (Bitcoin for Bitcoin, ether for Ethereum).
  2. Key Differences:

    • Purpose:

      • Bitcoin: Primarily designed to be a digital currency payment network. It’s mainly used for transferring money.
      • Ethereum: Not just a digital currency. Its main goal is to be a “world computer,” enabling developers to build and run decentralized applications.
    • Digital Currency (Ether):

      • Ether: Used to pay for using the Ethereum platform. It’s like a utility currency or fuel for running programs and smart contracts on Ethereum.
    • Programming Capability:

      • Bitcoin: Has a very limited scripting language. It’s designed to handle simple transactions and conditions, like whether a transaction is valid or not.
      • Ethereum: Designed to be a general-purpose programmable blockchain. It runs a virtual machine that can execute complex code. This makes it much more versatile and capable of running a wide range of applications.
  3. Scripting Language:

    • Bitcoin’s Script: Limited to simple true/false evaluations, which restricts what it can do.
    • Ethereum’s Language: Turing complete, meaning it can perform any computation that can be done by a computer. This allows Ethereum to handle complex operations and run sophisticated programs.

Summary

  • Bitcoin is mainly a digital currency with a limited scripting language for simple transactions.
  • Ethereum is a general-purpose platform with its own currency (ether) used to power decentralized applications. It has a powerful programming capability, allowing it to run complex code and function as a global decentralized computer.

In essence, while both Ethereum and Bitcoin share some foundational technologies and principles, Ethereum offers much broader capabilities for creating and running applications beyond just digital currency transactions.

Components of a Blockchain

  1. Peer-to-Peer (P2P) Network:

    • What it is: A network where participants (nodes) connect directly to each other without a central server.
    • Function: Nodes share and propagate transactions and blocks (collections of transactions) using a “gossip” protocol, meaning each node passes information to its neighbors, and they pass it to their neighbors, and so on.
  2. Messages (Transactions):

    • What they are: Messages that represent changes or updates (state transitions) to the blockchain.
    • Function: They describe actions like sending cryptocurrency or executing a smart contract.
  3. Consensus Rules:

    • What they are: A set of rules that define what makes a transaction valid and how state transitions should occur.
    • Function: Ensures everyone agrees on what the blockchain should look like and maintains the integrity of the system.
  4. State Machine:

    • What it is: A system that processes transactions according to the consensus rules.
    • Function: Keeps track of the current state of the blockchain (e.g., account balances, smart contract states).
  5. Chain of Blocks:

    • What it is: A sequence of cryptographically secured blocks, each containing a list of verified transactions.
    • Function: Acts as a public ledger or journal of all transactions and state transitions, ensuring transparency and security.
  6. Consensus Algorithm:

    • What it is: A method to achieve agreement among distributed nodes on the blockchain’s state.
    • Function: Decentralizes control and ensures that all participants enforce the same set of rules. Examples include proof-of-work (PoW) and proof-of-stake (PoS).
  7. Incentivization Scheme:

    • What it is: Economic incentives like block rewards or transaction fees.
    • Function: Encourages participants to maintain the network, secure it, and follow the rules. For instance, miners in a PoW system get rewards for validating transactions and creating new blocks.
  8. Software Implementations (Clients):

    • What they are: Open-source software that combines all the above components.
    • Function: Allows users to interact with the blockchain. For example, Bitcoin uses the Bitcoin Core client, and Ethereum has multiple clients built according to a reference specification described in the Yellow Paper.

Key Points

  • Blockchain: Originally referred to the entire system combining all these components.
  • Diverse Blockchains: Today, there are many types of blockchains with different properties, so the term “blockchain” alone is not specific enough.
  • Qualifiers Needed: To understand a blockchain fully, ask questions about its components and characteristics, such as whether it is open, public, decentralized, and censorship-resistant.

Summary

A blockchain is a complex system made up of several key components that work together to create a secure, decentralized, and transparent network. Each component plays a specific role, from processing transactions to ensuring network consensus and providing economic incentives. Understanding these components helps clarify what makes a blockchain function and what differentiates various blockchain systems.

The Birth of Ethereum

  1. Problem with Bitcoin:

    • Bitcoin was powerful but limited to basic cryptocurrency transactions.
    • Developers faced a choice: build on top of Bitcoin with its limitations or create a new blockchain from scratch.
  2. Vitalik Buterin’s Vision:

    • In late 2013, Vitalik Buterin, a young programmer and Bitcoin enthusiast, wanted to extend Bitcoin’s capabilities.
    • He explored making Bitcoin’s scripting more flexible, but the existing systems couldn’t accommodate his ideas.
  3. The Whitepaper:

    • In December 2013, Vitalik shared a whitepaper outlining Ethereum: a new, flexible blockchain with a Turing-complete programming language (meaning it could perform any computation).
    • This idea allowed for general-purpose smart contracts, enabling a wide variety of applications.
  4. Early Feedback and Support:

    • Vitalik received feedback from several people, including Andreas M. Antonopoulos and Dr. Gavin Wood.
    • Andreas asked many questions and followed the project’s progress but did not get directly involved initially.
    • Gavin Wood offered his programming skills and became Ethereum’s cofounder, codesigner, and CTO.
  5. Developing Ethereum:

    • Vitalik and Gavin worked together to refine and build the Ethereum protocol.
    • Their goal was to create a blockchain that could support various applications without needing to build the foundational elements from scratch.
  6. Launch of Ethereum:

    • After years of work, the first Ethereum block was mined on July 30, 2015.
    • This marked the beginning of Ethereum as “the world’s computer,” providing a platform for decentralized applications.

Summary

  • Bitcoin’s Limitations: Bitcoin was great for cryptocurrency but too limited for broader applications.
  • Vitalik Buterin’s Idea: Vitalik proposed a more flexible blockchain, Ethereum, that could handle complex programs (smart contracts).
  • Collaboration: Vitalik got feedback and help from experts like Gavin Wood, who became a key figure in developing Ethereum.
  • Ethereum’s Goal: To be a general-purpose blockchain that developers could use to build decentralized applications without dealing with the complexities of blockchain infrastructure.
  • Launch: Ethereum officially started in July 2015, enabling a new era of decentralized applications.

In essence, Ethereum was created to overcome the limitations of Bitcoin by providing a flexible and powerful platform for decentralized applications, thanks to the vision and collaboration of its founders.

Ethereum: A General-Purpose Blockchain

  1. Bitcoin’s Blockchain:

    • Function: Tracks ownership of Bitcoin.
    • How it works: Think of Bitcoin as a system that records who owns which bitcoins. Transactions change this ownership, and everyone eventually agrees on these changes through a process called consensus (after several blocks are mined).
  2. Ethereum’s Blockchain:

    • More Than Currency: Tracks not just currency ownership but any kind of data.
    • General-Purpose Data Store: Ethereum can store any data in a format called key–value tuples (like a dictionary in programming). For example, the key could be “Book Title” and the value could be “Mastering Ethereum.”
  3. Memory and State Changes:

    • Like a Computer’s RAM: Ethereum’s memory stores both code and data.
    • Tracks Changes Over Time: The Ethereum blockchain keeps a record of how this memory changes over time.
  4. Running Code:

    • Stored-Program Computer: Ethereum can load and run code (smart contracts) and store the results in its blockchain.
    • Governed by Consensus: Unlike regular computers, changes in Ethereum’s state are agreed upon by all participants through consensus rules.
    • Globally Distributed: The state (memory and data) is shared and maintained by a network of computers around the world.
  5. The Big Idea:

    • World-Wide Computer: Ethereum answers the question, “What if we could track any type of data and program the system to function like a global computer, where everyone agrees on the changes?”

Summary

  • Bitcoin: Tracks and updates who owns bitcoins.
  • Ethereum: Tracks and updates any kind of data, making it much more flexible.
  • Data Store: Stores information in key–value pairs, like a computer’s RAM.
  • Smart Contracts: Can load and run code that changes the data, with all changes being recorded on the blockchain.
  • Consensus: Ensures that all participants agree on the state of the data.
  • Global Network: The data and state are maintained by a distributed network of computers worldwide.

In essence, Ethereum is like a global computer that can store and run any program, with all participants agreeing on the changes, making it a powerful platform for a wide range of decentralized applications.

Ethereum’s Components

  1. P2P Network:

    • What it is: Ethereum runs on a network of computers connected to each other (peer-to-peer or P2P).
    • Details: The main network uses a specific protocol (ÐΞVp2p) and communicates over TCP port 30303.
  2. Consensus Rules:

    • What it is: The rules everyone follows to agree on the state of the blockchain.
    • Details: Defined in a document called the Yellow Paper.
  3. Transactions:

    • What they are: Messages sent over the network that include a sender, a recipient, a value (amount of ether), and sometimes additional data.
  4. State Machine:

    • What it is: A system that processes changes to the blockchain’s state.
    • Details: Ethereum uses the Ethereum Virtual Machine (EVM) to execute instructions (bytecode). Programs for the EVM, called smart contracts, are written in languages like Solidity and then compiled into bytecode.
  5. Data Structures:

    • What it is: How Ethereum stores information.
    • Details: Each node (computer) stores the blockchain’s state in a local database (usually Google’s LevelDB). The data is organized in a structure called a Merkle Patricia Tree, which helps ensure data integrity and quick retrieval.
  6. Consensus Algorithm:

    • What it is: The method used to agree on the state of the blockchain.
    • Details: Currently, Ethereum uses a system similar to Bitcoin’s called Nakamoto Consensus, which relies on Proof of Work (PoW). However, Ethereum plans to switch to a Proof of Stake (PoS) system, known as Casper, in the future.
  7. Economic Security:

    • What it is: The mechanism that secures the network by making it costly to attack.
    • Details: Ethereum currently uses a PoW algorithm called Ethash, but will eventually transition to PoS.
  8. Clients:

    • What they are: Software that connects to the Ethereum network.
    • Details: The most prominent Ethereum clients are Go-Ethereum (Geth) and Parity. These clients are different implementations of the same protocol and can work together.

Summary

  • P2P Network: Ethereum runs on a global network of connected computers.
  • Consensus Rules: Defined by the Yellow Paper, ensure everyone agrees on the blockchain’s state.
  • Transactions: Messages with details of who sends what to whom, and sometimes additional data.
  • State Machine: Uses the EVM to process changes, running smart contracts written in high-level languages like Solidity.
  • Data Structures: Stores information locally on each node using a database and a special tree structure.
  • Consensus Algorithm: Currently uses PoW (Ethash), but plans to move to PoS (Casper).
  • Economic Security: Ensures network security through costly-to-produce proof mechanisms.
  • Clients: Software like Geth and Parity that connects to the network and ensures interoperability.

In essence, Ethereum is a robust system composed of various elements that work together to maintain a decentralized and secure platform for running applications and executing transactions.

Ethereum and Turing Completeness

  • Alan Turing: He was a mathematician who is considered the father of computer science.
  • Turing Machine: Turing created a theoretical model of a computer that can read and write symbols on an infinite strip of tape. This model can solve mathematical problems by manipulating symbols.
  • Turing Completeness: A system is Turing complete if it can simulate a Turing machine. In simple terms, it means the system can run any computation or algorithm, given enough time and memory.

Ethereum and Turing Completeness

  • Ethereum vs. Bitcoin: Unlike Bitcoin, which is not Turing complete, Ethereum is Turing complete. This means Ethereum can execute complex programs, not just simple transactions.
  • Ethereum Virtual Machine (EVM): Ethereum’s state machine, called the EVM, can execute stored programs. It reads and writes data to memory, just like Turing’s theoretical computer.
  • Universal Turing Machine (UTM): Because Ethereum can simulate any Turing machine, it is considered a UTM. This means Ethereum can perform any computation that any computer can, within the limits of its memory.

Ethereum’s Innovation

  • General-purpose Computing: Ethereum combines the ability to run any program (general-purpose computing) with the decentralized and secure nature of a blockchain.
  • Distributed World Computer: Ethereum programs run on many computers (nodes) around the world, but they all produce a consistent and common state, secured by consensus rules. This creates what some call a “world computer.”

Summary

Ethereum’s Turing completeness means it can run any program, making it much more flexible than Bitcoin. The EVM allows for complex computations, and the combination of this capability with a decentralized blockchain creates a powerful, secure, and distributed platform for running applications.

Turing Completeness as a “Feature” | Turing Completeness: Easy but Risky

  • Easy to Achieve: Making a system Turing complete is quite easy. Even simple systems can be Turing complete, meaning they can run any program. Some systems even become Turing complete by accident.
  • Example: The simplest known Turing-complete machine only needs 4 states and 6 symbols, with just 22 instructions.

Risks of Turing Completeness

  • Dangerous in Open Systems: While Turing completeness allows for great flexibility, it also introduces risks, especially in systems open to the public, like blockchains.
  • The Halting Problem: As mentioned earlier, the halting problem means we can’t always predict if a program will stop running. This can cause issues in Turing-complete systems.

Real-world Example: Printers

  • Printers: Modern printers are Turing complete, meaning they can be given a task (like a file to print) that makes them freeze. You can fix a frozen printer by turning it off and on again.
  • Public Blockchains: Unlike printers, public blockchains can’t be easily restarted if something goes wrong. If a program causes Ethereum to become unresponsive, fixing it is much more complex.

Summary

Turing completeness allows Ethereum to run any program, making it very flexible. However, this flexibility also introduces potential security and resource management issues. In open, decentralized systems like public blockchains, these risks must be carefully managed to avoid serious problems.

Turing Completeness and Infinite Loops

  • Unpredictable Termination: Alan Turing proved that you can’t predict if a program will stop running without actually running it. Some programs might run forever (infinite loops), and this can’t be predicted in advance.
  • Ethereum’s Challenge: Every node in Ethereum must validate every transaction and run any smart contracts involved. Because Ethereum is Turing complete, it can’t predict if a smart contract will stop or how long it will take to run without actually running it.

Potential Problems

  • Infinite Loops: A smart contract could be created to run forever, intentionally or by accident, which would be a type of Denial of Service (DoS) attack on the network.
  • Resource Abuse: Programs could waste resources (memory, CPU) by taking a long time to run, even if they don’t run forever. This is a problem because it affects all nodes on the network, using up global resources.

Solution: Gas

  • Gas Mechanism: Ethereum uses a system called “gas” to limit how much computing power a smart contract can use.
  • Gas Accounting: As the Ethereum Virtual Machine (EVM) runs a smart contract, it counts the computational steps (instructions) and assigns a cost in gas units to each step.
  • Gas Limit: When a transaction is made, it includes a certain amount of gas to pay for running the smart contract. If the gas runs out before the contract finishes, the EVM stops executing it.

Buying and Using Gas

  • Purchasing Gas: Gas isn’t a separate currency you can buy directly. Instead, it’s purchased with ether (Ethereum’s cryptocurrency) as part of a transaction.
  • Setting Gas Price: When sending a transaction, you specify how much ether to spend on gas and the price you’re willing to pay per unit of gas.
  • Refunding Unused Gas: If the transaction doesn’t use all the gas, the leftover amount is refunded to the sender.

Summary

Ethereum’s Turing completeness means it can run any program, but this introduces risks like infinite loops and resource abuse. To manage this, Ethereum uses a gas system that limits the resources any smart contract can consume. Gas is purchased with ether and acts as a cap on how much computation can be done, ensuring that no single contract can hog the network’s resources.

General-Purpose Blockchains and Ethereum

  • Ethereum’s Start: Ethereum was created to be a general-purpose blockchain. This means it can be programmed for various uses, not just specific tasks like Bitcoin, which is mainly for digital currency.
  • Expanded Vision: Ethereum’s vision grew to become a platform for creating decentralized applications, or DApps.

What are DApps?

  • Basic Definition: A DApp is more than just a smart contract. It’s an application with a web interface that interacts with the blockchain.
  • Components of a DApp: At a minimum, a DApp includes:
    • Smart Contracts: These are programs that run on the blockchain.
    • Web Frontend User Interface: The part of the application that users interact with through their web browser.

Additional Decentralized Components

Many DApps also include other decentralized parts, such as:

  • Decentralized Storage: Uses peer-to-peer (P2P) networks to store data across many computers instead of on a central server.
  • Decentralized Messaging: Uses P2P networks for communication, ensuring messages are not stored on or routed through central servers.

Special Tip about ÐApps

  • Ð Character: Sometimes DApps are spelled as ÐApps. The Ð character is a nod to Ethereum. It’s a special character called “ETH.” You can display this character using the Unicode codepoint 0xD0 or the HTML entity eth (or decimal entity #208).

Summary

Ethereum started as a flexible blockchain platform but quickly evolved to support decentralized applications (DApps). These applications combine smart contracts with web interfaces and often include decentralized storage and messaging components. The term ÐApps is a stylistic way to emphasize their connection to Ethereum.

The Third Age of the Internet

  • What is Web 2.0?: In 2004, the term “Web 2.0” became popular. It describes a shift in the internet towards user-generated content, interactive websites, and more responsive interfaces. It’s not a technical term, but it captures how web applications started to focus more on user interaction.

Web3 and DApps

  • Next Evolution: Web3: The concept of DApps (decentralized applications) is part of the next stage of the internet, called Web3. Web3 introduces decentralization into web applications using peer-to-peer (P2P) protocols.
  • Decentralization: Instead of applications being centrally owned and managed, Web3 apps are built on decentralized protocols. This means they run on networks of many computers rather than on a single central server.

Web3 Vision

  • Proposed by Dr. Gavin Wood: The idea of Web3 was first proposed by Dr. Gavin Wood, who co-founded Ethereum. Web3 represents a new way of building web applications using decentralized technologies.

Ethereum and Web3.js

  • Ethereum’s Role: Ethereum plays a key role in Web3 by providing the blockchain platform on which DApps can be built.
  • web3.js Library: This is a JavaScript library that connects applications running in your web browser with the Ethereum blockchain. It allows developers to create DApps that interact with Ethereum.

Additional Tools in web3.js

  • Swarm: A P2P storage network that can be accessed through the web3.js library, allowing for decentralized file storage.
  • Whisper: A P2P messaging service included in the web3.js library, enabling secure and decentralized communication.

Summary

Web3 is the next evolution of the internet, moving from centralized to decentralized applications. This shift is enabled by blockchain technologies like Ethereum. The web3.js library helps developers build these decentralized applications by providing tools to interact with the Ethereum blockchain, as well as P2P storage (Swarm) and messaging (Whisper) services. This creates a full suite for developing Web3 DApps directly in the web browser.

Ethereum’s Development Culture

  • Bitcoin’s Approach: Bitcoin’s development is conservative and cautious. Changes are carefully studied to avoid disrupting the existing system. Most changes are backward compatible, meaning old versions of the software will still work even if they don’t upgrade.

Ethereum’s Approach

  • Future-Focused: Ethereum’s development culture is more aggressive and forward-looking. The community is willing to make changes quickly, even if it means breaking compatibility with older versions or forcing users to update their software.
  • "Move Fast and Break Things": This phrase captures Ethereum’s approach. They prioritize innovation and rapid evolution over stability and backward compatibility.

Implications for Developers

  • Flexibility Required: As an Ethereum developer, you need to be flexible and ready to adapt. The platform is evolving rapidly, so you may need to rebuild your infrastructure as assumptions and standards change.
  • Immutable System Challenge: One challenge is deploying code to an immutable system (where once a smart contract is deployed, it can’t be changed), while the platform itself keeps changing. You can’t simply upgrade smart contracts; you might need to deploy new ones and migrate users and data.

Autonomy and Decentralization

  • Not Fully Realized: The goal of creating more autonomous and decentralized systems is challenging because the platform is still evolving. To keep up with changes, developers need to maintain some control over their smart contracts.

Positive Aspects

  • Rapid Progress: Ethereum is advancing quickly, avoiding delays caused by minor disagreements (referred to as “bike-shedding”).
  • Innovation: The fast pace of development means new features and improvements are constantly being added.

Future Outlook

  • Stabilization: Eventually, Ethereum’s development will slow down, and its interfaces will become more stable. But for now, innovation is the main focus, and developers need to keep up with the rapid changes.

Summary

Ethereum’s development culture is aggressive and forward-looking, focusing on rapid innovation rather than stability. This requires developers to be flexible and ready to adapt to changes. While this approach means more frequent updates and less stability in the short term, it also drives fast progress and innovation. Eventually, Ethereum will stabilize, but for now, developers need to stay on their toes to keep up.

Why Learn Ethereum?

  • Complexity: Blockchains are complex because they involve many different fields like programming, security, cryptography, economics, distributed systems, and peer-to-peer networks.
  • Ethereum’s Advantage: Ethereum makes it easier to start learning about blockchains. You can quickly begin coding and experimenting on the platform.

Depth of Learning

  • Layers of Complexity: While Ethereum is easy to get started with, there’s a lot of depth to explore as you learn more. Each layer you uncover brings more complexity and interesting challenges.

Community and Developer Focus

  • Growing Community: Ethereum has a rapidly growing community of developers, faster than any other blockchain platform. This means you’ll have plenty of support and resources as you learn.
  • Developer-Friendly: Ethereum is designed for developers, making it easier for them to transition from other programming environments.

Ease of Coding

  • Familiar Tools: If you’re familiar with JavaScript, you can start coding on Ethereum quickly. The environment is designed to be accessible for developers with common programming skills.
  • Simple Examples: In the early days of Ethereum, people often showed how you could create a new token with just five lines of code. This highlights how easy it is to get started.

Challenges of Writing Good Code

  • Easy vs. Good Code: While it’s easy to write code on Ethereum, writing good and secure code is much harder. Developing robust applications requires careful attention to detail and a deeper understanding of the platform.

Summary

Learning Ethereum is beneficial because it simplifies the complex world of blockchains, making it easier to get started. It has a strong, fast-growing community and is designed to be developer-friendly. However, while it’s easy to write basic code, creating secure and efficient applications requires more in-depth knowledge and skill.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment