<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Stefan Adolf on Medium]]></title>
        <description><![CDATA[Stories by Stefan Adolf on Medium]]></description>
        <link>https://medium.com/@stadolf?source=rss-53cacc38e8a4------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*NbVQkF9X69o-6KilXeZF7Q.png</url>
            <title>Stories by Stefan Adolf on Medium</title>
            <link>https://medium.com/@stadolf?source=rss-53cacc38e8a4------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Mon, 01 Jun 2026 21:46:52 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@stadolf/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[How we Help AI Agents Tap Into User Owned Data to Accelerate Medical Research]]></title>
            <link>https://medium.com/@stadolf/how-we-help-ai-agents-tap-into-user-owned-data-to-accelerate-medical-research-b5fb86740405?source=rss-53cacc38e8a4------2</link>
            <guid isPermaLink="false">https://medium.com/p/b5fb86740405</guid>
            <category><![CDATA[data-security]]></category>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[privacy-protection]]></category>
            <category><![CDATA[web3]]></category>
            <dc:creator><![CDATA[Stefan Adolf]]></dc:creator>
            <pubDate>Wed, 23 Apr 2025 14:20:11 GMT</pubDate>
            <atom:updated>2025-04-23T15:59:59.349Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*paIXzFlOLmU6WzhOQJT5cA.png" /></figure><h3>Agentic DeSci: The Future of AI-Driven Scientific Discovery</h3><p>As Sam Altman <a href="https://blog.samaltman.com/three-observations">noted in February 2025</a>, AGI will accelerate scientific progress faster than today, potentially outpacing all other effects. This acceleration is mostly caused by the appearance and explosive development of <a href="https://www.anthropic.com/engineering/building-effective-agents">AI agents</a> — sophisticated systems with LLMs at their core that are able to do complex knowledge work, reason about tasks and split them into executable plans, talk to the outside world and grow memories over longer periods of time than one chat window.</p><p>From here, <a href="https://ai-docs.bio.xyz/developers/bioagents">autonomous AI research agents</a> actively drive scientific processes from hypothesis to onchain IP inside an ecosystem that also tries to protect user privacy and rewards participation — a future we commonly refer to as the “Transformation Epoch of DeSci” or the <a href="https://blog.sei.io/what-is-desci-v2-and-why-does-it-matter/">second</a> version of the Decentralized Science movement and that will see the onboarding of large amounts of users into the space and the rise of agentic AI research.</p><p>The biology research process produces over a million new publications yearly. No human researcher can keep up with this volume of information. In contrast, agentic researchers are continuously running applications operated inside small labs or in the cloud that can react to environmental triggers and constantly collect and synthesize new information, regardless of its size. They accelerate the speed at which research papers are turned into validated IP and they become the foundation of an incentivized, permissionless, user-operated, decentralized ecosystem of a science process elevated by large language models and knowledge graphs.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Fu8pLO_0ukbCBUyf4xt4Gg.jpeg" /></figure><h3>The Human Element: Add Conversational Validation to the Loop</h3><p>Despite the powerful autonomy of AI agents, the trajectory from hypothesis to validated discovery can not be entirely automated. While agents excel at identifying correlations, generating hypotheses at scale, and interfacing with diverse external systems, they remain unable to directly observe the real-world implications of their innovations.</p><p>In the currently prevailing ecosystem, machine assisted research predominantly relies on pre-existing user data, or on synthetic derivatives. Although invaluable for detecting intricate statistical correlations and formulating novel hypotheses, these approaches fall short when validating the original assumptions that agentic researchers postulate; they neither can access data that hasn’t been disclosed to them nor can they predict how behavioural changes would affect the individual user’s condition.</p><p>To validate their ideas, agents would substantially benefit from adding a “<a href="https://cobusgreyling.medium.com/ai-agents-with-human-in-the-loop-f910d0c0384b">patient in the loop</a>” into their workflow instead — a genuine human element that they can ask to share measurable data readings or subjective observations that they cannot extrapolate from a pre-existing data set. In essence, agents will need to verify their assumptions directly with patients or human subjects relevant to their research space.</p><p>A patient-in-the-loop isn’t necessarily a simple one-off interaction but can potentially grow into a sophisticated dialog-based process occurring over time to substantiate the real-world relevance and accuracy of the agent’s discoveries or theoretical constructs. Imagine a type 2 diabetic who shows signs of remission and an agent that researches phenotypes that respond well to early time-restricted eating. The agent could get in direct contact with the individual, compare them with other patients in the remission group, unobtrusively ask for insights of their eating behaviours and find correlations between entities in the responder cluster. The collective findings might lead to a better foundation for health apps developing algorithms that help the individual monitor and understand their calorie intake schedules.</p><h3>Meet the Health Profile Matching Protocol: Agents that Discover Profiles and Connect with Humans</h3><p>The critical challenge lies in enabling this human-AI interaction without compromising the equally important need for patient privacy and data control — a well known problem domain that’s addressed and made possible by state of the art privacy enhancing technologies like Nillion’s <a href="https://docs.nillion.com/learn/protocols#privacy-enhancing-technologies">blind modules</a>, Vana’s <a href="https://docs.vana.org/docs/data-privacy">encrypted data storage</a> or generic distributed computation protocols like <a href="https://developer.litprotocol.com/sdk/access-control/quick-start">Lit Protocol</a>.</p><p>Welshare proposes a Health Profile Matching Protocol (HPMP) that allows research agents to query a vast amount of user profiles for certain conditions they’ve identified during their hypothesis generation process. The filtering and matchmaking logic runs inside an isolated but distributed trusted execution environment, e.g., a <a href="https://docs.nillion.com/build/secret-vault-quickstart">Nillion SecretVault</a> on a dedicated cluster that’s operated by trusted actors. Agents can run <a href="https://docs.nillion.com/build/secretVault-secretDataAnalytics/create-query">analytical aggregation queries</a> on private information and use the result sets for their needs without ever disclosing any specific detail of a particular user. This already is a valuable feature to filter insights over large amounts of generally available user data.</p><p>However, a far more powerful feature of the HPMP is that it enables conversations between research agents and individuals who match a certain condition identifying them as a relevant target audience. Agents can communicate with users in accessible language, ask them to share additional data points, take individual pictures, observe and analyse behavioral patterns, or gather supplementary sensor data. The HPMP orchestrates the preservation and retrieval of conversational memory and contexts while guiding both human participants and agents through the process.</p><p>Research Agents will interact with the HPMP using dedicated <a href="https://modelcontextprotocol.io/introduction">Model Context Protocol</a> (MCP) servers that translate requests into actionable operations within the HPMP interface. MCP is a foundational open standard introduced by Anthropic that enables AI agents, particularly LLMs, to securely connect with external data sources and tools.</p><p>Key features include:</p><ul><li><strong>Dynamic Access:</strong> Agents can query servers for real-time data rather than relying only on pre-trained knowledge.</li><li><strong>Two-way Communication:</strong> Agents can both pull data and push updates through the server.</li><li><strong>Standardization:</strong> One integration works for many different agent frameworks and clients.</li></ul><h3>A Real Life Example</h3><p>Imagine a research agent tasked to develop new methods to detect biomarkers for early diagnosis of <a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC8837071/">neurodegenerative diseases</a>.</p><p>After the agent first queries the network for a promising correlation of conditions it files an aggregation query requests on HPMP to identify users who</p><ul><li>are aged between 28–45</li><li>actively track their sleep (past 30 days)</li><li>suffer from subtle sleep fragmentation (e.g., &gt;4 wake events/night)</li><li>show slight HRV declines which are not explained by illness or stress</li></ul><p>From the result set of 430 users, it asks a selected target audience follow up questions:</p><ol><li><em>“Have you experienced any recent memory lapses, attention issues, or word-finding difficulty?”</em></li><li><em>“Would you be willing to record a short voice message daily for the next 14 days?”</em></li><li><em>“Can we send you a 1-minute weekly focus/memory test?”</em></li><li><em>“Have you recently started or stopped any supplements or medications?”</em></li></ol><p>The agent eventually develops concise instructions for individual users to help them with responding to these questions. The HPMP securely and asynchronously relays these prompts and their responses into the secure user data space and allows the requesting agent to query from them.</p><p>For selected users that share significant attributes, the agent can ask for further enrichment, e.g. to install applications that help collecting</p><ul><li>Voice recordings (short prompts to analyze tone, cadence, word variety)</li><li>Typing patterns (to detect motor or processing slowdowns)</li><li>Weekly cognitive scores from in-app microtests</li><li>Advanced journaling data (mood, sleep quality, alertness ratings)</li></ul><p>If the agent identifies a sufficiently correlated user cluster showing early cognitive biomarkers 5–7 years ahead of symptom onset, it updates a shared knowledge graph with multimodal neuro-risk signal nodes linked to demographics and observed habits and eventually anchors that finding as IP on chain (e.g. as IP-NFT). Here it also may include cryptographically provable provenance information that would allow for posterior contributor rewards or citations.</p><p>Depending on its instruction plan, the agent can add its new findings to a diagnostic knowledge graph that helps other application developers build screening tools for users with comparable bio markers. The agent can also directly return diagnostically certain findings, so the user in our previous example could be advised to seek medical consultation if they show signs that indicate a neurodegenerative issue. Ultimately, research agents help decreasing the time needed to incorporate new findings into third party algorithms that improve personalized therapeutics for users.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*7ZSbi65kQAKIeOX9rweeUQ.png" /><figcaption>participants and activities of the HPMP</figcaption></figure><h3>User Profiles: Storage Endpoints for Wearable Data, Cryptographic Identity and Conversations</h3><p>Users create profiles on the HPMP to collect their data from wearable devices and other health applications inside a space they ultimately control. The data is stored securely using user-owned encryption keys, and leverages technologies like Nillion’s SecretVaults on jurisdictional compliant nodes.</p><p>HPMP User Profiles are publicly available to all implementers and will come with many benefits for third-party integrators:</p><ul><li>They are enriched by MPC secured signers and transparently provide cryptographic key material and sufficient randomness to derive accounts for signing or authentication against blockchain networks, e.g., to control smart contract wallets for advanced use cases.</li><li>They unlock user controlled data encryption without any party beyond the MPC provider and the user having to keep any secrets safe.</li><li>Integrators gain many features of the protocol layer for free, and they stay related to the user base they helped onboarding into the protocol. Thus they can collect and read their users’ information given their continued consent.</li><li>The protocol provides basic storage and accessibility information to integrators for free, including some technical guarantees over data storage safety, redundancy and compliance.</li></ul><p>Research agents will never have direct access to the raw data lake. They instead interact with HPMP via MCP endpoints to find matching user profiles and establish secure communication channels with them. Agents can request access to specific data subsets from user profiles, such as readings from health wearables or aggregators like Apple HealthKit. Integrators that want to run research agents on their own user base will be able to do so at a major discount compared to external research agents.</p><p>Ultimately the HPMP user profiles allow agents to ask questions, deploy surveys on users’ screens or present findings to actively gather feedback directly from individuals.</p><h3>Onboarding Users Becomes a Matter of Convenience for Integrators</h3><p>HPMP invites agentic AI developers, health aware users and 3rd party applications to use it as an openly accessible health data repository providing clearly defined access points to its profiles, user entities and their data. The HPMP never claims “ownership” of any user itself.</p><p>Our strategic vision for creating a self-sustaining cycle of user acquisition is as follows:</p><ul><li>The DeSci ecosystem and personalized health application builders collectively recognize AI agents as the driving force behind research advancement.</li><li>Health application builders not only permit but actively facilitate users in exporting and synchronizing their information with HPMP infrastructure. In exchange, they are liberated from concerns regarding profile management or secure data storage at scale. Data collected on behalf of their users remains fully accessible for their operational requirements.</li><li>Agentic research findings flow back into knowledge graphs and discovery databases that are addressable by tool builders, so they can instantly update their applications and personalized health offerings.</li><li>Users benefit from tailored health insights fundamentally derived from findings to which they or their community members have directly contributed. This mechanism encourages more users to disclose their information to HPMP agents and engaging actively in conversations.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*-BYXJd__AwUdQMvznMJEzg.png" /><figcaption>A flywheel of user data based value creation</figcaption></figure><h3>Outlook: Incentivize Each Party in the Ecosystem</h3><p>While not being a primary goal at time of the launch of HPMP, the protocol will require agents to pay for profile connectivity, queries and interactions with a token primitive that needs to be defined when the mechanism is laid out and has demonstrated a market fit with high confidence. The synergies between integrators, research agent ecosystems (<a href="https://ai.bio.xyz/">like BIO</a>) and external data providers are also yet to be determined.</p><p>Frankly, the HPMP will not put an immediate monetary incentive layer in place that simply would “pay users to share data” as this never turned out to be a reliable model; the immediate benefits users will gain for offering their information to HPMP matchmaking are:</p><ul><li>They will receive very early hints on how changing lifestyle and behavior would contribute to certain conditions in ways that rarely have been tried before. Since their data becomes part of a shareable result set more quickly, the chances of getting early access to tools that help with individual medical conditions are far higher than waiting for startups or big pharma companies developing such tools on isolated siloes of their communities’ data.</li><li>The cryptographic nature of all HPMP entities will allow tracing the whereabouts and impact of individual information. Thus users can get access to early clinical drug trials that are promising candidates to help treat their conditions.</li><li>Users can decide to publish their own information to other protocols and researchers that refine algorithms on higher data dimensions — arbitrary wearable readings can help identify condition correlations that were unknown before; the HPMP’s conversational subsystem can be utilized to reflect those findings back to data contributors.</li></ul><h3>Conclusion: Charting the Course for Agentic DeSci with Human-Centered Privacy and Participation</h3><p>A powerful new research paradigm is emerging and Welshare’s HPMP will provide a crucial building block that keeps humans in the loop. Individuals decide which data they disclose and they receive real benefits in return: The gap between scientific research and affected individuals profiting from it has never been narrower.</p><p>The HPMP approach stands out for its commitment to user data sovereignty. Unlike plain data disclosure approaches where data is surrendered entirely, this system creates a secure environment where users actively participate in scientific discovery while their information remains protected by cryptographic technologies and only is decrypted inside trusted execution environments. This privacy-first approach encourages broader participation from diverse populations who might otherwise be hesitant to share sensitive health data, ultimately leading to more comprehensive and inclusive scientific discoveries.</p><p>The combination of AI-driven research agents, privacy-preserving storage protocols, end-user controlled data, long-term conversational memory and on-chain incentives will accelerate scientific discovery faster than anyone ever could have imagined.</p><h3>About the Author</h3><p>Originally a studied mathematician (FH diploma), Stefan builds software of various dimensions and for many different purposes since 1999 — as founder, lead dev, specialist or simply as grizzly rubber bear for any team member who requires it. Since 2019 he focuses on products that value user sovereignty, privacy and permissionless backends. He has introduced many peers and community members to web3 stacks, p2p principles and decentralized thinking. In 2022 he joined Molecule as Senior web3 engineer and developed the specifications and smart contracts that enable <a href="https://docs.molecule.to/documentation/ip-nfts/technical-components-of-ip-nfts/technical-details-for-developers">Molecule’s IP-NFT and IPT ecosystem</a>. After being a technical advisor for the team, Stefan joined welshare early 2025 to help starting up a protocol for truly sovereign and permissionless patient data utilization in an agentic research context.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b5fb86740405" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[IP-NFTs: Everything you need to know as a developer]]></title>
            <link>https://medium.com/@stadolf/ip-nfts-everything-you-need-to-know-as-a-developer-2cdfd5d9116e?source=rss-53cacc38e8a4------2</link>
            <guid isPermaLink="false">https://medium.com/p/2cdfd5d9116e</guid>
            <category><![CDATA[ip-nfts]]></category>
            <category><![CDATA[ethereum]]></category>
            <category><![CDATA[desci]]></category>
            <category><![CDATA[web3]]></category>
            <category><![CDATA[smart-contracts]]></category>
            <dc:creator><![CDATA[Stefan Adolf]]></dc:creator>
            <pubDate>Wed, 18 Jan 2023 11:45:45 GMT</pubDate>
            <atom:updated>2023-01-18T11:45:45.938Z</atom:updated>
            <content:encoded><![CDATA[<p>IP-NFTs are non fungible tokens that represent legally binding intellectual property (IP) currently being used within decentralized science (<a href="https://ethereum.org/en/desci/">DeSci</a>). Here, we outline their inner workings and how you could utilize their metadata schema, data layer and smart contract methods to create your own intellectual property representation on EVM based blockchains. To get started with the general idea and scope of IP-NFTs, we recommend to first read <a href="https://www.molecule.to/blog/the-scientific-singularity-our-vision-for-the-future-of-research-with-ip-nfts">our vision of the future of research</a> and <a href="https://www.molecule.to/blog/introducing-ip-nft-v2">our non technical intro into IP-NFT mints for users</a>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*aB3ADvWet38nZq2324DyKQ.png" /></figure><h3>Tokens in a Nutshell</h3><p>Non fungible tokens (<a href="https://ethereum.org/en/nft/">NFTs</a>) are smart contract based assets that associate a unique token identifier with the blockchain address of its respective owner. Their underlying smart contracts define rules on how they are minted (brought into existence), transferred or burned (destroyed). It also can restrict their ability to be transferred or offer features that are unlocked for individual token holders. Two standard NFT implementations have emerged in the Ethereum ecosystem so far: the classic <a href="https://eips.ethereum.org/EIPS/eip-721">ERC-721</a> defines a unique ownership relationship between asset ids and their owners. It adds a rudimentary metadata standard by exposing a tokenURI(uint) method that yields an individual (or common) link to the metadata of each asset id. The slightly newer multi token standard <a href="https://eips.ethereum.org/EIPS/eip-1155">ERC-1155</a> is not fully compatible to ERC-721 but also allows users to mint and distribute several tokens of the same “kind”, not unlike several instances of a rare - but not unique - gem. An ERC-1155 token kind with only one instance effectively represents assets in the same way as ERC-721 does.</p><p>When it comes to web3 based ownership of assets, those two ERCs are the gold standard, they’re supported by all major marketplaces and countless projects have built an ecosystem around them for trading, locking, voting and fractionalizing. NFTs can represent real world assets and brand values, too. We’re using them to represent an ownership aspect for the most abstract asset class of them all: intellectual property.</p><h3>Tokenizing Intellectual Property with NFTs</h3><p>While there’s no final answer on how real world IP can be represented by a blockchain based asset, IP-NFTs refer to legally binding paper agreements that are attached to their metadata as digital copies (PDFs). Those agreements denominate the owning entity of an intellectual property as the holder of an NFT on a certain collection. The current NFT owner can legally prove that they’re holding the IP rights by downloading and verifying the attached legal documents on their own machine. Not all agreements are meant to be visible to the general public though, so mostly these documents shall be encrypted in a way that only the current NFT holder or users they granted read access can decrypt them — an aspect that’s also known as “token gated” content.</p><p>Once represented as an NFT, all known token mechanics become operational on the IP: it can be traded on open marketplaces, being bid and asked upon, it can be fractionalized to represent distributed ownership rights or even locked into token synthesizers to farm tokens that represent voting rights on other protocols. It’s not the IP-NFT protocol itself that unleashes these possibilities, it’s the NFT ecosystem that’s unlocked once they have been minted by their initial holders.</p><h3>Technical Foundations</h3><p>IP-NFTs are ERC-1155 assets on Ethereum blockchains. Their relevant collection contract <a href="https://etherscan.io/address/0x0dccd55fc2f116d0f0b82942cd39f4f6a5d88f65#code">is deployed on mainnet</a> and <a href="https://goerli.etherscan.io/address/0x36444254795ce6E748cf0317EEE4c4271325D92A#code">on Görli testnet</a>. Each token’s metadata is stored as a file descriptor URI (e.g. ar://HxXKCIE0skR4siRNYeLKI61Vwg_TJ5PJTbxQmtO0EPo) that must be resolved client side, e.g. by using decentralized storage network gateways (<a href="https://arweave.news/introduction-to-the-most-important-infrastructure-in-the-ar-ecosystem-ar-gateway/">Arweave</a> or <a href="https://ipfs.github.io/public-gateway-checker/">IPFS</a>). The contract is non enumerable, i.e. users can’t simply query their owned assets on chain but rather must rely on reading the respective event logs to build their own off chain state. We’ve deployed subgraphs <a href="https://api.thegraph.com/subgraphs/name/moleculeprotocol/ip-nft-mainnet">on mainnet</a> and <a href="https://thegraph.com/explorer/subgraph/dorianwilhelm/ip-nft-subgraph-goerli">on Görli</a> that can be queried for asset ownership and other IP-NFT related information. Here’s a GraphQL example on how to do that:</p><pre>query IPNFTsOf($owner: ID!)<br>{<br>  ipnfts(where: {owner: $owner}) {<br>    id<br>    owner<br>    createdAt<br>    tokenURI<br>  }<br>}</pre><p>Variables:</p><pre>{<br>  &quot;owner&quot;: &quot;0xd1f5B9Dc9F5d55523aB25839f8785aaC74EDE98F&quot;<br>}</pre><p>Result:</p><pre>{<br>  &quot;data&quot;: {<br>    &quot;ipnfts&quot;: [<br>      ...<br>      {<br>        &quot;id&quot;: &quot;21&quot;,<br>        &quot;owner&quot;: &quot;0xd1f5b9dc9f5d55523ab25839f8785aac74ede98f&quot;,<br>        &quot;createdAt&quot;: &quot;1671818892&quot;,<br>        &quot;tokenURI&quot;: &quot;ar://HxXKCIE0skR4siRNYeLKI61Vwg_TJ5PJTbxQmtO0EPo&quot;<br>      }<br>    ]<br>  }<br>}</pre><h3>Interacting with Smart Contracts</h3><p>A detailed instruction on how accounts can interact with blockchain based smart contracts is far out of scope of this article. If you’re new to that space, it’s highly adviseable to familiarize yourself with <a href="https://ethereum.org/en/developers/">the fundamentals of Ethereum development</a> and understand how clients interact with deployed contracts using <a href="https://docs.ethers.org/v5/getting-started/#getting-started--glossary">providers</a>, <a href="https://docs.ethers.org/v5/getting-started/#getting-started--signing">signers</a>, <a href="https://docs.ethers.org/v5/api/contract/contract/#Contract--metaclass">transactions</a> and contract <a href="https://docs.soliditylang.org/en/v0.8.17/abi-spec.html?highlight=abi">ABIs</a>.</p><p>We’ve deployed the contracts as <a href="https://docs.openzeppelin.com/contracts/4.x/api/proxy#UUPSUpgradeable">UUPS proxies</a> that are owned and upgradeable by the Molecule developer team, thus the contract you’re interacting with and the contract that contains the current logic are different. Make sure to always invoke functions on the UUPS proxy — its official addresses can be found on the public repo’s <a href="https://github.com/moleculeprotocol/IPNFT/blob/main/README.md">README file</a>. The implementation contracts have been verified on Etherscan, so you can <a href="https://etherscan.io/address/0xa4ed1346ba6a4231e35677e73eb7866c05d61725#code">easily retrieve their ABIs</a>.</p><h3>Reserving Token IDs</h3><p>IP-NFTs can generally be minted by arbitrary accounts. However, to keep the collection’s items as clean and valid as possible, we added a guard in front of the mintReservation method that requires a minter to hold a valid mintpass. To retrieve a mintpass for mainnet usage, users can submit <a href="https://airtable.com/shr9QN0tPPeK4GGjA">this self service form</a> that notifies the Molecule team to drop a new mintpass for the requestor. On testnets users can simply issue mintpasses for themselves, either by following the interactive flow <a href="https://ip-nft.molecule.to">on the official IP-NFT minting UI</a> or by calling one of our <a href="https://goerli.etherscan.io/address/0x0F1Bd197c5dCC6bC7E8025037a7780010E2Cd22A#writeContract">dedicated mintpass dispenser contract</a>’s dispense methods on chain.</p><p>Once holding a mintpass, the next step on the minting journey is to reserve an IP-NFT token id by calling the IP-NFT contract’s reserve() method. This capturing step is necessary because the legal documents attached to the final IP-NFT are referring to the NFT’s token id that only becomes available after the mint has occurred. Minters will use the token id to craft the legal documents that outline the rights and obligations of owning that NFT in the real world. A selection of premade contract templates for IP-NFTs can be found <a href="https://github.com/moleculeprotocol/Legal-Contracts">on Github</a>.</p><h3>Assemble and Upload Metadata</h3><p>The JSON metadata documents behind IP-NFTs are required to strictly validate against a <a href="https://bafybeiho346bhsmtvt3opy3fxznraiueeagmco2rvzy5pfa74ru5vovk6m.ipfs.w3s.link/ipnft.schema.json">well defined JSON schema</a> that’s flexible enough to cover many relevant use cases. <a href="https://jsonschema.dev/s/EmB1F">Here’s a visual tool</a> to investigate a valid IP-NFT’s metadata interactively. Note that the generic fields name, image and description are located on the document’s root level <a href="https://eips.ethereum.org/EIPS/eip-1155#metadata">as required by ERC-1155</a>, whereas the agreements and project_details structures are modeled as rich property definitions.</p><pre>{<br>  &quot;schema_version&quot;: &quot;0.0.1&quot;,<br>  &quot;name&quot;: &quot;Our awesome test IP-NFT&quot;,<br>  &quot;description&quot;: &quot;Lorem ipsum dolor sit amet, ...&quot;,<br>  &quot;image&quot;: &quot;ar://7De6dRLDaMhMeC6Utm9bB9PRbcvKdi-rw_sDM8pJSMU&quot;,<br>  &quot;external_url&quot;: &quot;https://ip-nft.com/1&quot;,<br>  &quot;properties&quot;: {<br>    &quot;type&quot;: &quot;IP-NFT&quot;,<br>    &quot;agreements&quot;: [<br>      {<br>        &quot;type&quot;: &quot;License Agreement&quot;,<br>        &quot;url&quot;: &quot;ar://4FG3GR8qCdLo923tVBC85NTYHaaAc3TvCsF3aZwum_o&quot;,<br>        &quot;mime_type&quot;: &quot;application/pdf&quot;,<br>        &quot;content_hash&quot;: &quot;bagaaiera7ftqs3jmnoph3zgq67bgjrszlqtxkk5ygadgjvnihukrqioipndq&quot;,<br>      }<br>    ],<br>    &quot;project_details&quot;: {<br>      &quot;industry&quot;: &quot;Pharmaceutical R&amp;D&quot;,<br>      &quot;organization&quot;: &quot;Newcastle University, UK&quot;,<br>      &quot;topic&quot;: &quot;Aging&quot;,<br>      &quot;research_lead&quot;: {<br>        &quot;name&quot;: &quot;Chuck Norris&quot;,<br>        &quot;email&quot;: &quot;chuck@norris.com&quot;<br>      }<br>    }<br>  }<br>}</pre><h3>Validate Metadata Correctness</h3><p>To validate IP-NFT metatadata documents against that schema, you can use arbitrary JSON schema tools. <a href="https://ajv.js.org/guide/getting-started.html">Ajv</a> is one of the most powerful ones in Javascript. We’re omitting the code to retrieve schema or documents for brevity’s sake but in a nutshell validation boils down to:</p><pre>import Ajv from &quot;ajv&quot;;<br>import addFormats from &quot;ajv-formats&quot;;<br><br>(async () =&gt; {<br>  const ipnftSchema = JSON.parse(ipnftSchemaJson);<br>  const document = JSON.parse(ipnftMetadataJson);<br>  const ajv = new Ajv();<br>  addFormats(ajv);<br>  const validateIpnft = ajv.compile(ipnftSchema);<br>  const validationResult = validateIpnft(document);  <br>})();</pre><h3>Link to External Resources</h3><p>IP-NFT metadata documents require you to refer to external resources, e.g. the image or agreements[].url fields. While you can choose to go with the well known https:// protocol, it’s advisable to use web3-native decentralized storage pointers like ar:// or ipfs:// instead. Clients are supposed to resolve them to their respective http gateway counterparts and most NFT related services and frontends can handle them. You don’t need to run an Arweave or IPFS node yourself - <a href="https://app.ardrive.io">Ardrive</a> or <a href="https://hackmd.io/V-fIuoFWQcSNFu4tz3VU-A?view">web3.storage</a> are excellent helper services that get the job done and our official IP-NFT minting UI uses <a href="https://bundlr.network/">Bundlr</a> to efficiently upload files to the Arweave network with <a href="https://docs.bundlr.network/docs/FAQs/Dev-FAQ#what-is-optimistic-finalization">near instant finalization</a>.</p><p>Here’s a nodejs example on how to upload a JSON document using web3.storage (it’s simpler to do this <a href="https://web3.storage/docs/how-tos/store/#preparing-files-for-upload">within a browser context</a>, though):</p><pre>import dotenv from &quot;dotenv&quot;;<br>import { Blob } from &quot;node:buffer&quot;;<br>import { Web3Storage } from &quot;web3.storage&quot;;<br>dotenv.config();<br><br>const w3sClient = new Web3Storage({ token: process.env.W3S_TOKEN });<br>(async () =&gt; {<br>  const content = {<br>    uploaded_at: new Date().toISOString(),<br>  };<br>  const binaryContent = new Blob([JSON.stringify(content)], {<br>    type: &quot;application/json&quot;,<br>  });<br>  const file = {<br>    name: &quot;filename.json&quot;,<br>    stream: () =&gt; binaryContent.stream(),<br>  };<br>  //@ts-ignore<br>  const cid = await w3sClient.put([file], {<br>    name: &quot;some.json&quot;,<br>    wrapWithDirectory: false,<br>  });<br>  console.log(cid);<br>})();</pre><p>results in an IPFS CIDv1:</p><pre>bafkreicrhuxfzrydht6tmd4kyy6pkbhspqthswg6xbiqlaztmf774ojxhq</pre><p>To resolve the published content, you can request it from any public IPFS http gateway. You’ll experience the lowest latency when querying a gateway close to the node that you used for uploading; web3.storage offers https://w3s.link for that purpose. Requesting <a href="https://w3s.link/ipfs/bafkreicrhuxfzrydht6tmd4kyy6pkbhspqthswg6xbiqlaztmf774ojxhq">https://w3s.link/ipfs/bafkreicrhuxfzrydht6tmd4kyy6pkbhspqthswg6xbiqlaztmf774ojxhq</a> yields</p><pre>{&quot;uploaded_at&quot;:&quot;2023-01-02T22:45:17.788Z&quot;}</pre><h3>Decentralized Encryption and IP-NFT Token Gating</h3><p>An IP-NFT’s most important metadata property are its agreements, another term for legal documents attached to it. These documents refer to the IP-NFT smart contract’s (“collection”) address and the IP-NFT’s token id. The agreements’ content might contain confidential information about the involved parties and hence should be encrypted before being uploaded. Decentralized and permissionless encryption is a non trivial requirement that we solve by relying on <a href="https://developer.litprotocol.com/SDK/Explanation/encryption">Lit Protocol</a>.</p><p>Lit runs a network of nodes that derive signing and encryption keys by multiparty computation / threshold cryptography on trusted computing enclaves. The nodes themselves only know parts of the private key that effectively is fully assembled on the client side after all conditions for key retrieval have been met. Lit protocol allows gating any content behind access control conditions that are backed by blockchain state, therefore it’s disclosing decryption keys only to holders of an NFT or users that meet a certain condition on chain.</p><p><a href="https://developer.litprotocol.com/SDK/Explanation/encryption#encrypting">Lit’s documentation</a> lays out the encryption process in detail. To instantiate a Lit SDK instance that’s capable of encrypting or decrypting content, <a href="https://developer.litprotocol.com/sdk/explanation/walletsigs/authsig/#obtaining-the-authsig">it needs</a> an <a href="https://login.xyz">EIP-4361</a> compatible signature that proves control over the current user’s account. Once authenticated we can request a new symmetric key to encrypt our content and ultimately ask the Lit network nodes to store its key shares along with an access control condition. That request yields an encrypted decryption key (😵‍💫) that has been created by the network nodes.</p><pre>import LitJsSdk from &#39;@lit-protocol/sdk-browser&#39;<br>  <br>const litClient = new LitJsSdk.LitNodeClient()<br>await client.connect() //connects to Lit network nodes<br><br>const file: Blob | File = //some file<br>const { encryptedFile, symmetricKey } = await LitJsSdk.encryptFile({ file })<br>//you can reuse a Siwe / EIP-4361 compatible signed message here, see https://login.xyz/<br>const authSig = await LitJsSdk.checkAndSignAuthMessage({ chain: &quot;ethereum&quot; });<br><br>accessControlConditions = {<br>    conditionType: &#39;evmBasic&#39;,<br>    contractAddress: tokenContractAddress,<br>    standardContractType: &#39;ERC1155&#39;,<br>    chain: &quot;ethereum&quot;,<br>    method: &#39;balanceOf&#39;,<br>    parameters: [&#39;:userAddress&#39;, tokenId],<br>    returnValueTest: {<br>      comparator: &#39;&gt;&#39;,<br>      value: &#39;0&#39; // user owns more than 0 of this token id<br>    }<br>  }<br><br>const u8encryptedSymmetricKey = await litClient.saveEncryptionKey({<br>  unifiedAccessControlConditions: accessControlConditions,<br>  symmetricKey,<br>  authSig,<br>  chain,<br>  permanent: false<br>})</pre><p>A user who wants to decrypt the content must again initialize the SDK using a signed message that proves control over their address. Next, they ask several network nodes to present their key shares of the encrypted key by presenting the access control conditions and the encrypted symmetric key to the network. If the network nodes find that the account matches the given conditions, each one yields its key share for the encrypted decryption key. With that, the SDK decrypts the key the content has initially been encrypted with.</p><pre>const authSig = await LitJsSdk.checkAndSignAuthMessage({ chain: &quot;ethereum&quot; });<br>const symmetricKey = await litClient.getEncryptionKey({<br>    unifiedAccessControlConditions: accessControlConditions,<br>    toDecrypt: encryptedSymmetricKey,<br>    chain: &quot;ethereum&quot;,<br>    authSig<br>})</pre><p>An IP-NFT metadata’s agreements item can store the encrypted symmetric key and its access control conditions inside its encryption field. Note that the IP-NFT JSON schema of access_control_conditions is externally <a href="https://github.com/LIT-Protocol/lit-accs-validator-sdk/tree/main/src/schemas">defined by Lit protocol</a>.</p><pre>&quot;agreements&quot;: [<br>  {<br>    &quot;type&quot;: &quot;License Agreement&quot;,<br>    &quot;url&quot;: &quot;ar://4FG3GR8qCdLo923tVBC85NTYHaaAc3TvCsF3aZwum_o&quot;,<br>    &quot;mime_type&quot;: &quot;application/pdf&quot;,<br>    &quot;content_hash&quot;: &quot;bagaaiera7ftqs3jmnoph3zgq67bgjrszlqtxkk5ygadgjvnihukrqioipndq&quot;,<br>    &quot;encryption&quot;: {<br>      &quot;protocol&quot;: &quot;lit&quot;,<br>      &quot;encrypted_sym_key&quot;: &quot;fcbeaf3af31c7104d1d1f7099a6c6f6fda5803a4f7a0bef93256f3377450291872ad07bed3e9402cb47cc932c8f48219e56b84c06becd5ec0ee83ef2c0c93b932fb675c7932fa8df0ad164f17642b32415e382081577a403c19da2eff22c9083fa134ad1f370c2bec449adcdea790498637c7238b7d67cf2d69507a962656d3200000000000000205e4ad4e6323e06862babc934f740bc2e566d175a5da23bb4f1b35635e5cc3768cd040e8776307ea038484ff42033c18f&quot;,<br>      &quot;access_control_conditions&quot;: [<br>        {<br>          &quot;conditionType&quot;: &quot;evmBasic&quot;,<br>          &quot;contractAddress&quot;: &quot;0xa1c301d77f701037f491c074e1bd9d4ac24cf5e5&quot;,<br>          &quot;standardContractType&quot;: &quot;ERC1155&quot;,<br>          &quot;chain&quot;: &quot;goerli&quot;,<br>          &quot;method&quot;: &quot;balanceOf&quot;,<br>          &quot;parameters&quot;: [<br>            &quot;:userAddress&quot;,<br>            &quot;6&quot;<br>          ],<br>          &quot;returnValueTest&quot;: {<br>            &quot;comparator&quot;: &quot;&gt;&quot;,<br>            &quot;value&quot;: &quot;0&quot;<br>          }<br>        }<br>      ]<br>    }<br>  }<br>]</pre><h3>Using Multisig Wallet Signers</h3><p>Due to the high value nature of IP-NFTs you might feel tempted to use a multisig wallet for the minting process, maybe because you’d like to prove that the IP-NFT has been created by a dedicated group of individuals. This works fine for all contract function invocations but is not supported by Lit protocol. Multisig wallets (or contract wallets to be precise) cannot sign messages in the way it’s required to authenticate against Lit nodes because they’re not based on a private key. This might once be possible by utilizing <a href="https://eips.ethereum.org/EIPS/eip-1271">EIP-1271</a> compatible wallet signatures but <a href="https://discord.com/channels/896185694857343026/916383445784096839/1058018912010248232">is not supported</a> at the time of writing.</p><p>The recommended workaround is to denote a dedicated trusted member of the multisig that’s supposed to initially own the minted IP-NFT. This could be the researcher, a core contributor or maintainer of the project. The IP-NFT contract’s mintReservation function takes a recipient parameter (to) that defines the NFT’s initial owner. Note, that the account that <em>invokes</em> the mint function is required to hold a mint pass, not the receiver.</p><h3>Granting Read Access to Third Parties</h3><p>Another shortcoming related to Lit’s requirement of private key based authentication signatures is that multisig token holders cannot prove their address to the protocol. To allow multisig members to decrypt the accompanying agreement documents, the IP-NFT contract contains a <a href="https://goerli.etherscan.io/address/0x36444254795ce6E748cf0317EEE4c4271325D92A#writeProxyContract#F3">grantReadAccess</a>. It can be invoked by the current token holder (e.g. a multisig) to grant certain accounts (e.g. some of their members or potential buyers) read access to the underlying content for a limited amount of time. Its counterpart <a href="https://goerli.etherscan.io/address/0x36444254795ce6E748cf0317EEE4c4271325D92A#readProxyContract#F3">canRead</a> yields a boolean whether the reader is currently allowed access. For the current owner of an IP-NFT this method always returns true.</p><p>To make read grants work inside Lit protocol, one can craft a <a href="https://developer.litprotocol.com/coreConcepts/accessControl/EVM/customContractCalls">custom contract access control condition</a> that not only takes the current IP-NFT ownership into account but also lets users pass that currently are granted read access:</p><pre>&quot;encryption&quot;: {<br>  &quot;protocol&quot;: &quot;lit&quot;,<br>  &quot;encrypted_sym_key&quot;: &quot;...&quot;,<br>  &quot;access_control_conditions&quot;: [<br>    {<br>      &quot;conditionType&quot;: &quot;evmContract&quot;,<br>      //the IP-NFT UUPS proxy contract address<br>      &quot;contractAddress&quot;: &quot;0x36444254795ce6E748cf0317EEE4c4271325D92A&quot;,<br>      &quot;chain&quot;: &quot;goerli&quot;,<br>      &quot;functionName&quot;: &quot;canRead&quot;,<br>      &quot;functionParams&quot;: [<br>        &quot;:userAddress&quot;,<br>        &quot;10&quot;<br>      ],<br>      &quot;functionAbi&quot;: {<br>        &quot;name&quot;: &quot;canRead&quot;,<br>        &quot;inputs&quot;: [<br>          {<br>            &quot;internalType&quot;: &quot;address&quot;,<br>            &quot;name&quot;: &quot;reader&quot;,<br>            &quot;type&quot;: &quot;address&quot;<br>          },<br>          {<br>            &quot;internalType&quot;: &quot;uint256&quot;,<br>            &quot;name&quot;: &quot;tokenId&quot;,<br>            &quot;type&quot;: &quot;uint256&quot;<br>          }<br>        ],<br>        &quot;outputs&quot;: [<br>          {<br>            &quot;internalType&quot;: &quot;bool&quot;,<br>            &quot;name&quot;: &quot;&quot;,<br>            &quot;type&quot;: &quot;bool&quot;<br>          }<br>        ],<br>        &quot;stateMutability&quot;: &quot;view&quot;,<br>        &quot;type&quot;: &quot;function&quot;<br>      },<br>      &quot;returnValueTest&quot;: {<br>        &quot;key&quot;: &quot;&quot;,<br>        &quot;comparator&quot;: &quot;=&quot;,<br>        &quot;value&quot;: &quot;true&quot;<br>      }<br>    }<br>  ]<br>}</pre><h3>Proving Content Integrity</h3><p>Since agreement documents are encrypted before being stored, each agreement item may contain a content_hash that downloaders can use to prove the legal documents’ content integrity after they’ve decrypted it. When using IPFS as storage layer this hash is not adding much value since the network’s content ids already provide an untamperable way of guaranteeing content integrity, however <a href="https://docs.ipfs.tech/concepts/hashing/#content-identifiers-are-not-file-hashes">they’re not derived from the original content</a> and hard to prove without an IPFS node at hand.</p><p>The content_hash field shall contain the sha-256 digest of the attachment’s binary content, encoded as a multihash compatible to CIDv1. This allows clients to decode the content hash and verify a document’s content without being aware of the hashing algorithm used. This is how it looks like in Typescript using the <a href="https://www.npmjs.com/package/multiformats">multiformats NPM package</a>:</p><pre>import { CID } from &quot;multiformats/cid&quot;;<br>import * as json from &quot;multiformats/codecs/json&quot;;<br>import { sha256 } from &quot;multiformats/hashes/sha2&quot;;<br><br>const checksum = async (u8: Uint8Array) =&gt; {<br>  //https://multiformats.io/multihash/<br>  const digest = await sha256.digest(u8);<br>  return CID.create(1, json.code, digest);<br>};<br>const verifyChecksum = async (<br>  u8: Uint8Array,<br>  _cid: string<br>): Promise&lt;boolean&gt; =&gt; {<br>  const cid = CID.parse(_cid);<br>  //https://github.com/multiformats/multicodec/blob/master/table.csv#L9<br>  console.log(&quot;hash algo used: 0x%s&quot;, cid.multihash.code.toString(16));<br>  const digest = await sha256.digest(u8);<br>  return cid.multihash.bytes.every((el, i) =&gt; el === digest.bytes[i]);<br>};<br>(async () =&gt; {<br>  const binaryContent = new TextEncoder().encode(&quot;This is the content&quot;);<br>  const cid = await checksum(binaryContent);<br>  const valid = await verifyChecksum(binaryContent, cid.toString());<br>  console.log(cid, valid);<br>})();</pre><h3>Putting it all together: The IP-NFT Minting Flow for Developers</h3><p>To sum up, minting an IP-NFT technically requires the following steps:</p><ul><li>Get a Mintpass for the account that’s supposed to finally invoke the mintReservation function.</li><li>invoke the IPNFT contract’s reserve() function to reserve a token id. This will revert if the caller is not holding a valid Mintpass. Get the reserved token id by parsing the method’s event logs</li><li>upload an image to a (de)centralised network of your choice</li><li>use the token id and the IPNFT contract’s address to create legal documents</li><li>compute a checksum over the original documents</li><li>optionally encrypt the documents with a Lit access control condition</li><li>assemble a metadata structure containing the file pointers, access control conditions, encrypted symmetric key and checksum</li><li>verify that this metadata structure is valid</li><li>upload the metadata to a (de)centralised network of your choice</li><li>invoke mintReservation on the IPNFT contract with</li></ul><p>address to: the recipient of the minted NFT (e.g. a Multisig wallet)<br>uint256 reservationId: the token id you’ve reserved<br>uint256 mintPassId: the Mintpass id that’s going to be redeemed during the mint<br>string memory tokenURI: the URI that resolves to the metadata</p><h3>Conclusion</h3><p>IP-NFTs are DeSci primitives that allow researchers, institutions and laboratories to prematurely mint the legal implications of their work as a tradable and verifiable asset. They deal as fundamental ownership anchors that can be used to refer and gate access to other kinds of protectable content, e.g. machine learning models, data streams or non public documents. Being built on well known standard interfaces, they can be traded or fractionalized using a vast range of protocols that already exist today.</p><p>As you have learnt here, the minting process of IP-NFTs is not a trivial task, particularly if they’re containing references to encrypted content. However, their metadata schema is designed to be flexible enough to cover many IP related use cases and the IP-NFT’s contract interface should be simple to interact with.</p><p>The IP-NFT contract is deployed as an upgradeable contract that’s maintained by the Molecule core team and we’re planning to add more exciting features to it in the near future. You can find all relevant sources on our official <a href="https://github.com/moleculeprotocol/IPNFT">Github repo</a> and runnable versions of the code samples depicted in this article in the accompanying <a href="https://github.com/moleculeprotocol/ipnft-samples">samples repo</a>.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2cdfd5d9116e" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[7 Key Insights for Smart Contract Developers: What We’ve Learned Building Splice]]></title>
            <link>https://medium.com/coinmonks/7-key-insights-for-smart-contract-developers-what-weve-learned-building-splice-995dbb7bc2d6?source=rss-53cacc38e8a4------2</link>
            <guid isPermaLink="false">https://medium.com/p/995dbb7bc2d6</guid>
            <category><![CDATA[smart-contracts]]></category>
            <category><![CDATA[solidity]]></category>
            <category><![CDATA[ethereum]]></category>
            <category><![CDATA[nft]]></category>
            <category><![CDATA[web3]]></category>
            <dc:creator><![CDATA[Stefan Adolf]]></dc:creator>
            <pubDate>Tue, 14 Dec 2021 10:00:35 GMT</pubDate>
            <atom:updated>2021-12-27T15:05:14.262Z</atom:updated>
            <cc:license>https://creativecommons.org/licenses/by-sa/4.0/</cc:license>
            <content:encoded><![CDATA[<p>We’re just about to launch a new web3 product, and want to share some of the most important things we’ve learned along the way:</p><ul><li>How to separate concerns into different contracts?</li><li>Verifying ownership and allowing preliminary minting</li><li>How to ensure that no one can cheat on metadata?</li><li>Combined Token IDs</li><li>Shall we reduce gas fees by moving to an L2 network?</li><li>How to reduce storage costs?</li><li>How to keep payments safe?</li></ul><p>First a quick overview of what we’ve built: Splice lets you use NFTs you already own to seed a new generated NFT. Just visit our Dapp at <a href="https://getsplice.io">https://getsplice.io</a> and select one of your NFTs. Splice will extract its metadata and colors, and inject that into the code of a generative art style you choose. The result is a unique artwork you can mint as an NFT. We’re launching with art styles to generate banner images you can seed with your PFP and use on Twitter or Discord, like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*ywzGoxUp-K6VTrZn.png" /><figcaption>A Splice background image minted of <a href="https://opensea.io/assets/0x9d418c2cae665d877f909a725402ebd3a0742844/5409">Fangster #5409</a> and the Style “A Beginning is A Very Delicate Time”</figcaption></figure><p>Splice scales beyond banner images and will evolve in various ways. Our contracts are prepared to take more than one NFT as origin and <a href="https://github.com/SpliceNFT/splicenft/issues/86">we’ll ultimately hand over far more input parameters</a> to the style code, including the origin NFT’s traits, additional image analysis data or rarity scores. That’ll enable artists to build styles for far more advanced use cases. Splice will be able to select <a href="https://opensea.io/collection/lootproject">Loots</a> or <a href="https://opensea.io/collection/the-colors-dot-art">Colors</a> or <a href="https://opensea.io/collection/devs-for-revolution">DevDAO’s NFTs</a> as inputs and create new metaverse items.</p><p>This idea took us into the finale of <strong>EthOnline21</strong>. You can watch our final project pitch on the hackathon’s version of Splice from October 21 here (7:16):</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FxJiABLuD06g%3Fstart%3D793%26feature%3Doembed%26start%3D793&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DxJiABLuD06g&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FxJiABLuD06g%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/ebc8f06d093e265db56753ab47aedc7a/href">https://medium.com/media/ebc8f06d093e265db56753ab47aedc7a/href</a></iframe><p>This is how our Dapp looks like after roughly 2 months of finetuning and feature additions. <a href="https://getsplice.io">Feel free to give it a try</a> — at the time of writing we support previewing styles on your mainnet assets and you’ll be able to mint Splices on selected collections on the Rinkeby test network.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*T0H7Lh2b0_-FBBDgw5iHsA.png" /><figcaption><a href="https://getsplice.io">https://getsplice.io</a></figcaption></figure><h3>How to separate concerns into different contracts?</h3><p>Our <a href="https://github.com/SpliceNFT/splicenft/tree/main/packages/contracts/contracts">Splice contracts</a> cover two major usecases. First, the Splice contract itself is an ERC721 compatible NFT that tracks ownership of minted splices. Second, Splice’s <strong>styles</strong> are managed by another contract (Splice Style NFT) that controls ownership of styles and stores the fixed locations of style code and its metadata. Each style NFT enforces rules like how many splices of a style can be minted, whether minting is restricted to certain origin collections, if a minter has exclusive minting rights and, most importantly, how expensive a mint is.</p><p>To separate concerns we decided to split the Splice architecture into three contracts: Splice, Style and PriceStrategy(Static). We’re wiring up all these contracts during the deployment / the style minting process by keeping member properties typed as the composed contract.</p><pre>contract <strong>Splice</strong> {</pre><pre>  <strong>SpliceStyleNFT</strong> public styleNFT;</pre><pre>  function <strong>setStyleNFT</strong>(SpliceStyleNFT _styleNFT) public onlyOwner {<br>    styleNFT = _styleNFT;<br>  }</pre><pre>  function quote(IERC721 nft, uint32 style_token_id) <br>    public view <br>    returns (uint256 fee) { <br>      return <strong>styleNFT</strong>.quoteFee(nft, style_token_id);<br>  }<br>}</pre><pre>contract <strong>SpliceStyleNFT</strong> {</pre><pre>  address public <strong>spliceNFT</strong>;</pre><pre>  function <strong>setSplice</strong>(address _spliceNFT) external onlyOwner {<br>    spliceNFT = _spliceNFT;<br>  }</pre><pre>  function quoteFee(IERC721 nft, uint32 style_token_id)<br>    external <br>    view <br>    returns (uint256 fee) {<br>      fee = styleSettings[style_token_id].<strong>priceStrategy</strong>.quote(<br>        this,<br>        nft,<br>        style_token_id,<br>        styleSettings[style_token_id]<br>      );<br>    }<br>  function mint(<br>    ...<br>    <strong>ISplicePriceStrategy</strong> _priceStrategy,<br>    bytes32 _priceStrategyParameters<br>  ) {<br>    styleSettings[style_token_id] = StyleSettings({<br>      <strong>priceStrategy</strong>: _priceStrategy,<br>      <strong>priceParameters</strong>: _priceStrategyParameters<br>    })<br> }</pre><pre>}</pre><pre>struct <strong>StyleSettings</strong> {<br>  uint32 mintedOfStyle;<br>  uint32 cap;<br>  ISplicePriceStrategy <strong>priceStrategy</strong>;<br>  bytes32 <strong>priceParameters</strong>;<br>  bool salesIsActive; <br>  bool collectionConstrained;<br>  bool isFrozen;<br>  string styleCID;<br>}</pre><pre>contract <strong>SplicePriceStrategyStatic</strong> {</pre><pre>  function quote(<br>    SpliceStyleNFT <strong>styleNFT</strong>, <br>    IERC721 collection, <br>    uint256 token_id,<br>    StyleSettings memory styleSettings<br>  ) external pure override returns (uint256) {<br>    return uint256(styleSettings.<strong>priceParameters</strong>);<br>  }</pre><pre>}</pre><p>Separation of concerns in Solidity can be an architectural challenge because once contracts are deployed, they usually can’t be changed. Our priceStrategy seems unnecessary at first glance as it just returns the static fee that a style minter has provided during the minting process. The reason we built it this way is due to forward looking assumptions. The design of smart contracts must be open enough to be extended from day one, since it’s a nightmare to change them once they carry state and are used in the wild.</p><p>Our <em>PriceStrategy</em> abstraction allows far more sophisticated price calculations to be added in the future, without us needing to change anything on the existing contracts. Its implementations receive enough information to enable arbitrary complex pricing strategies. A simple extension could be a linearly bonded minting fee algorithm that increases the fee slightly with every Splice mint, or a Dutch auction that varies the fee depending on the time that’s passed since the last mint.</p><h3>Who gets to mint? Verifying ownership and allowing preliminary minting</h3><p>Ensuring that someone owns an origin is rather simple, you just cast the origin collection’s address to an IERC721 and check that its ownerOf method yields msg.sender for the incoming token ID:</p><pre>function mint(<br>    <strong>IERC721</strong>[] memory origin_collections,<br>    uint256[] memory origin_token_ids,<br>    uint32 style_token_id,<br>    bytes32[] memory allowlistProof,<br>    bytes calldata input_params<br>) {<br>for (uint256 i = 0; i &lt; origin_collections.length; i++) {<br>      if (origin_collections[i].<strong>ownerOf</strong>(origin_token_ids[i]) != msg.sender) {<br>        revert NotOwningOrigin();<br>      }<br>}</pre><p>But there’s more to it. An artist might decide to build a style that only works for, say, three dedicated origin collections. If that’s the case those collections’ addresses can be provided in the collectionAllowed member on our Style NFT. A style with a collection constraint will revert Splice mints when the origin collection(s) aren’t listed in the constraint list. By default styles aren’t constrained to particular collections, so Splices can be minted off any origin NFT.</p><p>Lastly we decided to add an allowList feature that’s unique to each Style NFT. If you wanted to build allowlists naively, you could just add some member of type mapping(uint32 =&gt; mapping(address =&gt; bool)) but would have to initialize that mapping when deploying a new style. If a style creator wants to have, say, 200 addresses on an allowlist, that would require a significant amount of gas to be sent along the minting transaction. Since we wanted this feature to be gas efficient, we had to come up with a better solution.</p><p>We decided to use <a href="https://media.consensys.net/ever-wonder-how-merkle-trees-work-c2f8b7100ed3">Merkle tree proofs</a> to determine whether a mint request is issued by an allowed user. Luckily, OpenZeppelin had us covered with their <a href="https://docs.openzeppelin.com/contracts/4.x/utilities#verifying_merkle_proofs">reference implementation for Merkle proofs</a>, so implementing this feature takes only one line of actual code:</p><pre>///SpliceStyleNFT.sol</pre><pre>function <strong>verifyAllowlistEntryProof</strong>(<br>  uint32 style_token_id, <br>  bytes32[] memory allowlistProof,<br>  address requestor<br>) public view returns (bool) {<br>  return <strong>MerkleProof.verify</strong>(<br>    allowlistProof,<br>    allowlists[style_token_id].merkleRoot,<br>    keccak256(abi.encodePacked(requestor))<br>  );<br>}</pre><pre>///Splice.sol:mint</pre><pre>if (<br>  allowlistProof.length == 0 || <br>  !styleNFT.<strong>verifyAllowlistEntryProof</strong>(<br>    style_token_id,<br>    allowlistProof,<br>    msg.sender<br>  ) {<br>    revert NotAllowedToMint(&#39;no reservations left or proof failed&#39;);<br>  }<br>)</pre><p>The downside of this approach is that the allowlist members must be kept in a safe place and proofs must be generated for each user individually but since this feature deals with permissioned data anyway, it’s not necessary to solve it in a 100% decentralized way. The client code that creates the respective proof array looks like this:</p><pre>import { MerkleTree } from &#39;merkletreejs&#39;;<br>import keccak256 from &#39;keccak256&#39;;</pre><pre>function createMerkleProof(allowedAddresses: string[]): MerkleTree {<br>  const leaves = allowedAddresses.map((x) =&gt; keccak256(x));<br>  return new MerkleTree(leaves, keccak256, {<br>    sort: true<br>  });<br>}</pre><pre>const allowedAddresses: string[] = [/* many 0xaddresses */]</pre><pre>const merkleTree = createMerkleProof(allowedAddresses);<br>const leaf = utils.keccak256(_allowedAddresses[0]);</pre><pre>// this grows linearly with the overall amount of allowed addresses<br>const proof = merkleTree.getHexProof(leaf);</pre><pre>const verified = await styleNft.<strong>verifyAllowlistEntryProof</strong>(<br>  1,<br>  proof,<br>  allowedAddresses[0] <br>);</pre><pre>expect(verified).to.be.true;</pre><h3>Hot to ensure that no one can cheat on metadata?</h3><p>Our <a href="https://showcase.ethglobal.com/ethonline2021/splice">initial implementation</a> of Splice was based on the assumption that users are in full control of their spliced results: the code renders a Splice result on the user’s machine, encodes it as PNG, publishes that on IPFS (using <a href="https://nft.storage/">nft.storage</a>) and then calls the contract’s mint method using its IPFS content hash.</p><p>We then realized that this implementation could easily be tricked by users: they actually could feed any IPFS hash they like into the mint function, effectively being able to mint virtually anything. That’s certainly not what we wanted to allow so we came up with the idea to use an oracle that requests dedicated validation backends to validate that our users’ mint “requests” actually contain valid Splice images that match the input parameters the user had used on their machine (you find an implementation for that <a href="https://github.com/SpliceNFT/splicenft/blob/77ce12f9843ef53b310fec6454994f965ce288b5/packages/backend/lib/validate.js">in our repo’s history</a>).</p><p>With the introduction of dedicated Style NFTs we deprecated this validation step. As of now Splice itself doesn’t store any IPFS metadata at all. The only information we keep for each Splice on chain is its “<strong>provenance</strong>” which is computed during a Splice mint:</p><pre>/// Splice.sol:mint</pre><pre>bytes32 provenanceHash = keccak256(<br>  abi.encodePacked(<br>    origin_collections, origin_token_ids, style_token_id<br>  )<br>);</pre><p>The provenance (or heritage as we called it historically) is unique for each Splice input. The users themselves are not providing any other information than their desired origin inputs and a style token id that determines which style code is executed on the inputs and which itself is anchored on IPFS. Thus, anyone who knows the input that had lead to the provenance, can deterministically reproduce the rendered image.</p><h3>Combined Token IDs</h3><p>If you look at <a href="https://testnets.opensea.io/assets/0xea934c468e6c8c0c60e6e62797ae57dbd601970f/12884901892">Splice’s token IDs</a>, for example “<em>12884901894</em>”, you’ll notice they’re seemingly not generated incrementally. Basically, they are, but it’s hard to see. Splice combines two incremental IDs into one unique ID value for each token. It combines the chosen style ID and the incremental (per style) splice token id into a unique token id (uint64, stored as uint256 as required by ERC721):</p><pre>/// SpliceStyleNFT</pre><pre>function incrementMintedPerStyle(uint32 style_token_id)<br>    external<br>    onlySplice<br>    returns (uint32)<br>{<br>      if (mintsLeft(style_token_id) == 0) {<br>        revert StyleIsFullyMinted();<br>      }<br>    <br>      styleSettings[style_token_id].mintedOfStyle += 1;<br>      return styleSettings[style_token_id].mintedOfStyle;<br>}</pre><pre>/// Splice.sol<br>uint32 nextStyleMintId = styleNFT.incrementMintedPerStyle(style_token_id);</pre><pre>token_id = BytesLib.toUint64(<br>  <strong>abi.encodePacked(style_token_id, nextStyleMintId),</strong> <br>  0<br>);</pre><p>This approach lets you compute the style heritage of each Splice NFT. You take its least significant 64 bits and split it into two uint32 values. The first one denominates the style ID, the second the incremental splice ID for that style:</p><pre>/// Splice.ts</pre><pre>public static tokenIdToStyleAndToken(<strong>tokenId</strong>: BigNumber) {<br>    const hxToken = ethers.utils.arrayify(<br>      utils.zeroPad(tokenId.toHexString(), 8)<br>    );<br>    return {<br>      <strong>style_token_id</strong>: BigNumber.from(hxToken.slice(0, 4),<br>      <strong>token_id</strong>: BigNumber.from(hxToken.slice(4))<br>    };<br>  }</pre><p>A token ID that decimally reads 12884901894 translates to the hex string 0x0300000006 (or padded to 8 bytes / uint64: 0x0000000300000006), so it effectively translates to “splice #6 of style #3”.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*pxOkoiWl8KaLOX4vMetBAA.png" /></figure><h3>Shall we reduce gas fees by moving to an L2 network?</h3><p>Minimizing additional network costs for a mint on L1 should be a primary focus for each and every web3 project. At first glance Splice actually is a good candidate for L2 minting, but doing so would introduce an additional layer of architectural complexity. Remember, Splice relies on knowledge about the ownership of certain assets (the origin NFTs). To mint a Splice, the contract must ensure that the minter actually owns their origin NFTs. If you wanted to mint a Splice on an L2 network on assets that exist on L1, you’d need to create a cryptographically deterministic proof of that ownership relationship and communicate that <a href="https://developer.offchainlabs.com/docs/l1_l2_messages">using a message bridge</a> that transfers knowledge between layers. Even worse, that proof could be negated immediately after its creation by transferring the origin asset to another account which only could be remedied by locking the origin into an escrow that keeps it safe until the mint has been finalized on L2. Ultimately, you would either decide to make Splice an L2 first protocol which implies that users cannot mint Splices on mainnet or you would have to come up with a pretty smart ID gap so that users could migrate Splices from L2 to L1 that don’t collide with already existing IDs.</p><p>Given that most valuable assets are still anchored on mainnet and Splice’s primary goal is to add value to those, we believe that deploying it as a pure L1 protocol is the best way to go for now (which isn’t implying that there won’t be a Polygon, zkSync or Arbitrum version of Splice coming up anytime soon).</p><h3>How to reduce storage costs?</h3><p>The significant driver of high gas costs on Ethereum is data storage. Each storage slot on the state tree must be replicated by all participating nodes and the most expensive operation of them all is <a href="https://medium.com/coinmonks/storing-on-ethereum-analyzing-the-costs-922d41d6b316">allocating a new storage slot</a>, which occurs when new mapping elements are created or array elements are appended. As it turns out, one of the most convenient NFT additions of all times makes exhaustive use of these operations: <a href="https://docs.openzeppelin.com/contracts/4.x/api/token/erc721#ERC721Enumerable">Enumerable collections</a>. They allow clients to iterate over all items of an user, which <a href="https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.0/contracts/token/ERC721/extensions/ERC721Enumerable.sol#L25">internally is solved</a> by adding another mapping and an indexing table.</p><p>Removing this feature shaved off a third (!) of all gas points of a mint transaction and <a href="https://shiny.mirror.xyz/OUampBbIz9ebEicfGnQf5At_ReMHlZy0tB4glb9xQ0E">others report to have witnessed</a> comparable results.</p><p><a href="https://github.com/SpliceNFT/splicenft/blob/38bf9fad2e4889f33e912106501418f3d7570e3b/packages/contracts/test/gas-comparison.txt">splicenft/gas-comparison.txt at 38bf9fad2e4889f33e912106501418f3d7570e3b · SpliceNFT/splicenft</a></p><p>Another storage slot we could remove from our first draft of the Splice contract was the “heritage” of a Splice token. Turns out the only information that needs to be stored directly on chain is the provenance hash (32 bytes) of a Splice’s heritage to figure out whether an item already had been minted. This optimization reduced the amount of gas used for a mint by another 30%.</p><h4>Where to store the origin information then? The Graph to the rescue!</h4><p>With every storage slot that you save on chain you lose some amount of functionality. When applying the aforementioned optimizations we lost two important view functions that formerly could be requested directly on chain: 1. <em>what is the exact origin of a Splice token</em> and 2. <em>which Splice tokens are owned by an account</em>.</p><p>It turns out both features are perfect candidates to be indexed by and queried from a <a href="https://thegraph.com/en/">subgraph</a>. Subgraphs consist of WASM (AssemblyScript) based indexing scripts that are executed on indexer nodes to build up a secondary database of onchain information and make it publicly queryable using a GraphQL API. Though The Graph offers a fully decentralized way to deploy subgraphs on an incentivized indexing and curation layer, we chose to go with their pretty convenient (and free) <a href="https://thegraph.com/hosted-service/">hosted service</a>.</p><p>A subgraph mapping listens to the events emitted by a contract and reacts to them accordingly. In Splice a minting transaction emits two events: a custom Minted(bytes32 origin, uint64 token_id, uint32 style_token_id) and Transfer (emitted by the base ERC721 contract). Note that you still cannot figure out the origin collection or token id just by following Minted events: what we actually have to analyze are the <strong>transaction inputs</strong> for the mint call that emitted the event. Our subgraph’s handleMinted handler shows how to achieve that:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/601755bae60bb50660d950f4b868a933/href">https://medium.com/media/601755bae60bb50660d950f4b868a933/href</a></iframe><p>After extracting some unencoded values from our Mint event we’re getting the input data of the initiating mint method call (line 18) and strip off the method signature’s first 4 bytes. Now we’re hitting a shortcoming of the underlying <a href="https://github.com/graphprotocol/ethabi">ABI decoder’s Rust implementation</a>: it can only decode single values, e.g. tuples, uints or arrays but it is <strong>not</strong> capable of decoding plain function calls directly like those stored in event.transaction.input. The cheat we used to trick the decoder into decoding our function calls correctly is to prefix the argument with the <a href="https://docs.soliditylang.org/en/latest/abi-spec.html#handling-tuple-types">ABI encoder’s signature for tuple types</a> (0x20) and have the decoder operate on that value instead (line 21–32):</p><pre>const decoded = ethereum.decode(<br>    &#39;<strong>(address[],uint[],uint,bytes32[],bytes)</strong>&#39;,<br>    tupleInputBytes<br>);</pre><p>We’ve also created a Rust sample that proves this approach to work:</p><p><a href="https://github.com/SpliceNFT/splicenft/blob/main/packages/subgraph/testdecode/src/main.rs">splicenft/main.rs at main · SpliceNFT/splicenft</a></p><p>The Splice subgraph is openly available for queries on The Graph’s hosted service: <a href="https://thegraph.com/hosted-service/subgraph/elmariachi111/splicemultirinkeby">https://thegraph.com/hosted-service/subgraph/elmariachi111/splicemultirinkeby</a> and it powers e.g. the <a href="https://getsplice.io/#/my-splices">“My Splices” page of the Splice Dapp</a>. (Note, that for still undiscovered reasons the GraphQL schema’s plural version of splice is spliceice)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*MMUehXOUyUkiBXFngWKpZg.png" /><figcaption>a query to retrieve all splice tokens owned by an user</figcaption></figure><h3>How to keep payments safe?</h3><p>Finally we took great care that all payments hitting our contracts are kept as safe as possible with regards to <a href="https://consensys.github.io/smart-contract-best-practices/recommendations/#favor-pull-over-push-for-external-calls">Consensys’ smart contract best practices for security</a>. We’re not pushing minting fees to the recipients but rather ask them to withdraw them by issuing a pull transaction themselves. To keep funds safe for all participants we’ve integrated an <a href="https://medium.com/@ethdapp/using-the-openzeppelin-escrow-library-6384f22caa99">internal token </a><a href="https://medium.com/@ethdapp/using-the-openzeppelin-escrow-library-6384f22caa99">escrow</a> that only transfers funds to entitled participants and that’s owned by the main contract so nobody could hijack the escrow itself. Upon minting all fees are split according to the currently active protocol settings (85% for artists, 15% for Splice) and escrowed until withdrawn by their beneficiaries:</p><pre>import &#39;@openzeppelin/contracts-upgradeable/utils/escrow/EscrowUpgradeable.sol&#39;;</pre><pre>EscrowUpgradeable private <strong>feesEscrow</strong>;</pre><pre>function initialize(...) public initializer {<br>  /// ...<br>  feesEscrow = new <strong>EscrowUpgradeable</strong>();<br>  feesEscrow.initialize();<br>}</pre><pre>function withdrawShares() external nonReentrant whenNotPaused {<br>    uint256 balance = shareBalanceOf(msg.sender);<br>    feesEscrow.<strong>withdraw</strong>(payable(msg.sender));<br>    emit Withdrawn(msg.sender, balance);<br>}</pre><pre>function shareBalanceOf(address payee) public view returns (uint256) {<br>  return feesEscrow.<strong>depositsOf</strong>(payee);<br>}</pre><pre>//called inside the mint method<br>function splitMintFee(uint256 amount, uint32 style_token_id) internal {<br>  uint256 feeForArtist = ARTIST_SHARE * (amount / 100);<br>  uint256 feeForPlatform = amount - feeForArtist;<br>  address beneficiaryArtist = styleNFT.ownerOf(style_token_id);<br>  feesEscrow.<strong>deposit</strong>{ value: feeForArtist }(beneficiaryArtist);<br>  feesEscrow.<strong>deposit</strong>{ value: feeForPlatform }(platformBeneficiary);                                 }</pre><h3>Rollup</h3><p>We certainly could’ve talked about a lot of other learnings we’ve discovered during the implementation of the Splice protocol. First and foremost we can recommend one thing, though: read the code of public contracts yourself! You’ll stumble upon a lot of stuff others have figured out before you. In our case we learnt a lot by analysing the contracts of <a href="https://etherscan.io/address/0xa7d8d9ef8d8ce8992df33d8b8cf4aebabd5bd270#code">ArtBlocks</a>, <a href="https://etherscan.io/address/0xd31fc221d2b0e0321c43e9f6824b26ebfff01d7d#code">Brotchain</a> and <a href="https://etherscan.io/address/0xc631164b6cb1340b5123c9162f8558c866de1926#code">Divine Anarchy</a>.</p><p>If you like what you’ve read and you want to become part of the Splice journey, don’t hesitate to approach us directly on Discord or on Twitter. You also might find it helpful to read our <a href="https://splicenft.github.io/splicenft/developers/">documentation for developers</a> to gain more insights about the Splice protocol’s inner workings. We’re happy to take any questions and suggestions.</p><blockquote>Join Coinmonks <a href="https://t.me/coincodecap">Telegram Channel</a> and <a href="https://www.youtube.com/c/coinmonks/videos">Youtube Channel</a> learn about crypto trading and investing</blockquote><h4>Also Read</h4><ul><li><a href="https://medium.com/coinmonks/leveraged-token-3f5257808b22">An ultimate guide to Leveraged Token [Bull Token]</a></li><li><a href="https://blog.coincodecap.com/crypto-exchange">Best Crypto Exchange | Top 10 cryptocurrency exchanges 2022 | CoinCodeCap</a></li><li><a href="https://blog.coincodecap.com/best-swap-platforms">Best Crypto Swap Platforms in 2022 | CoinCodeCap</a></li><li><a href="https://medium.com/coinmonks/top-5-crypto-lending-platforms-in-2020-that-you-need-to-know-a1b675cec3fa">6 BEST Crypto Lending Platforms — Crypto Loan Sites</a></li><li><a href="https://medium.com/coinmonks/the-best-cryptocurrency-hardware-wallets-of-2020-e28b1c124069">11 Best Hardware Wallet Reviews &amp; Comparisons 2024</a></li><li><a href="https://medium.com/coinmonks/crypto-trading-bot-c2ffce8acb2a">10 Best FREE Crypto Trading Bots in 2023</a></li><li><a href="https://medium.com/coinmonks/best-crypto-signals-telegram-5785cdbc4b2b">5 Best Crypto Telegram Channels 2024 (Trading Signals)</a></li><li><a href="https://blog.coincodecap.com/bitsgap-review">Bitsgap Review - Trading Bots Crypto Signals and Arbitrage 2022 | CoinCodeCap</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=995dbb7bc2d6" width="1" height="1" alt=""><hr><p><a href="https://medium.com/coinmonks/7-key-insights-for-smart-contract-developers-what-weve-learned-building-splice-995dbb7bc2d6">7 Key Insights for Smart Contract Developers: What We’ve Learned Building Splice</a> was originally published in <a href="https://medium.com/coinmonks">Coinmonks</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Last Introduction to Web3 / Ethereum For Developers]]></title>
            <link>https://medium.com/t14g/the-last-introduction-to-web3-ethereum-for-developers-47cc6578a9b8?source=rss-53cacc38e8a4------2</link>
            <guid isPermaLink="false">https://medium.com/p/47cc6578a9b8</guid>
            <category><![CDATA[ethereum]]></category>
            <category><![CDATA[smart-contracts]]></category>
            <category><![CDATA[solidity]]></category>
            <category><![CDATA[blockchain]]></category>
            <category><![CDATA[web3]]></category>
            <dc:creator><![CDATA[Stefan Adolf]]></dc:creator>
            <pubDate>Fri, 22 Oct 2021 14:26:44 GMT</pubDate>
            <atom:updated>2021-10-25T07:53:13.283Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ltXP4WUe487EjlU8oadG_A.png" /></figure><p>Over the past couple of months, we’ve been onboarding at least a dozen web3 developers to our team. In order to get them started, we’ve written numerous demos, built prototypes, and even initiated an internal Confluent “ledger academy”, which gets lost in so many details you can spend an entire week parsing through it. Fact is: if you’re looking to get started, the interwebs already contain countless useful resources to help you. Still, for those just setting out on their web3 journey, it can be really overwhelming.</p><p>So, I decided to assemble this guide to point you in the right direction, as well as answer some questions that I have answered many times over during onboarding processes. If you want to get started for real, make sure to follow all the official sources I’ve listed. The goal of this document is to walk you from “basic” to “advanced”. If I’m missing something valuable, please let me know in the comments.</p><p>Much of the code you’ll read throughout this document is written in <a href="https://www.typescriptlang.org/">TypeScript</a>. Why? Decentralized applications’ frontends usually run inside browser contexts. Plus: we cannot think of any chain, protocol or service that <em>doesn’t</em> come with a Javascript-compatible SDK. So, we’re considering Java-/Typescript the lingua franca to working with decentralized tech stacks. If you’re not familiar with it: <a href="https://github.com/nvm-sh/nvm">NVM</a> lets you install many different, isolated local node instances without leaving any traces on your harddisk, <a href="https://classic.yarnpkg.com/lang/en/">yarn</a> and <a href="https://pnpm.io/">pnpm</a> are splendid package managers and <a href="https://code.visualstudio.com/">Visual Studio Code</a> is an IDE that will never let you down.</p><p>A side note on the overwhelmingly hard to understand Javascript’s “bundler” ecosystem: we found that building web3 applications using the latest bundlers / compilers like esbuild, Vite or even Parcel is depressingly unpredictable. We definitely recommend staying on the established <a href="https://create-react-app.dev/docs/getting-started#creating-a-typescript-app">Create React App</a> / webpack bundling track (Nextjs is also a fantastic framework to build decentralized apps).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bkCGTWKChamhIOkDFa_MGw.png" /></figure><h3>web3: a primer</h3><p>Web3 is a collective phrase for decentralized tech stacks. It’s mostly associated with <a href="https://ethereum.org/en/">Ethereum</a> / <a href="https://ipfs.io/">IPFS</a> but it’s also a heavily used phrase for <a href="https://polkadot.network/">Polkadot</a> / <a href="https://kusama.network/">Kusama</a> / <a href="https://www.parity.io/technologies/substrate/">Substrate</a> / <a href="https://solana.com/">Solana</a> apps. In a nutshell, it stands for any application that doesn’t rely on a “Single Point of Failure”. More precisely, it describes a way of development, deployment and interaction of applications that are unstoppable and uncontrollable by anyone, thanks to distributed infrastructure such as blockchains.</p><p>Web3 apps are permissionless by definition. Everyone can access and interact with them. That doesn’t mean everybody can do what they want; there are well known methods to add access restrictions, role based access and even identity checks to protect them from random access. In contrast to traditional role management systems, those rules are enforced by cryptography and blockchain-based smart contracts. Once written correctly, they are fully uncompromiseable and unbreakable.</p><p>Since web3 apps are running in a <strong>d</strong>ecentralized environment, they’re also referred to as <strong>Dapps</strong>. While not restricted to them, Dapps mostly make use of either “content addressable storage networks” such as IPFS, and some kind of unstoppable, consensus based database, most likely a blockchain such as Ethereum.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bkCGTWKChamhIOkDFa_MGw.png" /></figure><h3>Ethereum: a world computer.</h3><p><a href="https://ethereum.org/en/">Ethereum</a> is an account-based blockchain running on interplanetary scale that executes custom binary code during transaction validation. It’s (<a href="https://ethereum.org/en/eth2/">still</a>) using a <a href="https://ethereum.org/en/developers/docs/consensus-mechanisms/pow/">Proof of Work</a> consensus model that incentivizes miners to spend a lot of computing power to secure the network. Ethereum (mainnet) is migrating towards a dramatically more environment friendly <a href="https://consensys.net/blog/blockchain-explained/what-is-proof-of-stake/">Proof of Stake</a> Consensus since 2015 and the current ETA of that “<a href="https://www.youtube.com/watch?v=uF3gjbyhUCA">migration</a>” is <a href="https://ethos.dev/ethereum-2020-roadmap/">around 2022</a>.</p><p>Both consensus models are proven to be secure in a massively adversary environment and they are locking <a href="https://defipulse.com/">hundreds of billions of USD</a> value on many chains. There are <a href="https://appinventiv.com/blog/blockchain-consensus-algorithms-guide/">lots</a> <a href="https://www.persistent.com/wp-content/uploads/2017/04/WP-Understanding-Blockchain-Consensus-Models.pdf">of</a> <a href="https://3commas.io/blog/blockchain-consensus-algorithms">other</a> <a href="https://medium.com/@BangBitTech/what-is-consensus-algorithm-in-blockchain-different-types-of-consensus-models-12cce443fc77">consensus</a> <a href="https://www.sciencedirect.com/science/article/pii/S240595951930164X">models</a> out there and most of them deal with increasing <a href="https://solana.com/">transaction throughput</a>, <a href="https://near.org/">ease of setup</a>, <a href="https://hedera.com/">resource optimization</a> etc. Though, to be honest, as of today not one of them has been proven to work as well as PoW.</p><p>The original “distributed consensus” term goes back to fail safe systems from the 70s, where people described the “<a href="https://en.wikipedia.org/wiki/Byzantine_fault">Byzantine Generals Problem</a>” leading to algorithms like <a href="https://www.geeksforgeeks.org/practical-byzantine-fault-tolerancepbft/">PBFT</a> (see <a href="https://cosmos.network/">Cosmos</a> / <a href="https://tendermint.com/">Tendermint</a>). Other very well understood (permissioned and not distributed) consensus algorithms are <a href="https://medium.com/distributed-knowledge/paxos-consensus-for-beginners-1b8519d3360f">Paxos</a> and <a href="https://raft.github.io/">Raft</a>, which are used in distributed database / event streaming systems such as <a href="https://cassandra.apache.org/doc/latest/architecture/guarantees.html">Apache Cassandra</a>, <a href="https://www.confluent.io/blog/distributed-consensus-reloaded-apache-zookeeper-and-replication-in-kafka/">Kafka</a> or <a href="https://betterprogramming.pub/demystifying-consensus-algorithms-and-their-implementations-c52f8aca3020">etcd</a>.</p><h4>Do you actually need a blockchain?</h4><p>A common question people ask is: “<em>Do you actually need a blockchain for this?</em>” and mostly the answer will be <em>no</em>. For a lot of traditional business applications, using blockchain technology doesn’t add much value, but tenfold more complexity instead. There are two reasons when introducing blockchain technology makes absolute sense, though.</p><ul><li>First, when you need to interact with other economic parts on an existing, most likely public blockchain. On Ethereum, you find ten thousands of contracts that keep trillions of tokens, are worth billions of dollars and are all publicly available, waiting to accept your transactions.</li><li>Second, if you’re building huge industrial consortia consisting of hundreds of players that neither know nor trust each other nor can agree on common infrastructure components.</li></ul><p>Blockchains bear a promise of total transparency and interoperability. That’s why they are an ideal tech stack to build database-like systems that many partners can attach to without having to deal with ever changing API definitions or political onboarding processes. Identity ledgers like <a href="https://sovrin.org/">Sovrin</a> / <a href="https://www.hyperledger.org/use/hyperledger-indy">Indy</a> or global supply chain systems with thousands of unacquainted logistics partners are very good candidates.</p><p>You most certainly will not need blockchains to enhance operations of only one company and you for sure won’t need one to run behind a single ecommerce application (which might be a different story if you’re building global marketplaces as we do at <a href="https://turbinekreuzberg.com/en">Turbine Kreuzberg</a>).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bkCGTWKChamhIOkDFa_MGw.png" /></figure><h3>Smart Contracts</h3><p>Ethereum is the foundational tech stack for blockchain based applications. Even though it can seem hard to grasp in the beginning, it’s really the simplest to understand. As a developer, you don’t have to understand all of its inner workings. Still, there is one thing you really must get: you can write programs on your local machine in various programming languages, the most prominent one being <a href="https://docs.soliditylang.org/">Solidity</a>, a <a href="https://www.quora.com/Is-solidity-turing-complete?">Turing complete</a> language, you compile them with a binary / intermediary compiler (solc), wrap the resulting byte code in a transaction and “deploy” that to the Ethereum blockchain.</p><p>The deployed code is what is called a “<strong>smart contract</strong>”. It can be accessed by all other acting entities on the Ethereum chain, either Externally Owned Accounts (EOAs), which are humans or wallets operated by bloodbags or other smart contracts. The runtime that executes smart contracts is called “<strong>Ethereum Virtual Machine</strong>” / <a href="https://ethereum.org/en/developers/docs/evm/">EVM</a>. Since contract code is triggered by transactions that are issued on a globally consented unique application state, the result of its execution will lead to exactly the same result every single time. Therefore, smart contracts are nothing but a fully deterministic, <a href="https://blog.bernd-ruecker.com/how-we-built-a-highly-scalable-distributed-state-machine-f2595e3c0422">distributed state machine</a>.</p><h4>Wallets and Keys</h4><p>Let’s quickly define what we mean by <em>interacting</em> here: every operation on the Ethereum ledger is triggered by something called a <strong>transaction. </strong>In its simplest form, a transaction is moving funds from one account to another. Most often, they’re used to invoke functions on smart contracts. Each transaction is signed with the private key of an EOA (a user) and can contain payload data.</p><p><strong>Private keys</strong> are the fundamental security guarantee, your “login credentials” to the blockchain world, if you will. They’re an ultimate secret and are therefore kept inside <strong>wallet</strong> applications secured on the end users’ devices. Usually a “wallet” represents some 32 byte random seed number that can be recovered by / stored in a 12 / 24 words phrase, which you should put on a piece of paper and store in a secure place (read: not digitally!). You can use this seed phrase to recover your random wallet seed and derive an arbitrary amount of accounts from it using a <a href="https://medium.com/myetherwallet/hd-wallets-and-derivation-paths-explained-865a643c7bf2">keychain derivation path</a> according to <a href="https://www.bip32.net/">BIP-32</a> (<a href="https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki">official source</a>). Note: inthe developer world a seed phrase is often referred to as <strong>Mnemonic</strong>. The most well known and widely used wallet in the Ethereum space for developers and users alike is called <a href="https://metamask.io/">Metamask</a>, a browser extension you should download and install right now.</p><blockquote><strong>WARNING — </strong>Even though this should be obvious, never, ever, on an astronomical scale of endless NEVER! should you use your seed phrase anywhere other than in a wallet application you trust. Don’t even put it on any “trusted” cloud setup, don’t copy and paste it into computer memory and for sure not on any website, for god’s sake. Don’t even think about sending it in an email! It belongs to you. When developing, make quadruple sure that the seeds you use for development are really different from the ones you use privately.</blockquote><h4>Transaction Priority / Gas</h4><p>A final concept to understand for decentralized apps is how they deal with congestion. If everyone in the world tries to update the global state at the same time, a distributed state machine based on a single state tree (as Ethereum is) cannot write all their transactions simultaneously. It must wait for the global consensus layer to agree on a transaction ordering. This imposes a major bottleneck in the operational speeds of blockchain networks. That leads us to the question: how does the protocol know, under high load, which transactions it should accept first? Ethereum’s answer (and <a href="https://changelly.com/blog/what-is-sharding/">there</a> <a href="https://hackernoon.com/proof-of-stake-is-coming-of-age-and-polkadot-is-leading-the-pack-xzh33jq">are</a> <a href="https://docs.solana.com/introduction#why-solana">others</a>) is the concept of <a href="https://ethereum.org/en/developers/docs/gas/"><strong>Gas</strong></a>.</p><p>Gas is a virtual value unit that is required by the EVM to execute any state changing code. When a transaction triggers smart contract code and this code will change the contract’s state (e.g. their account balance) during execution, e.g. by assigning a new value to a member variable of the contract, this opcode execution costs <a href="https://docs.google.com/spreadsheets/d/1m89CVujrQe5LAFJ8-YAUCcNK950dUzMQPMJBxRtGCqs/edit#gid=0">a predefined amount</a> of Gas.</p><p>Gas itself doesn’t translate to a monetary value. Instead, users of the network must <a href="https://www.blocknative.com/gas-estimator">estimate a competitive price</a> compared to all other users (commonly calculated in a fractional unit of Eth, the so called <a href="https://www.languagesandnumbers.com/articles/en/ethereum-ether-units/">Gwei or Shannon</a>) for their transaction. They then send this amount along with their transaction, effectively making it a transaction fee. Gas is “consumed” during contract execution and surplus gas is refunded to the caller’s account. If your transaction fails because the executing smart contract reverts its execution, you won’t lose any assets involved in that transaction, but you’ll lose the gas you sent along.</p><p>An advanced word of notice: before the <a href="https://medium.com/loom-network/what-you-need-to-know-about-eip-1559-603129db5782">rollout of EIP-1559</a>, all gas costs had been paid out as an incentive for block miners, which led to a somewhat overincentivized network situation, where people earned far more money than necessary for the security and stability of Ethereum. After EIP-1559, gas is consumed by miners totally differently than it has been before (the so called “base fee” is actually <a href="https://watchtheburn.com/"><strong>burnt</strong> by the protocol</a>), but you as a developer shouldn’t notice the effects of this update at all.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/318/1*yB-bMy2o9dXIaA9RifrveQ.png" /><figcaption>the gas fee calculation dialog of MetaMask</figcaption></figure><p>You can find deep introductions on Ethereum <a href="https://ethereum.org/en/what-is-ethereum/">at Ethereum’s funding company Consensys</a>, and more developer centric introductions at <a href="https://docs.ethhub.io/">EthHub</a>. As I said, the most used wallet app by far is <a href="https://metamask.io/"><strong>Metamask</strong></a>, which runs as <a href="https://metamask.io/">browser extension</a> or as a <a href="https://play.google.com/store/apps/details?id=io.metamask&amp;hl=en_US&amp;ref=producthunt&amp;_branch_match_id=872822649690417812">mobile app</a> (React Native). You can also start with the very basics and sign transactions using Consensys’ official <a href="https://docs.ethsigner.consensys.net/en/stable/">EthSigner</a>, or choose another Dapp wallet.</p><p>There’s a deep <a href="https://soliditylang.org/">official documentation for Solidity</a> and you can code right away using the browser based <a href="https://remix.ethereum.org/">Remix IDE</a> or using <a href="https://marketplace.visualstudio.com/items?itemName=JuanBlanco.solidity">Visual Studio Code extensions</a>. To play around with seed phrases and keys, here’s a basic <a href="https://www.npmjs.com/package/ethereum-hdwallet">hd wallet repo</a>, and the Truffle Suite’s <a href="https://github.com/trufflesuite/truffle/tree/develop/packages/hdwallet-provider">HD Wallet provider</a> or the <a href="https://www.npmjs.com/package/ethereumjs-wallet">“original” EthereumJS wallet repo</a>.</p><h4>Network Nodes, Private- and Testnets</h4><p>The fundamental idea of blockchains is that you don’t have to (read: must never) trust anyone to add transactions to the ledger database — no bank, no service, no SaaS. Hence you <em>can</em> run a blockchain node on your own machine and talk to it via its <a href="https://www.jsonrpc.org/specification">JSON-RPC</a> interface (which is a tiny spec to invoke exposed functions using JSON objects, eventually using HTTP as transport layer).</p><p>While it’s certainly fun to do so, <strong>you don’t need your own node</strong> to interact with any network (besides your local, single node devnet of course, see below). Services like <a href="https://www.alchemy.com/">Alchemy</a>, <a href="https://infura.io/">Infura</a> or <a href="https://www.anyblockanalytics.com/">Anyblock</a> offer access with quite generous free tiers to Ethereum nodes on all networks. Dapps that run in browsers and are connected to Metamask actually access the blockchain nodes that Metamask relies on (they’re effectively run by <a href="https://www.jsonrpc.org/specification">Infura</a>, a Consensys company).</p><p>But let’s say you’re feeling adventurous and want to run it for yourself. That’s why we’re developers, right? Then you have several options for Ethereum: the official node software is <a href="https://geth.ethereum.org/">Geth</a> (Go), a formerly abandoned and now slightly more active one is <a href="https://openethereum.org/">OpenEthereum</a> (Rust) and then there’s <a href="https://besu.hyperledger.org/en/stable/">Besu</a> (Java, Hyperledger / IBM) and <a href="https://nethermind.io/">Nethermind</a> (.NET).</p><p>In their default config, all those Ethereum clients are compatible to Ethereum mainnet: upon startup they’ll try to find neighbor nodes, exchange messages with them, download block headers, verify and rebuild the Ethereum chain state on your machine and finally join the network. You can even use those nodes to mine Ethereum blocks on your own, but that’s far out of scope of this article and totally unfeasible to achieve on average developer boxes.</p><p>Syncing Ethereum mainnet is a humongous task and needs a lot of computing power, RAM, bandwidth and storage alike (you’ll need Terabytes of NVMe SSD space!). Depending on the client you use, you have several options to sync. In Geth terms they’re called <a href="https://docs.ethhub.io/using-ethereum/ethereum-clients/geth/">“light”, “fast” and “full” </a>and you can activate a “tracing” feature that will add even more state data to it.</p><p>If you want to use a node to simply interact with smart contracts, a non-archive node does the job. Syncing requires ~3–7 days on a well equipped machine. <a href="https://tjayrush.medium.com/building-your-own-ethereum-archive-node-72c014affc09">Archive nodes</a> keep state trees for all chain states in history and consume more than <a href="https://etherscan.io/chartsync/chainarchive+">7TB SSD</a> hard disk space. They can be used if you want to analyse smart contract history, e.g. when writing applications that need to figure out what happened in the past to do predictions about the future, writing wallet apps with history support or chain explorers.</p><p>As a developer, you certainly won’t start your Ethereum development endeavours on mainnet. Therefore, the community is running 4 official <strong>testnets</strong> which differ in consensus protocols and speed, but <a href="https://medium.com/compound-finance/the-beginners-guide-to-using-an-ethereum-test-network-95bbbc85fc1d">from a developers perspective</a> they’re perfectly compatible to mainnet: <a href="https://ropsten.etherscan.io/">Ropsten</a>, <a href="https://kovan-testnet.github.io/website/">Kovan</a>, <a href="https://gist.github.com/cryptogoth/10a98e8078cfd69f7ca892ddbdcf26bc">Rinkeby</a> and <a href="https://goerli.net/">Goerli</a>. Most of those networks are either set up with a low difficulty PoW or use a controlled consensus module, also known as “<a href="https://openethereum.github.io/Proof-of-Authority-Chains">Proof of Authority</a>” that allows predefined signers (or sealers or verifiers) to sign and issue blocks.</p><p>The Ethereum base currency has no real value on testnets so you can use <strong>faucet apps</strong> which are giving away testnet Ether for free (<a href="https://testnet.help/en/ethfaucet/ropsten">Ropsten</a>, <a href="https://gitter.im/kovan-testnet/faucet">Kovan</a>, <a href="https://faucet.rinkeby.io/">Rinkeby</a>, <a href="https://faucet.goerli.mudit.blog/">Goerli</a>). Which testnet is best suited for your development needs depends on many factors, and they’re not all stable all the time. <a href="https://ethereum.stackexchange.com/questions/27048/comparison-of-the-different-testnets">Here’s a Stackoverflow answer</a> that might clarify things better than I ever could. To sync the Goerli testnet using geth, you simply can:</p><pre>geth --goerli --syncmode &quot;full&quot; dumpconfig &gt; goerli.toml<br>geth --goerli --config goerli.toml</pre><p>and depending on your bandwidth your node should be in sync after ~10 hours of downloading and validation. At the time of writing (2021) the full Goerli blockchain consumes around 43GB of harddisk space.</p><h4>Running a local network / devnet</h4><p>You can actually use Ethereum clients to setup your very own PoA network, too, which requires running several nodes and validators that operate on the <a href="https://eips.ethereum.org/EIPS/eip-225">Clique</a> or <a href="https://openethereum.github.io/Pluggable-Consensus#Aura">AuRA</a> PoA consensus modules.</p><p>Deploying and executing smart contracts on testnets still is <a href="https://github.com/trufflesuite/truffle/issues/3356">cumbersome, error prone and laggy</a>, so as a developer you can go for a much simpler solution: running your very own Ethereum devnet locally. For this you only need a node that runs on the most primitive, unvalidated “instant seal consensus”. The most well known node software to run a local Ethereum devnet is <a href="https://www.trufflesuite.com/ganache">ganache</a> (part of the <a href="https://www.trufflesuite.com/">truffle suite</a>). You can run it as a standalone desktop app which comes with its own chain explorer or using Docker. Here’s a docker-compose snippet we often use to share a ganache instance with several apps:</p><pre>version: &quot;3.7&quot;<br>services:<br>  ganache:<br>    image: trufflesuite/ganache-cli<br>    entrypoint:<br>      - node<br>      - /app/ganache-core.docker.cli.js<br>      - --deterministic<br>      - --db=/ganache_data<br>      - --mnemonic=${MNEMONIC}<br>      - --chainId=5779<br>      - --networkId=5779<br>      - --gasPrice=5e9<br>    volumes:<br>      - .ganache:/ganache_data<br>    ports:<br>      - &quot;7545:8545&quot;</pre><p>For testing reasons you can run a fully fledged ganache node right inside your test suite. This is how we do it:</p><pre>//@ts-ignore<br>import ganache from &#39;ganache-cli&#39;;<br>import Web3 from &#39;web3&#39;;</pre><pre>const MNEMONIC = &#39;...&#39;;</pre><pre>const provider = ganache.provider({<br>    mnemonic: MNEMONIC,<br>    total_accounts: 10,<br>    default_balance_ether: 100<br>});<br>const web3 = new Web3(provider);</pre><pre>export default web3;</pre><p>Now is the right time to wonder about the “provider” and “web3” objects. Let’s dig into them.</p><h4>Interacting with Ethereum from your code: web3.js, ethers and providers</h4><p>It’s sometimes hard to decide the terms “agent”, “wallet” and “provider”. Most commonly a provider is a service object that connects to a node and talks to it using <a href="https://eth.wiki/json-rpc/API">its low level JSON RPC API</a>. Additionally, a provider is usually “authenticated” upon construction, which means that it acts on behalf of the user. When writing non production code or tests, you’re usually using providers with direct access to private keys or Mnemonics but in a real environment you’re talking with a given provider’s web3 interface so you’ll never get in touch with a user’s private key or seed phrase.</p><p>Mental note: <strong>you will <em>never</em> ask for any user’s private key</strong>, even if it might simplify your life. If you’re tempted to do so, you certainly need to learn more about wallets, their APIs, environment variables or different ways to implement the problem you’re trying to solve.</p><p>For now, here’s a simple code sample that starts a local Ganache based Ethereum node and then uses web3.js to interact with it. When visiting the /transact endpoint, it’ll send 1_000_000 wei (the smallest amount <a href="https://www.investopedia.com/terms/w/wei.asp">you can break an Ether into</a>) from account[0] to account[1] and displays the transaction receipt.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fcodesandbox.io%2Fembed%2Fs9msh&amp;display_name=CodeSandbox&amp;url=https%3A%2F%2Fcodesandbox.io%2Fs%2Fs9msh&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=codesandbox" width="1000" height="500" frameborder="0" scrolling="no"><a href="https://medium.com/media/35371a2430d5e4bf79510e03ca0ee1ed/href">https://medium.com/media/35371a2430d5e4bf79510e03ca0ee1ed/href</a></iframe><p>Note, that web3.js uses a (rather weird, but very practical) concept of PromiEvents that mix a <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise">promise</a> with an <a href="https://nodejs.dev/learn/the-nodejs-event-emitter">event emitter</a>. The local Ganache node creates a block with that transaction immediately so another call to / will show you the current balances. In a real world application (also on testnets), the transaction will take some time (15 seconds on testnets, longer on mainnet) to pass through the consensus protocol. You can use the event emitter part of a PromiEvent to listen for transaction confirmations and finality.</p><p>On a high level, you just witnessed how transactions are published to the Ethereum network, using web3’s <a href="https://web3js.readthedocs.io/en/v1.3.4/web3-eth.html#sendtransaction">sendTransaction</a> method:</p><pre>const receipt = await web3.eth.<strong>sendTransaction</strong>({<br>    from: accounts[0],<br>    to: accounts[1], <br>    value: 10*1e5<br>})</pre><p>That looks fairly simple, but there’s quite a bit of stuff going on under the hood:</p><ul><li>it checks whether the bound provider to web3.eth has access to the wallet of accounts[0]. It has, because that’s how we created it.</li><li>it assembles an <a href="https://web3js.readthedocs.io/en/v1.5.2/web3-eth.html#id85">Ethereum transaction request object</a> out of the given parameters.</li><li>it guesses a gas limit (maximum gas for execution) for the operation involved (transferring an eth value from one account to another costs <a href="https://ethereum.org/en/developers/docs/gas/">21000 gas</a>)</li><li>it increments the latest <a href="https://ethereum.org/en/developers/docs/accounts/#an-account-examined">nonce</a> of account[0] so the chain knows about the ordering of incoming transactions of that account.</li><li>it guesses the right network configuration for the transaction according to the underlying provider object.</li><li>it uses account[0] ‘s private key to sign the transaction object.</li><li>it assembles a signed transaction request that looks like:</li></ul><pre>{<br>    &quot;nonce&quot;: 4,<br>    &quot;gasPrice&quot;: {<br>      &quot;type&quot;: &quot;BigNumber&quot;,<br>      &quot;hex&quot;: &quot;0x0f4240&quot;<br>    },<br>    &quot;gasLimit&quot;: {<br>      &quot;type&quot;: &quot;BigNumber&quot;,<br>      &quot;hex&quot;: &quot;0x5208&quot;<br>    },<br>    &quot;to&quot;: &quot;0x6FaAB23372f372aB4B8F70C54CD15b4262847f32&quot;,<br>    &quot;value&quot;: {<br>      &quot;type&quot;: &quot;BigNumber&quot;,<br>      &quot;hex&quot;: &quot;0x0f4240&quot;<br>    },<br>    &quot;data&quot;: &quot;0x&quot;,<br>    &quot;chainId&quot;: 0,<br>    &quot;v&quot;: 27,<br>    &quot;r&quot;: &quot;0xb41e39cbee80b6a2d4d7ab7754553e3ac36901fc00656aad407d032650eb72e7&quot;,<br>    &quot;s&quot;: &quot;0x1230e25a4968cb62bbdd0aa857f6886ff810f03ef7339d20413e45955ed0038a&quot;,<br>    &quot;from&quot;: &quot;0xDC0a90a51E34D7b497df931679b47e0697B82d5E&quot;,<br>    &quot;hash&quot;: &quot;0xee24c3cd5f2bc9ce0eb429c67e08ee959233526958bf1b497c440f3a3a7caeac&quot;,<br>    &quot;type&quot;: null<br>  }</pre><ul><li>it promotes the signed transaction in binary encoding to the provider, using JSON-RPC</li><li>it passes through the transaction receipt to the client</li><li>it attaches a subscriber to the provider to get notified when the transaction is finally confirmed.</li></ul><h4>ethers.js</h4><p>Besides web3.js, there’s the acclaimed <a href="https://docs.ethers.io/v5/">ethers.js</a> library, which is getting even more attention than web3.js lately and for many reasons. The most crucial difference is its consequent distinction of <a href="https://docs.ethers.io/v5/api/providers/">providers</a> and <a href="https://docs.ethers.io/v5/api/signer/">signers</a>. To demonstrate that, I rewrote the above web3 example for ethers.js with manual transaction signing (ethers.js of course also comes with a <a href="https://docs.ethers.io/v5/api/signer/#Signer-signTransaction">sendTransactions convenience method</a>). Again, make sure to invoke the /transact endpoint to send transfer transactions:</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fcodesandbox.io%2Fembed%2F1hr39&amp;display_name=CodeSandbox&amp;url=https%3A%2F%2Fcodesandbox.io%2Fs%2F1hr39&amp;image=https%3A%2F%2Fcodesandbox.io%2Fapi%2Fv1%2Fsandboxes%2F1hr39%2Fscreenshot.png&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=codesandbox" width="1000" height="500" frameborder="0" scrolling="no"><a href="https://medium.com/media/c7962d78a5411cf1686203010f517ace/href">https://medium.com/media/c7962d78a5411cf1686203010f517ace/href</a></iframe><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bkCGTWKChamhIOkDFa_MGw.png" /></figure><h3>Smart Contract Development</h3><p>While there are others, the official language to write EVM compatible Smart Contracts is <a href="https://soliditylang.org/">Solidity</a>. If you know how to write Javascript and have a slight idea about hexadecimals, binary operations and object oriented coding, you should be able to learn and use Solidity within days.</p><p>The simplest way of getting your hands dirty using this language is the integrated, web based IDE Remix: <a href="https://remix.ethereum.org/">https://remix.ethereum.org/</a>. It lets you code, import, compile, interact and optimize smart contract code. There are so many tutorials written on getting started with it that I won’t repeat the steps here. My reading recommendation that goes beyond trivial aspects is <a href="https://betterprogramming.pub/developing-a-smart-contract-by-using-remix-ide-81ff6f44ba2f">this story</a> by <a href="https://medium.com/u/97fb35090971">Burakcan Ekici</a> from end of 2020.</p><p>To give you the simplest peek possible into Solidity, consider this code example:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/2d405209cb7b8722d52d2be2a647ee25/href">https://medium.com/media/2d405209cb7b8722d52d2be2a647ee25/href</a></iframe><p>It demonstrates the basic concepts: a smart contract feels like a class in other languages, it contains member variables and methods, it consequently uses typed parameters and it can extend other contracts (<a href="https://docs.soliditylang.org/en/latest/contracts.html#inheritance">Solidity supports multiple inheritance</a>). One special feature lies in the so called <a href="https://docs.soliditylang.org/en/latest/contracts.html#modifiers"><strong>modifiers</strong></a><strong> </strong>that are inherited by parent contracts and can annotate functions. Modifiers often act as “entry” guards, containing boundary conditions for a function call. In our simple example the onlyOwner modifier on store (inherited from Ownable) instructs the EVM to check that only the “owner”, who initially is set to the contract creator inside the derived parent constructor call, may invoke the store function.</p><p>Once you’ve written a contract like that, you can compile it using a <a href="https://github.com/ethereum/solidity/releases">Solidity compiler</a>, inside your IDE, using your <a href="https://hardhat.org/guides/compile-contracts.html">favorite toolchain</a> or just right inside Remix. A solidity compiler creates two important things: first, executable bytecode that can be interpreted by the EVM and, second, a so called <a href="https://stackoverflow.com/questions/2171177/what-is-an-application-binary-interface-abi">Application Binary Interface</a> (ABI) that contains a user- and machine readable definition of your contract’s public methods. You need the ABI, or parts of it, to instruct clients (e.g. your Web3 / Javascript Dapp), how to interact with a deployed instance of your contract code.</p><p>To actually deploy the contract, you send a large transaction containing its bytecode to an Ethereum network, including an appropriate amount of Gas (each contract deployment modifies the state of the blockchain just as every other writing transaction).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*s8aGvveDnVN9rPDYKuw5Dg.png" /><figcaption>Deploying a smart contract on Remix</figcaption></figure><p>Once a block has been mined that contains the code, the contract will get an unique address that others can use as a transaction target. A contract actually behaves like an externally owned account, only that it doesn’t have its own private key. It can call other contracts (when triggered by an external transaction) and store monetary value (e.g. Ether) and data and will react to transactions of any account (contracts or EOAs) according to the rules that are set inside the contract’s code.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*JzqW0zKS386ZJwai4W3RvQ.png" /><figcaption>Interacting with a deployed smart contract</figcaption></figure><p>I deployed the storage example contract on the Kovan testnet, and you can checkout its code, the bytecode and its ABI here: <a href="https://kovan.etherscan.io/address/0x7DA77f8a834369dDc5e9e47407C9746Ed55C3b72#code">https://kovan.etherscan.io/address/0x7DA77f8a834369dDc5e9e47407C9746Ed55C3b72#code</a>. <strong>Etherscan</strong> is by far the most prominent platform to view onchain data. If you’re wondering how the source code ended up visible on it: Etherscan allows smart contract developers to upload their sources for an already deployed contract, verifies that it’s compiling to exact deployed bytecode and then displays it to all users. This process is called “validation” and eventually involves<a href="https://medium.com/coinmonks/flattening-your-solidity-files-702dec89f0bd"> flattening your source code</a> to one large file or <a href="https://medium.com/coinmonks/flattening-your-solidity-files-702dec89f0bd">using a tool</a> that uploads all sources and dependencies at once, the most powerful of them being <a href="https://sourcify.dev/">Sourcify</a>.</p><p>If you consider interacting with the contract from within a Dapp, you’ll need the aforementioned ABI that’s generated during compilation. For our Storage contract it looks like this:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/6531bd1735274598310aa6f4183d43c3/href">https://medium.com/media/6531bd1735274598310aa6f4183d43c3/href</a></iframe><p>Libraries like ethers.js or web3.js usually wrap ABIs with a dynamic class. You can use it to transparently invoke contract methods using a connected contract instance in your client code. Client code that interacts with our contract could look like this:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/242677757ef9b332baa959046ff0ff37/href">https://medium.com/media/242677757ef9b332baa959046ff0ff37/href</a></iframe><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bkCGTWKChamhIOkDFa_MGw.png" /></figure><h3>Smart Contract Development Environments &amp; SDKs</h3><p>I already introduced you to one IDE that many developers use build smart contracts on the fly: Remix. It’s a great tool to get you started, comes with lots of plugins for virtually any contract related workflow, it has a decent user interface and is very well documented.</p><p>When you start building Dapps, it falls short though, because you’re going to have to integrate your contract code with your Dapp, share and update the ABIs inside your developer workflow or add backend code or CLI tools. There are two commonly used toolchains that allow you to build Ethereum based apps inside non trivial project repos: <a href="https://hardhat.org">Hardhat</a> (formerly Builder) and <a href="https://www.trufflesuite.com/">Truffle</a>.</p><p>In a nutshell, both are great. Emotionally, hardhat is closer related to people who like the ethers.js library and truffle is closer to web3.js. Another difference is that Truffle comes with a contract based migration concept to deploy your contracts, whereas Hardhat lets you as a developer write scripts to get your contracts deployed. Hardhat shines with (in my opinion!) slightly better intuitive support for automated tests, full Typescript integration and autogeneration of boilerplate code for typesafe usage of smart contracts, made possible by a library called <a href="https://github.com/dethcrypto/TypeChain">Typechain</a>.</p><p>Other handy tools to have a look at to get started are <a href="https://medium.com/u/610daeab315b">Austin Thomas Griffith</a>’s <a href="https://github.com/scaffold-eth/scaffold-eth">scaffold.eth</a>, <a href="https://medium.com/u/54ad3aa2f116">Paul Razvan Berg</a>’s <a href="https://github.com/PaulRBerg/create-eth-app">Create Eth App</a>, and <a href="https://oneclickdapp.com/">OneClickDapp</a> that generates a Dapp out of a deployed contract codebase.</p><h4>OpenZeppelin: audited smart contract primitives</h4><p>Building a baby storage contract like the one shown above is the tiniest tip of the iceberg above what you can achieve with smart contracts. If you’re in the Ethereum space, you likely will have heard about the tokenization of things, about Defi protocols, yield farming, decentralized exchanges, NFTs, DAOs and alike. All those are blockchain applications, built on smart contracts. Many of them make use of some very basic primitives in the Ethereum space that are known by their respective EIP numbers: <a href="https://eips.ethereum.org/EIPS/eip-20">ERC20</a>, <a href="https://eips.ethereum.org/EIPS/eip-721">ERC721</a> and <a href="https://eips.ethereum.org/EIPS/eip-1155">ERC1155</a>, which all are token standards.</p><p>Before you try to wrap your head around them yourself, rest assured: it’s nearly impossible to write safe code to implement even their most simple parts on your own. Hence nearly everyone uses a collection of base libraries to implement the most general use cases of smart contracts, and it’s called <a href="https://docs.openzeppelin.com/contracts/4.x/">OpenZeppelin Contracts</a> (OZ).</p><p>Besides token standards OZ has implementations for ownership and role based access, timelocks, counters, governance, contract proxies, enumerable mappings, introspection, math and string operations. They’re actually everywhere and I couldn’t encourage you more than to checkout them right now. Their documentation comes with lots of examples that made me understand tokens far better than any article could explain.</p><h4>Contract Upgrades</h4><p>You already might’ve wondered how you could update code on the blockchain once it has been deployed, for example if you found a bug . <strong>The short answer is: you cannot.</strong> That’s why most projects run through very <a href="https://consensys.net/diligence/">thorough</a> and <a href="https://openzeppelin.com/security-audits/">costly</a> <a href="https://www.gemini.com/cryptopedia/smart-contract-audit-crypto-hack">auditing processes</a> before they launch their contracts on mainnet. A tool that can find the most obvious issues in your code automatically is Remix’ <a href="https://sourcify.dev/">static analyzer</a> but rest assured: smart contract security is far harder to achieve than running a static code analysis tool on your code. Here are <a href="https://medium.com/cryptronics/the-5-most-common-smart-contract-vulnerabilities-738de4fae3ba">some articles</a> that might <a href="https://blaize.tech/article-type/9-most-common-smart-contract-vulnerabilities-found-by-blaize/">give you a perspective</a> of <a href="https://consensys.github.io/smart-contract-best-practices/known_attacks/">how hard it is</a> to make EVM code bullet proof in practice.</p><p>A highly acclaimed feature that OpenZeppelin therefore has in stock are <a href="https://docs.openzeppelin.com/contracts/4.x/upgradeable"><strong>upgradeable contracts</strong></a>. Their name is slightly misleading since they’re still far from being upgradeable. Instead, they’re a pattern that makes use of some advanced Solidity internals to enable so called <strong>contract proxies</strong>.</p><p>In a nutshell the idea is to first deploy a contract proxy as well as a first implementation contract and tell the proxy to use that implementation. The proxy delegates all calls to the implementation contract, but all state changes (i.e. the storage) are persisted on the proxy’s address space itself. If you decide to “upgrade” your contract with new code, you’re actually deploying a full new implementation and point the proxy to it. <a href="https://docs.openzeppelin.com/upgrades-plugins/1.x/writing-upgradeable">There are some tradeoffs here</a>, e.g. the replacement of constructors with initializing functions and a non updateable storage layout that effectively doesn’t let you update variable names and force you to extend your variable list, instead of being able to replace old variables.</p><p>Upgradeable contracts will increase your development speed and your beta releases but using them for contracts that lock millions of dollars might not be the best idea, depending how you look at their implications.</p><h4>It’s a wrap 🌯!</h4><p>There’s no way to put a TL/DR; under this article, but if I had to put it shortly: Blockchain development is not the easiest task, but honestly it isn’t <em>that</em> hard either. What <em>is</em> really hard to get right, is dealing with the dependencies between your Dapp packages. I’ve become a huge fan of <a href="https://pnpm.io/">pnpm powered monorepos</a> for that job. Security is another deal breaker that I just briefly touched upon during the last sections of this article.</p><p>Now, I wish you the very best of luck in your endeavours in the smart contracts &amp; Dapp space. If you’re interested in getting in touch with me or my company <a href="https://turbinekreuzberg.com/en/services/innovation">Turbine Kreuzberg</a> to consult on contract development, web3 tech and decentralization, just <a href="https://turbinekreuzberg.com/en/contact">drop us an email </a>or <a href="https://twitter.com/stadolf">DM me on Twitter</a>.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=47cc6578a9b8" width="1" height="1" alt=""><hr><p><a href="https://medium.com/t14g/the-last-introduction-to-web3-ethereum-for-developers-47cc6578a9b8">The Last Introduction to Web3 / Ethereum For Developers</a> was originally published in <a href="https://medium.com/t14g">t14g</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Sommerurlaub 2021: 450km mit Zelt und Rad]]></title>
            <link>https://medium.com/@stadolf/sommerurlaub-2021-450km-mit-zelt-und-rad-57e5805e1c22?source=rss-53cacc38e8a4------2</link>
            <guid isPermaLink="false">https://medium.com/p/57e5805e1c22</guid>
            <category><![CDATA[tourism]]></category>
            <category><![CDATA[camping]]></category>
            <category><![CDATA[baltic-sea]]></category>
            <category><![CDATA[cycling]]></category>
            <category><![CDATA[brandenburg]]></category>
            <dc:creator><![CDATA[Stefan Adolf]]></dc:creator>
            <pubDate>Fri, 13 Aug 2021 21:51:11 GMT</pubDate>
            <atom:updated>2021-08-13T21:51:11.916Z</atom:updated>
            <content:encoded><![CDATA[<p>Wenn man nichts zu erzählen hat, sollte man auch nichts erzählen — lautet eine alte Geschichtenerzählerweisheit. Eine andere: jede Reise birgt ein Abenteuer in sich. Und Abenteuer habe ich Anfang August 2021 einige erlebt, auch wenn sie nur für mich Abenteuer waren; letztlich sind die meisten Erlebnisse auf einer Radreise für alle, die nicht dabei waren, ziemlich trivial. Ich schreibe sie hier dennoch nieder, in der Hoffnung, damit den geneigten Leser zur Nachahmung zu motivieren.</p><h4>Präludium</h4><p>In den ersten beiden Quartalen 2021 war ich auf so vielen Raddemos, dass ich mich beinahe als Radaktivisten bezeichnen würde, nur dass sich meine Aktivität auf Anwesenheit beschränkt. Ich bin schon ziemlich rad-ikal, aber dennoch nicht Mitglied des ADFC (zu viele “Vogelfreunde” gehobenen Alters, dafür fühle ich mich zu jung, auch wenn ich es wahrlich nicht mehr bin), ich fahre als Rädchen im System mit und hoffe, mit meinem eigenen Verkehrsverhalten dazu beizutragen, meine Heimatstadt Berlin, unsere Region und natürlich den Planeten ein kleines bisschen besser zu machen. Dabei folge ich der Überzeugung, dass innerstädtischer motorisierter Verkehr minimiert werden muss, befürworte den <a href="https://volksentscheid-berlin-autofrei.de/">Kfz-freien Innenstadtring</a> und verfolge die Entwicklung nachhaltiger Mobilitätsangebote. Ich kann mich nicht mehr konkret an meine letzte Fahrt mit dem ÖPNV oder in einem Pkw erinnern; mein Auto habe ich 2019 abgeschafft, nachdem ein Rotabbieger mit seinem Kaffee-Dreirad auf der Reichenberger Straße meine Vorderachse so stark verbogen hat, dass die Reparatur den Zeitwert meines hochgeschätzten aber zuletzt kaum genutzten königsblauen Honda Civic überschritten hätte.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*A3-efS12fF2YQuy4" /><figcaption>So sieht mein Rad ohne Gepäck aus, wenn es an einer Demo teilnimmt.</figcaption></figure><p>Vor diesem Hintergrund gibt es für mich eigentlich nur eine Art des wahren Urlaubs, und die findet auf dem Sattel statt. Was ich definitiv nicht bestreiten kann: mehrtägige Radtouren haben etwas mit Schmerzen und mit Verzicht zu tun. Es gibt Rennrad-Pros, die sich kegelförmige Satteltaschen mit 40l Stauraum bei Amazon bestellen und damit 180km an einem Tag abreißen. Das nennt sich <em>Bikepacking</em> und es hat seinen Reiz, weil sich der Windwiderstand mit so einem Päckchen unterm Hintern minimiert. Die längste Tour, die ich jemals gefahren bin, ging von <a href="https://goo.gl/maps/7yRaafspbqW8d7Nn9">Pasewalk bis Pobierowo</a> in Polen und am Ende standen 150km auf dem Tacho. Kann man machen, aber man merkt es dann auch.</p><p>Wenn ich mit meinem <a href="https://www.fahrrad-xxl.de/carver-revolution-120-x0034568">Billo-Cyclocrosser</a> der Noname-Eigenmarke “Carver” von Fahrrad XXL in aluminumgrau auf Reisen gehe, hänge ich aber ganz ordinäre graublaue <a href="https://www.vaude.com/de-DE/Ausruestung/Fahrradtaschen/Hinterradtaschen/Karakorum-Fahrradtasche?number=124093050">Gepäckträgertaschen</a> dran. Mit auf die Reise gehen ein Zelt für eine Person, Schlüppis, Söckchen und T-Shirts pro Tag, drei Radlerhosen, von denen ich eine, die teuerste, unterwegs gecrashed und in einem öffentlichen Mülleimer in Ueckermünde entsorgt habe, einer Jogginghose, die ich nicht brauchte, einem Hoodie, den ich gleich am zweiten Tag so vollgeschwitzt habe, dass er weiße Streifen bekam und nicht gut roch, 3 Ersatzschläuchen, die ich aus Erfahrung einsteckte aber entgegen der Erfahrung nicht brauchte sowie ein bisschen Kabelkrimskrams und ein <a href="https://www.decathlon.de/p/kopfkissen-trekking-aufblasbar-grau/_/R-p-311258?mc=8557111">aufblasbares Kopfkissen</a> von Decathlon. Letzteres ist glaube ich das wichtigste Utensil von allen: weich, kuschelig und aufblasbar und ein wirklich guter Freund, wenn man nachts wegen der schnarchenden Zeltplatznachbarn, den Mückenstichen oder den Sattelwunden nicht schlafen kann und wahlweise in ein Kissen schreien oder heulen möchte.</p><p>Ich muss es einfach sagen, bevor hier ein falscher Eindruck entsteht: ich bin nicht als großer Camping-Freund auf die Welt gekommen, wurde nicht als solcher sozialisiert und bin eigentlich auch heute noch keiner. Ich war in meiner Kindheit nie campen und wusste bis zu meiner Lüneburger <a href="http://www.panzerbataillon84.de/">Bundeswehrzeit</a> auch nicht wirklich, wie man ein Zelt aufbaut. Beim Bund habe ich vor gefühlt einhundert Jahren neben vielen anderen im zivilen Leben nicht anwendbaren Dingen gelernt, mit Situationen klarzukommen, die man selbst nicht kontrolliert. Wie man die mentale Vordergrundmusik leiser dreht, wenn gerade mal alles richtig Mist ist, wenn der Hügel kein Ende zu nehmen scheint, wenn es während des Ritts auf der Kopfsteinpflasterpiste anfängt zu regnen. Was der Bund einer Radreise diesbezüglich voraus hat: man ist stets mit 50 anderen Freunden, man nennt sie dort Kameraden, unterwegs, die gerade alle das selbe erleiden und sich gegenseitig aufbauen, eben weil sie gerade auch da sind.</p><p>Kennt Ihr dieses Gefühl, auf einem emotionalen Drahtseil zu stehen, wenn die äußeren Umstände gerade über einen hereinbrechen? Ich glaube mittlerweile, das wahre Ziel von mehrtägigen Radtouren, die man alleine bewältigt, besteht darin, solche Situationen anzunehmen, durchzustehen und hinterher mental gestärkt aus ihnen hervorzugehen. Und da die Erinnerungen gerade noch frisch sind: mit Kindern im Gepäck geht das natürlich auch ganz wunderbar. Nur dass man die Kinder nicht auf dem Zeltplatz entsorgen kann, wenns einfach zu viel wird und man beschließt, doch abzubrechen und mit der Bahn nach Hause zu fahren. Halleluja, liebe Eltern, Ihr macht einen krassen Job und ich anerkenne Eure mentale Stärke! Ich habe auf meiner Tour Eltern und Familien, Opas, Omas, Tanten und Onkel beobachtet und mitleidig zugezwinkert, die von Säuglingen bis zu Zwanzigjährigen alles dabei hatten, was man als Mensch so produzieren kann. Die wenigsten von ihnen waren allerdings mit Fahrrädern unterwegs.</p><p>Ja klar, sagt Ihr, so bekloppt sind die ja auch wieder nicht! Aber einige, Ihr werdet es nicht glauben, die sind so bekloppt! Verpacken Vorschulkinder in einen Anhänger oder ein Lastenradkörbchen und ballern damit über unbefestigte Feldwege. Das passt ein bisschen ins Bild, das ich hier malen möchte: man braucht ganz offensichtlich keinen SUV mit hunderten PS und einen gewaltigen Hänger mit Vorzelt, den man hinter sich herzieht, um ihn dann vier Wochen lang auf einem Campinglatz abzustellen, nur um seinem Nachwuchs das Konzept “Leben in der Natur” zu demonstrieren.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/600/0*MhLOKMQOfSHEDEaH" /><figcaption>RIP, Perscheid, Du hast es immer auf den Punkt gebracht.</figcaption></figure><p>So toll wie kleine Kinder Panzerfahrzeuge (ja, da war er wieder, der Bund, aber das ist wirklich eine andere Geschichte) finden mögen: Fahrräder sind für sie genauso toll! Und warum das so ist, sollte jedem klar sein, der eins fährt. Man soll ja keine ungeprüften Zitate aus dem Internet übernehmen, aber dieses von John F. Kennedy habe ich schon so oft gesehen, dass ich es für verbürgt halte:</p><blockquote><strong>Nichts ist vergleichbar mit der einfachen Freude, Rad zu fahren.</strong></blockquote><p>Jetzt aber wirklich zu meinem Reisebericht!</p><h4>Tag 1 Berlin Neukölln — Fürstenberg</h4><p>Nordneukölln gehört vermutlich zu den zugleich beknacktesten und liebenswürdigsten Orten, an denen man überhaupt wohnen kann. Überall durchgeknallte Hipster-Touristen, die jede Goa-Party mitnehmen, die in den illegalen Airbnbs so stattfinden, Fixer, die in die Hauseingänge koten, fette Mercedeskarossen, die jede Nacht (wirklich: <strong>jede</strong> Nacht, liebe Ordnungshüter!) die Ansaugstöpsel auf dem Kotti knallen lassen und jede Menge freundlich grüßende Schwarzafrikaner, die gut gelaunt ihre Runden durch den Görli drehen. Und dann: ein Gourmet-Highlight nach dem anderen, spontane Straßenparties, Kreative und Künstler, wohin man schaut, ein Lebensgefühl, so lässig, dass der Venice-Beach dagegen aussieht wie ein Ikea-Bällebad. Laut, schrill, impulsiv und äußerst inspirierend. Aber wenn man jede Sommernacht hier bei geöffnetem Fenster schlafen muss, dann ziehts einen unweigerlich ins Grüne.</p><p>Fürstenberg und ich haben eine gemeinsame Historie, die mit meinem wirklich sehr alten (bezogen auf die Dauer unserer Bekanntschaft) Freund Bastian zusammenhängt. Irgendwann kamen wir beide mal auf die Idee, mit dem Fahrrad nach <a href="https://goo.gl/maps/WcwDvFRJ4kK8MFUc7">Himmelpfort</a> zu fahren, weil da der Weihnachtsmann wohnt. Bastian ist schon mal den Berlin Marathon gelaufen und fährt mit dem Rad von Spandau ins Büro nach Halensee, aber die Langstrecke auf zwei Reifen ist (noch) nicht so ganz seins. Ab Kilometer 70 ging ihm echt die Puste aus; mir gings nicht viel besser, aber ihm wars eher anzumerken.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/970/0*ZiZwhh7w5CQOBtVN" /><figcaption>2017: Getränk am Ende unserer Kräfte.</figcaption></figure><p>Jetzt wollte ich wissen, ob ich in der Zwischenzeit besser geworden bin. Also sattelte ich Montag morgen entspannt auf und fuhr durch den Berliner Stadtverkehr gen Norden. Die Autofahrer in Berlin haben wir mittlerweile dank vieler Demos, Critical Masses, Popup-Radwegen und der Fahrradstaffel der Polizei nach meinem Dafürhalten ganz gut daran gewöhnt, dass Verkehrsteilnehmer auf zwei Rädern als Verkehr und nicht als anzuhupendes Hindernis gelten. Bis zu dem kleinen Vorort <strong>Summt</strong> kurz über der A10, den man übrigens wahlweise als SUV-Parkplatz oder Golf-Oase bezeichnen kann, gabs dann auch keinerlei nennenswerten Vorkommnisse. Von Summt an gehts auf der Landstraße weiter und Brandenburger Autofahrer, gerade die Auto fahren als Beruf ausüben, sind noch nicht so gut in der StVO geschult wie ihre Berliner Kollegen. Nicht, dass mich jemand vom Pferd geholt hätte, aber mit den <a href="https://www.bussgeldkatalog.org/seitenabstand/">gesetzmäßig festgelegten 2m Mindestabstand außerorts</a> überholt auf Brandenburger Landstraßen definitiv nicht jeder.</p><p><a href="https://www.komoot.de/tour/439843823?share_token=aqGi4YQjAWt1yVUU04qqDuQfF82qrkc7iebWn1GjDoUyOorSC2&amp;ref=wtd">From Kreuzberg to Fürstenberg/Havel | Rennrad-Tour | Komoot</a></p><p>Kein Wunder, dass am Rande dieser “L21” genannten Strecke große Plakate und <a href="https://www.moz.de/lokales/oranienburg/demonstration-sternfahrt-fuer-radweg-an-der-l21-zwischen-summt-und-kreuzbruch-51422566.html">manche Demos</a> darauf aufmerksam machen, dass hier ein Radweg hingehört. Tatsächlich ist die Straße aber glatt, gut asphaltiert und führt durch ein Waldgebiet — zum ersten Mal war also Durchatmen angesagt. Richtig schön wirds ab <strong>Zehlendorf</strong> (der Ort, nicht der Bezirk), wenn man sich langsam dem Oder-Havel-Kanal nähert. Dort ging mir nach 40km auch erstmals die Puste aus. Ich hielt an einem kleinen Hofladen, der noch nicht geöffnet hatte, setzte mich auf eine tausend Jahre alte Bank, grüßte den Schweinebauern auf seinem Traktor und beobachtete Störche, die auf einer Wiese nach Fröschen oder Staniolpapier pickten.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*jMQkthegaowMACV7JUlgcw.jpeg" /><figcaption>Esel, Störche, Schweinebauern (nicht im Bild)</figcaption></figure><p>Bei <strong>Liebenwalde</strong> vereinigt sich der Radweg dann mit dem <a href="https://www.outdooractive.com/en/route/bicycle-touring/mecklenburg-vorpommern/radweg-berlin-kopenhagen-cycling-path-berlin-copenhagen-/14575563/#dm=1">Berlin-Kopenhagen Radwanderweg</a>, der definitiv die bessere Wahl für eine Tour von Berlin an die See ist, aber für einen Neuköllner einen ganz schönen Umweg bedeuten würde. Dort trifft er auf den <strong>Voßkanal</strong>, den Haupstrom der Havel, und begleitet ihn bis nach Zehdenick, einem der größten Orte auf dem Weg nach Fürstenberg. Mal ein fettes Kudos an den Erfinder des Straßenbelags dort: grob gekörnt und leicht kieselig blendet er die meisten Wurzeln aus und lässt einen locker mit einem 30er Schnitt die Kilometer vergessen. Damit überholt man nicht nur alle Elektroradler, die antiproportional zu ihrem Alter ohnehin nie an ihr 25er-Limit stoßen, sondern auch die Flöße und gedrosselten Motorkähne, die gen Norden dümpeln.</p><p>Dafür, dass <strong>Zehdenick</strong> auf der Karte ziemlich groß aussieht und auf einer europäischen Radroute liegt, ist er ausgesprochen unspektakulär. Ein Baumarkt, zwei Supermärkte, eine historische Zugbrücke aus Holz und eine kulinarische Katastrophe erwarten Radfahrer hier. Am leblosen zentralen Rathausplatz erwarteten mich die letzten Zurückgelassenen des Sozialismus am lokalen Imbiss, der einzigen mir bekannten geöffneten Gastronomie in diesem gottverlassenen Ort. Zwangsläufig gönnte ich mir dort zwei Radler und ein Stück Pappe, das als Schnitzel Wiener Art auf der Karte stand.</p><p>Eines sei an dieser Stelle bereits verraten: Belastbares Material für einen kulinarischen Reiseführer konnte ich auf dieser Rundfahrt beim besten Willen nicht sammeln. Entweder war ich zu blöd oder zu blind, aber viel wahrscheinlicher ist: in der ehemaligen sowjetischen Besatzungszone gilt es auch heute noch entweder als unfein oder als übertrieben, sich zum Essen in einem Restaurant einzufinden, in dem die Stühle Sitzbezüge tragen. Nein, das liegt ganz sicher auch an dem fiesen Corona-Virus und vermutlich gehe ich gerade zu hart mit der Kulinarik des Ostens ins Gericht. Und bitte vergesst nicht: dies ist mein persönliches Logbuch und falls Ihr anderer Meinung seid, oder wisst, wo sich in Zehdenick oder anderswo die fetten Schnitzel oder Sushi-Rollen tummeln, schreibts in die Kommentare.</p><p>An den Abschnitt zwischen Zehdenick und <strong>Dannenwalde</strong> kann ich mich beim besten Willen nicht mehr bildhaft erinnern, wohl aber an meine Entscheidung (erkennbar an der kleinen Beule auf der Karte bei km 78,6), die von Komoot vorgeschlagene Bundesschnellstraße nach Fürstenberg zu meiden. Schon beim Ortseingang donnerte mir ein LKW nach dem anderen am Lenker vorbei und daher dachte ich, es sei eine gute Idee, die 7km Umweg über <strong>Bredereiche</strong> in Kauf zu nehmen. Und das führt uns zur ersten Regel, die Ihr bitte immer beherzigen solltet: Wenn ihr mit einem rennradähnlichen Gefährt unterwegs seid, und Komoot bittet, eine rennradtaugliche Route zu errechnen, dann glaubt Komoot, dass es die beste Route ausgerechnet hat. Nicht nur, dass der Straßenbelag in dieser Region zu weiten Teilen ziemlich dürftig ausfällt, der Weg führt auch über den einen oder anderen Hügel und hat mich in Summe sicherlich 50 unnütze Höhenmeter gekostet. Klingt alles nicht viel, aber nach 80km Fahrt mit Gepäck merkt man auch jede noch so kleine Steigung unmittelbar in den Beinen. In steiler Schussfahrt stieg ich zuletzt bis <strong>Fürstenberg</strong> ab, und landete schließlich bei meinem Tageseziel: dem Campingplatz <a href="https://www.wilde-heimat.de/">Wilde Heimat</a>.</p><p>Mich empfing eine ausgesprochen nette Dame, die kulturell irgendwo zwischen der Republik Freies Wendland und einer Yoga-Matte sozialisiert wurde. Wie der Name des Platzes vermuten lässt, bewegen sich hier die Formalien in der Nähe des Nullpunkts, sodass ich mir in Rekordzeit einen Zeltplatz suchen konnte. Besonders nett: die Zeltwiese ist von Baby-Kiefern durchsetzt, die Sicht- und Schallschutz bieten. Ganz so wild wie der Name vermuten lässt, gehts hier aber nicht zu. Die üblichen Fahrgaragen-Camper und Offroad-Boliden stehen auch hier auf der Fläche, aber man hat schon den Eindruck, mit ein paar Wilden auf einen Haufen geworfen worden zu sein. Das merkt man auch an der Kinderdichte: die ist natürlich zur Ferienzeit auf jedem Campingplatz hoch, aber hier hatte man den Eindruck, dass alle Kinder so wild sein konnten, wie sie wollten. Mädchen hingen in von Bäumen herabgelassenen Spanngurten, ein paar Halbstarke zersägten einen Baumkadaver zu Brennholz fürs gemeinschaftliche Lagerfeuer, die pubertäre Platzelite versammelte sich an der überdachten Sommerküche, die auf einem verlassenen Bahngleis steht und kleine Familien versuchten erfolglos ihren Kleinkindern beizubringen, dass man nicht mit Schuhen ins Wasser geht.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*MVuv2hOMQP-4ChgCBh4n-w.jpeg" /><figcaption>Badestelle an der Wilden Heimat</figcaption></figure><p>Ich habe mit Kindern zugegebenermaßen nicht allzu viel am Hut und wir gehen uns in der Regel gekonnt aus dem Weg, umso erstaunter war ich, als ein Junge auf mich zugerannt kam und mich ohne Hallo oder Guten Abend nach dem Weg zum Wasser fragte; da ich auch gerade erst eingetroffen war, konnte ich ihm auch nicht weiter helfen, als eine Richtung zu raten (die sich wie immer als falsch herausstellte). Später traf ich ihn 50 Meter weiter am Ufer mit seinem Kumpel Mücken jagen. Meine Zeltnachbarn waren Simon (30) und Valentin (5) aus Bremen, die vor Simons Ex ins wilde Brandenburg geflüchtet waren, und solange Verstecken spielte, bis Valentin auf einen Erdnagel (in Zivilsprech: Hering) trat und ich kurz davor war, dem Jungen aus Mitleid das Bein zu amputieren. In solchen Momenten lohnt es sich, die sanitären Anlagen aufzusuchen. Gemäß deren Beschreibung auf der Wilde-Heimat-Webseite befürchtete ich das Schlimmste, wurde aber äußerst positiv überrascht: Einzelkabinen und keine Nerverei mit 3-Minuten-Duschmarken sowie ein supersauberes Sani-Gebäude haben alle meine Befürchtungen ins Gegenteil verkehrt.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*f72M5wx2zVKMUL-YEkYAMg.jpeg" /><figcaption>Brennpunkt Fürstenberg</figcaption></figure><p>Ich drehte anschließend noch eine Runde durch Fürstenberg, um Italiener, Griechen oder, Gott steh mir bei, einen Inder zu finden, aber ich fand nur Netto, den mit dem Scotty. Ein Portiönchen frische Ananas, eine Buttermilch mit Erdbeeraroma, eine Packung Kekse und eine Flasche Cola mussten als Abendessen herhalten. Gesund ist das nicht, aber ich habe festgestellt, dass Milchgetränke nach langen Radtouren die Lebensgeister wiedererwecken und die brauchte ich, denn kaum lag ich in meinem Zelt, breitete sich ein wirklich fieser Krampf durch meinen rechten Oberschenkel aus. Kurzzeitig überlegte ich noch, ob ich Valentin fragen solle, mir eventuell das Bein zu amputieren, aber nach zehn Minuten war das Schlimmste vorüber. Das war der Moment, in dem ich beschloss, beim nächsten Netto nach Magnesiumtabletten zu suchen und meine Bewegungen beim Einstieg in den Schlafsack besser zu koordinieren.</p><h4>Tag 2 Fürstenberg — Prenzlau</h4><p>Die erste Nacht im Zelt ist für einen Nordneuköllner durchaus gewöhnungsbedürftig. Statt betrunkener Briten schreit immer irgendwo ein Kind oder ein Kranich. Ich kam dennoch bei Sonnenaufgang gegen 5 Uhr irgendwie zu mir, blieb noch drei Stunden wie ein Stein liegen und lauschte dem obligatorischen Reißverschlussgezerre. Übrigens: wer sein gesamtes Camping-Wissen auf Festivals erlernt hat, wird sich wundern, dass nicht ständig jemand Helga ruft oder betrunken über ein fremdes Zelt stolpert; solches Benehmen ist mir auf keinem Campingplatz jemals aufgefallen.</p><p><a href="https://www.komoot.de/tour/440865190?ref=wtd">From Fürstenberg/Havel to Prenzlau | Rennrad-Tour | Komoot</a></p><p>Ohne Frühstück brach ich auf, nur um am Ortseingang von Fürstenberg nochmal anzuhalten und die erste Zigarette des Tages zu rauchen. Das habe ich ja noch gar nicht erwähnt: ja, ich rauche gern, ich rauche viel zu viel und ich werde mit ziemlicher Sicherheit auch daran sterben, und ja, ich weiß, dass das vermutlich kein schöner Tod werden wird, aber dafür hab ich ja Euch, die Ihr danach darüber berichten und Eure Kinder belehren könnt. Wie immer spielte das Schicksal mit und schickte mir alsbald einen Raucherfreund, der auf einem kleinen Elektrorollstuhl hinter mir auftauchte, mein Gepäck bestaunte und fragte, wo die Reise hinginge. An die Ostsee, sagte ich. Ach das ist ja ganz schön weit, sagte er. Er sei 86 Jahre und früher Bauer gewesen und an seinem Rollstuhl hingen wie zur Mahnung 3 Sauerstoffflaschen, die ihn am Leben hielten. Ich sagte: erfüllen Sie sich jedes Jahr einen Traum, dann werden Sie sicherlich noch 100 und dachte dann: wahrscheinlich ende ich genau so. Aber unter uns: Der Mann verbringt seinen Lebensabend auf einem fahrbaren Untersatz, hat permanent gute Laune und ein Dauerabo Sauerstoff, so schlimm klingt das für mich jetzt auch wieder nicht.</p><p>Für diese Etappe verletzte ich wieder bewusst Regel Nummer Eins, diesmal doppelt-bekloppterweise aber sogar bei der Planung. Ich dachte mir, die direkte Strecke von Fürstenberg nach Prenzlau sei ein bisschen zu banal und daher baute ich eine kleine Komplikation in die Route ein, die mich durch das vermeintlich schöne Waldgebiet der <strong>Feldberger Seenlandschaft</strong> führen würde. Bis nach <strong>Lychen</strong> folgte ich der weniger stark befahrenen Bundesstraße, auf der mir auch einige Rennradler entgegenkamen. Kurz vor Lychen nahm ich mein Frühstück in Form eines kleinen, zerdrückten, in einer Plätzchenform gebackenen Rühreibrötchens vom Lila Bäcker zu mir und merkte, dass Komoot mich nicht durch Lychen, sondern wegen meines Detour-Wunsches nördlich daran vorbei führte (Kilometer 13). Zwischen Lychen und <strong>Feldberg</strong> war das auch eine großartige Entscheidung: am Anfang eine malerische Wasserlandschaft, dann kleine Dörfer, viel Horizont, wenig Menschen, meistens Asphalt.</p><p>Das ging solange gut, bis ich bei Kilometer 37 auf die von mir gewählte Komplikation stieß: eine kleine Anhöhe ohne Radweg, an deren Rändern Obstbäume wuchsen und Schafe grasten. Ein plötzlicher Regenschauer nötigte mich dazu, in einem Quittenhain Unterschlupf zu suchen (dort entstand das Fahrradfoto) und anschließend nochmal hinaufzusteigen und ein Panorama von der Umgebung aufzunehmen.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ZjL4A5GH9Kk8ONySnV78bw.jpeg" /><figcaption>Panorama im Nirgendwo</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*C-RSJJh9_q-KwR73YN5X3g.jpeg" /><figcaption>Parksituation im Quittenhain</figcaption></figure><p>Ab dem Quittenhain kam mir der Weg bereits suspekt vor: er existierte genau genommen überhaupt nicht mehr. Nicht ahnend, was mich nun erwartete, schob ich mein Rad (samt Gepäck) tiefer in den Wald hinein und merkte, dass hier allenfalls gestandene Offroader und Downhill-Fahrer Freude am Fahren entwickeln können.</p><p>Fast drei Kilometer schob ich mein Gefährt durch den Wald, Steilhänge hinauf, Brennessel-Schluchten hinab und erlebte hier einen dieser eingangs beschworenen Momente: Man will eigentlich nur noch aufgeben, das Rad von der Klippe werfen und ein Taxi rufen. Aber das geht ohne Empfang ja schlecht, also schleppt man sich weiter. Viel besser wurde der Weg auch nach dem Höllenwald nicht: Schotterpisten und abgenagtes Kopfsteinpflaster wechseln sich hier ab. Dank Cyclocross-Bereifung und ein bisschen Erfahrung konnte ich den letzten Hang immerhin schneller nehmen als zwei breitreifig vollgefederte Mountainbiker, die ich im Vorbeirollen freundlich grüßte, aber ein Genuss ist so eine Abfahrt mit Gepäcktaschen keinsfalls.</p><p>Ein bisschen blohnt wurde ich bei Kilometer 41,5: am Lichtenberger Strand gibt es eine malerische Froschperspektive auf den Wald des Todes, den ich nur eine halbe Stunde zuvor fluchend durchstreifte.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*fDGzuy0esULSIRSaekKJ6Q.jpeg" /><figcaption>Blick auf den Wald der Schmerzen (rechts, über den Zelten)</figcaption></figure><p>Dort traf ich auch auf ein Verkehrsmittel, das für die soeben gemeisterte Tortur weitaus besser geeignet gewesen wäre: eine Gruppe Reiter vertrat sich gerade die Beine und ich versuchte mich erfolglos, mit ihren Pferden anzufreunden. Das ist bei mir ähnlich wie mit Kindern und Rust-Programmierern: ich mag Pferde, aber sie mögen mich in aller Regel nicht. Wer hier noch mitliest und mir einen Urlaub anbieten möchte, bei dem ich ein bisschen Reiten lernen kann, bitte schreibt mir!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*PA2EKT1hSdahfoDa7eZfQA.jpeg" /><figcaption>Bessere Gepferde</figcaption></figure><p>Der weitere Verlauf der zweiten Etappe verlief dann zum Glück reichlich ereignislos, führte mich aber über unerwartet viele geographische Höhen, Tiefen und Orte, die wie alternde deutsche Rockstars oder weitere Berliner Bezirke klingen sowie an Windparks vorbei, die man logischerweise dort errichtet, wo auch eine Menge Wind bläst.</p><p>Die Einfahrt nach Prenzlau nach 70 Kilometern beginnt dann wieder außerordentlich enttäuschend: ein ehemals großes griechisches Restaurant am Ortseingang (Hellas) hat geschlossen. Der Weg in die Innenstadt ist ein Nadelöhr für LKWs und Kraftverkehr, Radfahrer werden auf das nebenliegende, benutzungspflichtige, horizontal wie vertikal wellenförmig angelegte Imitat eines Radwegs verdrängt, bis man plötzlich auf den Nordzipfel des Sees trifft, wegen dem ich mir Prenzlau als Etappenziel aussuchte: der <strong>Unteruckersee</strong>! Der Name ist nicht nur drollig, sondern für eine Person mit technischer Weltsicht auch lagemäßig falsch: geographisch liegt der Unteruckersee nämlich über dem Oberuckersee, an dessen Ufer ich vor zwei Jahren übernachtete. Seinen Namen verdankt er natürlich der Tatsache, dass er aus Sicht des Flusslaufs der Ucker hinten liegt.</p><p>Bevor ich die letzten paar Meter zum Campinglatz zurücklegte, setzte ich mich neben eine Gruppe älterer Damen auf eine von der Europäischen Union gestiftete Sitzgruppe und genoss die Aussicht. Ich war vorher schon ein paar Mal auf Tagestouren in Prenzlau angekommen und bin jedes Mal überwältigt von der Schönheit der Nordostseite des Sees. Sie ließ mich auch fast darüber hinwegsehen, dass der finale Anstieg zum Viersterne-Campingplatz “<a href="https://www.sonnenkap-camping.de/">Sonnenkap</a>” über eine 300m lange Kopfsteinpflasterpiste führt. Man kann sie als Radler zwar umfahren, aber das fand ich erst am folgenden Tag heraus.</p><p>Wer normalerweise nur in Hotels nächtigt, dem sei gesagt, dass es tatsächlich Sternekategorien für Campingplätze gibt. Das Sonnenkap gehört zur gehobenen Klasse, was sich durch ein moderneres Sanigebäude, grünerem Rasen sowie irgendein Lage-Highlight auszeichnet: hier ist es der direkte Zugang zum See, den ich, nachdem ich mein Zelt auf einer bereits gut gefüllten Zeltwiese aufgebaut hatte, sofort zu nutzen wusste. Das Wasser des Unteruckersees ist glasklar, das Ufer fällt ganz sanft ab und besteht aus reinem, weichen Zuckersand: man läuft wie durch kühle Watte in den See hinein.</p><p>Eine Dusche später nahm ich mir vor, die Innenstadt von Prenzlau zu erkunden und erlag erneut der Hoffnung, eine Gastronomie zu finden, die etwas kulinarisch erinnerungswürdiges zustandebringen könnte. Um vom See in die Stadt zu gelangen, muss man stets einen kleinen Anstieg bewältigen, aber ohne Gepäck fährt sich mein Fahrrad fast wie von alleine. Das vielversprechendste Restaurant “<a href="https://restaurant-zum-schwan.eatbu.com/">Zum Schwan</a>” sah mir nach einer Touristenfalle aus, also steuerte ich nach einer Maps-Konsultation den nächsten Griechen an. Der muss seinen ökonomischen Master in der Baumschule gemacht haben, denn er hat beschlossen, in der Hauptferienzeit selbst Ferien zu machen. Ob der Italiener mehr von touristischer Wohlfahrt versteht, kann ich ebenfalls nicht behaupten, denn der hat Dienstags Ruhetag. Nach einer ganzen Stadtumrundung fuhr ich also frustriert zurück zum Schwan und bestellte aus Trotz ein Gyrosgericht, das zwar bei weitem nicht an das Kreuzberger Original heranreicht, aber definitiv Spuren von vormals lebendigen Tieren zu enthalten schien.</p><p>Zwei Radler und die entsprechende Bettschwere später beschloss ich, noch Proviant für den kommenden Tag aufzunehmen und besuchte den örtlichen Rewe. Auf dem Weg dorthin passierte mich ein Grüppchen alkoholbedingt gut gelaunter, sehr dunkelhäutiger Prenzlauer, dessen Anführer es für lustig befand, eine rote Fußgängerampel zu überqueren. Ich folgte ihnen mit leichtem Abstand, konnte aber den rassistischen Kommentar eines bioprenzlauerischen Stammgastes des vorgelagerten Rewe-Imbisses nicht überhören: “<em>Noch nichtmal sechs, und die Ratten sind schon besoffen</em>”. Solche Kommentare machen mich nicht nur traurig, sie machen mich wütend und ich muss es in dieser entschiedenen Klarheit sagen: rassistische Kackscheiße gehört auf den Scheiterhaufen deutscher Geschichte. Aber ich finde es auch wirklich nicht besonders vorausschauend von einer Person mit neuweltlich-jamaikanischem Phänotyp, die ortsbekannten Altnazis mit beschwipster “Ich scheiß auf Eure Gesetze”-Laune dazu zu provozieren. Kopfschüttelnd betrat ich den Rewe und besorgte mir Magnesiumtabletten und Schokonüsschen.</p><p>Auf dem Heimweg legte ich an einer kleinen Halbinsel einen Zwischenstopp ein, um die Golden Hour zu genießen und eine Weile die prominenteste Parkbank der Dorfjugend zu blockieren. Dabei wurde ich Zeuge eines Drachenboottrainings, in dem die Führerin des Bootes von Zehn auf Null zählte und dann ihre Mannschaft mit übermenschlicher Motiviation begann, ins Wasser zu stechen: bleibende Eindrücke zwischen Wikingerkultur und olympischem Geist.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*AJTfYSwtkr0Dgv5c6ZjE4Q.jpeg" /><figcaption>Drachenboot mit Schilf und Lenker</figcaption></figure><p>Die meisten Campingplätze haben irgendeinen Haken. Selten einen wirklich dramatischen, aber das Sonnenkap hat trotz vieler bedeutender Annehmlichkeiten einen großen: Es liegt direkt neben der Regionalbahnlinie, auf der bis um ein Uhr in der Nacht quietschende Bahnen in die Stadt rumpeln. Dennoch war die Nacht zumindest in der Nachbetrachtung besser als die erste und ich fand genügend Schlaf, um mich von den Brennessel-Strapazen, der Schieberei und den Kommentaren widerlicher Dorfnazis zu erholen.</p><h4>Tag 3 &amp; 4 Prenzlau — Bellin</h4><p>Nach einem kurzen Frühstück an der bekannten malerischen Halbinsel startete ich die mit etwas über 50km vermeintlich kürzeste Etappe meiner Rundreise. Mein Ziel, das Haffdorf Bellin, das einen Katzensprung von der Hafenstadt Ueckermünde entfernt liegt, hatte ich schon vor zwei Jahren entdeckt und alleine sein Name zwingt mich geradezu, ihm regelmäßig einen Besuch abzustatten.</p><p><a href="https://www.komoot.de/tour/441903103?ref=wtd">From Prenzlau to Bellin | Rennrad-Tour | Komoot</a></p><p>Die Fahrt von Prenzlau startet mit ein paar verlassenen und vergessenen Dörfern, führt vorbei an Windparks und über die eine oder andere Steigung, die alle für sich genommen nicht weiter wild sind, in ihrer Summe aber zur muskulären Geduldsprobe werden. Hier überquert man auch die unsichtbare Grenze zwischen Brandenburg und Mecklenburg-Vorpommern, was für ungeübte Besucher eigentlich nur daran erkennbar wird, dass sich die hässlichen Gesichter der CDU- und AfD-Kandidaten auf ihren <a href="https://www.afd.de/strassenplakate/">saudummen Wahlplakaten</a> abwechseln; Favorit irgendwo zwischen “<em>Berlin macht mehr Mist als unser Vieh</em>”, “<em>Eine Grenze ist da, um beschützt zu werden</em>” und “<em>Landschaft statt Windparks</em>”. Dass man im Osten unserer Republik tatsächlich mit dem Schutz von Grenzen Wahlwerbung machen kann, finde ich in Ermangelung besserer Worte nicht nur geschmacklos, sondern bis ins Mark erschütternd.</p><p>Das erste Zwischenziel ist das kleine Städtchen <strong>Pasewalk</strong>, das zu den hässlichsten zählt, die ich auf dieser Tour erleben durfte. Einmal abgesehen von grauen, zerfledderten Bürgersteigen ohne Radnutzungspflicht, die noch Walter Ulbricht bewilligt haben dürfte, habe ich in Pasewalk wirklich nichts entdeckt, was eines positiven Kommentars bedürfte. Ein dicker weißen Mann am Steuer eines blauen Fords mit Anklamer Kennzeichen befand es für hilfreich, mich mit seiner Hupe darauf hinzuweisen, dass ich nach seinem Ermessen ungebührlichen Gebrauch der Fahrbahn mache. Das war aber zum Glück der einzige Bekloppte, der sich dazu angesichts meines Gefährts auf der ganzen Tour hat hinreißen lassen.</p><p>Obwohl Pasewalk zu den Städten gehört, um die man nicht nur als Radler besser einen Bogen macht, muss man ja irgendwann verpflegen und mangels jeglicher Alternative entschied ich mich für ein paar Geflügelwiener vom zentralen Norma, der es wie viele andere nicht für notwendig hält, seine Radparksituation der aktuellen Radverkehrssituation anzupassen. Als ich mein Fahrrad daher wie immer an einem Stahlpfosten am Rand des Autoparkplatzes befestigte, erntete ich dafür die üblichen bösen Blicke der AfD-Vorstandsdoubles und wusste unmittelbar, dass Verrückte wie ich in ihrer kleinen kaputten Welt absolut nicht willkommen sind. Die Idee, ein pseudonahrhaftes Brötchen beim lokalen Norma-Bäcker mitzunehmen, gipfelte mangels Auswahl nur in einem süßen Spritzkuchen.</p><p>In eine Mischung aus leichter Frustration und Belustigung ob des Schauspiels, dessen Zeuge ich in diesem schrecklichen Ort wurde, entschied ich mich, wenigstens nach einem hübschen Fleckchen Erde zu suchen, an dem ich in Ruhe meine Würstchen mit Süßgebäck zu mir nehmen musste. Ich fand es bei km 28.4, am Rande einer zugewachsenen Industriebrache und Totholzabladestelle. Angesichts meiner mentalen Verfassung möge man mir verzeihen, dass ich dort auch zum ersten und letzten Mal auf dieser Tour ein Fläschchen Magenbitter hinunterkippte, um meinen Geist halbwegs von dieser Katastrophe eines Ortes zu reinigen.</p><p>Die Rückker auf den Radwanderweg entschädigte aber für die kulturelle Folter der vergangenen halben Stunde: nördlich von Pasewalk scheint der örtlichen Verwaltung aufgefallen zu sein, dass sie die Zielgerade auf dem Weg an die Küste markieren und so haben sie einen durchgängig gut befahrbaren, nur unregelmäßig von Wurzeln durchstoßenen Asphaltweg neben die Bundesstraße gelegt, auf dem man schnell vorankommt. Das Örtchen mit dem illustren Namen “<strong>Viereck</strong>” hat zwar beschlossen, den Radreiseverkehr mit einer traditionellen Kopfsteinpflasterung auszubremsen, aber das konnte ich einem vergessenen Dorf mit extra bescheuertem Namen, das die Besserverdienenden der Region für sich entdeckt haben, gerade noch verzeihen.</p><p>Ab Viereck schlängelt sich der Radweg 20km bis zur Haffküste durch Kiefernwälder und ist beiderseits von Schildern mit militärischen Sicherheitshinweisen gesäumt; er führt durch zwei große Übungsplätze der lokalen Panzergrenadiere. Marder, Fenneks oder Luchse habe ich leider keine gesehen, dafür aber ein paar ziemlich futurustisch ausgestattete Mähdrescher, die mit Halbkettenantrieb über die Bundesstraße ratterten. Die Kadenz der Radfahrenden mit Kindern, Anhängern und Hunden nimmt auf diesem Abschnitt beträchtlich zu und kurz vor <strong>Eggesin</strong> setzte sich eine Elektroradlerin mit voller Unterstützung vor mich, der ich bis zur Dorfkirche des Ortes folgen konnte. Dort musste ich ein Viertelstündchen pausieren, und habe genervt den ununterbrochenen Lieferverkehr verfolgt, der sich durch das kleine Dorf quält, während ich meinee Extraration Magnesium wegnuckelte.</p><p>In Mecklenburg-Vorpommern gelten härtere Corona-Gesetze bei der Beherbung von Tagesgästen. Sie sehen vor, dass man nur mit einem tagesaktuellen Test auf einem Campingplatz einchecken darf. Daher stellte ich das Tagesziel auf das große, unter anderem für Touristen bereitgehaltene Testzentrum zwischen Feuerwache und Omnibusbahnhof in <strong>Ueckermünde</strong> ein. Als ich dort ankam, stellte sich heraus, dass es aufgrund einer “technischen Problemen” an diesem Tage geschlossen war.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*WIekaLIdz-HN2speSgO2uw.jpeg" /><figcaption>Ja ja, Deine Mudda.</figcaption></figure><p>Mit einem eher unguten Gefühl machte ich mich also erstmal auf den Weg zur letzten Fischbude am Hafen (<a href="https://ueckermunde-mv.deutschebusiness.com/rosis-fischoase/">Rosi’s Fisch-Oase</a> &lt;- beachtet die Kommentare :D) um bei Radler, Aal und Bremer darüber zu sinnieren, wo man in einer 1000-Seelen-Gemeinde wie Ueckermünde alternativ einen Test herbekommt. Die Dame am Tresen verwies mich auf ein Zentrum “gegenüber vom Rossman”, das bei genauerer Betrachtung nicht wirklich gegenüber vom Rossmann liegt, aber das ich nach einer vollständigen Sondierung der Innenstadt, durch die sich starker SUV- und Cabrio-Verkehr hupend und ohne Rücksicht auf fußgängerische Verluste seinen Weg durch die engen mit Kopfsteinen gepflasterten Gassen der Hafenstadt bahnt, schließlich doch noch fand. Das niederschmetternde Ergebnis: dieses Testzentrum hatte an jenem Tag permanent geschlossen.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*CWSG3eKLeMDZJYifA08Svw.jpeg" /></figure><p>Da ich von meinen vorherigen Besuchen in Ueckermünde wusste, dass der beste Weg zu meinem eigentlichen Ziel, dem Campingplatz in <strong>Bellin</strong>, nicht entlang der Hauptstraße, sondern am Haff entlang führt, radelte ich die knapp 1km lange, von mit Motorsägen aus Bäumen herausgeschnitzten Märchenfiguren gesäumte Strandallee hinunter und traf zum ersten Mal auf dieser Tour auf das Meer. Wobei der Begriff das <strong>Stettiner Haff</strong> natürlich etwas großzügig interpretiert: es ist eine Art verirrter Nebenarm der Ostsee und man kann mit bloßem Auge <strong>Kamminke</strong> auf Usedom erkennen, aber wenn man sich in den weichen Sand legt, die Augen schließt und dem Wellenrauschen zuhört, ist der Unterschied zu Scharbeutz fast nicht zu merken.</p><p>Zwei Kurven weiter erreichte ich schließlich den “<a href="https://ferienpark-ueckermuende-bellin.de/">Ferienpark Ueckermünde-Bellin</a>” und wurde seinem freundlichen Besitzer vorstellig, der immer, wenn ich an der Registrierung stehe, in einen so breiten DDR-Dialekt verfällt, dass ich als Westberliner ihn mehrmals um Wiederholung bitten muss — das ist mir sonst eigentlich nur in Wien passiert. Der Extrakt der Konversation: ohne Test komm ich nicht auf den Platz, das Gesundheitsamt war vor zwei Tagen da und drohte ihm, den Laden dichtzumachen, wenn er nicht überall Abstandsschilder aufstellt, jedes zweite Waschbecken abklebt und Testungen seiner Gäste rigoros überprüft. Ich bin in solchen Situationen ein äußerst kooperativer und leidensfähiger Zeitgenosse und in Ermangelung von Alternativen blieb mir eh nichts anderes übrig, als mich dem Schicksal zu stellen, das mich nun erwartete. Kollege Platzwart setzte alle Hebel in Bewegung, dass das alternative Testzentrum in <strong>Eggesin</strong> (da kam ich her), nochmal ausnahmsweise seine Pforten für mich öffnete und versprach mir, in der Zwischenzeit den Verantwortlichen der Gemeinde ausfindig zu machen, den ich für diese zusätzlichen 20km teeren und federn könne. Er und Google Maps empfahlen mir, den kürzesten Weg nach Eggesin zu wählen, der durch einen sehr hübschen, von Rehen, Wölfen und Wildschweinen bevölkerten Wald führte. Mit Cyclocross-Bereifung kommt man die erste Hälfte ganz gut dadurch, aber dann folgt ein Abschnitt aus reinstem Zuckersand, der meinen Oberschenkeln und meinem mentalen Sicherungskasten für diesen Tag den Rest gab.</p><p>Verschwitzt und verstaubt stand ich eine halbe Stunde später vor “Schwester Anja”, der scheinbar letzten arbeitenden Person des <a href="http://bk-diakonie-eggesin.de/hospiz.html">Hospiz Vergissmeinnicht</a>, einem ruhig gelegenen letzten Heim für schwerstkranke oder sterbende Menschen. Ich war der einzige “Kunde” in der Einrichtung, die planerisch für einen deutlich größeren Ansturm von zu Testenden ausgelegt ist und fühlte mich ein bisschen fehl am Platz. Schwester Anja bohrte ein bisschen in meinem Gehirn herum und eine Viertelstunde später bekam ich mein amtliches, kostenloses, negatives Testergebnis, ausgestellt auf einem Blatt Papier mit offiziellem Stempel. In der Nachbetrachtung habe ich dem Einsatz von Schwester Anja den Rest meiner Tour zu verdanken und daher entschloss ich mich soeben, 150€ <a href="http://bk-diakonie-eggesin.de/spenden.html">an das Blaue Kreuz Eggesin</a> zu spenden.</p><p>Auf dem Rückweg fiel ich nicht auf die Treibsandfalle des Waldgebiets herein, sondern wählte den langen Weg; erstaunlich, dass sich Wege doppelt so lang anfühlen, wenn man sie am selben Tag schon einmal bestritten hat, aber eine halbe Stunde später stand ich wieder an der Rezeption und konnte endlich einchecken.</p><p>Das Highlight dieses kleinen Platzes ist definitiv sein direkter Zugang zum Stettiner Haff mit einem winzigen von Schilf umgebenen Sandstrand. Sonst ist der Platz sehr familiär ausgerichtet, mit einem durchschnittlichen, aber sehr sauberen Sani-Haus ausgestattet und wird von äußerst freundlichen Campern bewohnt. Wer nur mit einem Zelt unterwegs ist, kann es hinter einem Bauwagen verstecken und ungestört beim Einschlafen dem Rauschen der Ostsee und den Flügelflattern eines Vogelschwarms lauschen, der in einer Weide am Strand übernachtet.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*RWNoV81MhmBrk5A5flhslA.jpeg" /></figure><p>Von Bellin gibt es einen ausgeschilderten Schleichweg für Radfahrer zum Ueckermünder Strand, der an Naturwiesen und Feldern vorbeiführt. Ich gönnte mir dort nach den Umwegen des Tages noch eine Stärkung beim Strandimbiss <a href="https://nordlicht-gastro.de/">Nordlicht</a> (das Hamburger Schnitzel ist laut Bedienung nicht der Rede Wert, der Zander mit Bratkartoffeln dagegen sehr empfehlenswert), watete noch eine Weile durch die Brandung und rollte schließlich zurück zu meinem Schlafplatz.</p><h4>Tag 4 Ueckermünde</h4><p>Jeden Tag damit zu beginnen, sein Zelt zusammenzurollen, kann ganz schön ermüdend sein, gerade wenn man auf einer mehrtägigen Radtour unterwegs ist und ein schönes Fleckchen Erde erwischt hat und daher beschloss ich bereits bei der Planung, zwei Tage in Ueckermünde zu verbringen. Dieser Tag war gewissermaßen mein lazy day, den ich damit begann, einen kurzen Ausflug zum bedenklich nahe der polnischen Grenze gelegenen Dorf <strong>Vogelsang</strong> zu unternehmen und mich wieder einmal an der Ruhe eines Örtchens zu erfreuen, der von Glück sagen kann, dass er überhaupt auf einer Karte verzeichnet ist. Den Rest des Tages brachte ich damit zu, mich mit Fischbrötchen zu verpflegen, die autoverseuchte Innenstadt näher zu erkunden, dem letzten verbleibenden Touristenschiff <em>Jan van Cuyk </em>der <a href="https://reederei-peters.de/">Reederei Peters</a> bei der Aufnahme seiner Passagiere zuzuschauen und es mir am Strand gemütlich zu machen.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cIp1gG16kKcRcfQwRYRb2g.jpeg" /><figcaption>Blick übers Stettiner Haff. Am Horizont: Usedom</figcaption></figure><p>Mein persönliches Highlight des Ueckermünder Strands sind seine zwei über hundert Jahre alten Weidenbäume, die UV-aversen Besuchern wie mir angenehmen Schatten spenden, ohne dafür einen Strandkorb mieten zu müssen. Ansonsten bietet Ueckermünde viel Banales und wenig Aufregung. Ein Tag ohne besondere Vorkommnisse, an dessen Ende ich lediglich an einem leidlich starken Sonnenbrand an den Oberschenkeln litt und den ich mangels coronabedingt sinnvoller Restaurantauswahl mit einem Krabbencocktail vom örtlichen Edeka beschloss.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FNLOh7fqG0dg%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DNLOh7fqG0dg&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FNLOh7fqG0dg%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/983949ac79e0c7a262eee5cd551aed12/href">https://medium.com/media/983949ac79e0c7a262eee5cd551aed12/href</a></iframe><h4>Tag 5 Ueckermünde — Gartz / Mescherin</h4><p><a href="https://www.komoot.de/tour/443957301">From Bellin to Gartz (Oder) | Rennrad-Tour | Komoot</a></p><p>Zeit, sich auf den Heimweg zu machen. Der Einstieg in den deutschseitigen <a href="https://www.oder-neisse-radweg.de/">Oder-Neiße-Radweg</a> erfolgt an dem vortags bereits besuchten Örtchen <strong>Vogelsang</strong> und führt dann über glatten Asphalt durch dichte Wälder und versteckte Dörflein vorbei, entlang mooriger Landschaften und man kann bereits auf dem Weg erahnen, was einen direkt an der Oder erwarten wird. Auf dem Weg kamen mir eine ganze Menge Radwanderer entgegen, junge wie alte, schnelle wie langsame und die meisten grüßten freundlich, was immer darauf hinweist, dass die Strecke, die hinter ihnen und damit vor mir liegt, eine halbwegs leicht zu befahrende sein muss.</p><p>Auf dem Weg hielt ich kurz für die Länge eines Müsliriegels an einem kleinen Hain an einem traumhaft schönen Feld, das beinahe von absoluter Ruhe eingerahmt war (km 27), die aber auch Pferdebremsen und Libellen für sich entdeckt hatten. Ein paar ziemlich unangenehme Stiche später schwang ich mich wieder auf den Asphalt, um nach etwa 50km in <strong>Löcknitz</strong>, einem der größeren Städtchen in der Nähe des Oder-Randwanderweges, anzukommen und dort nach einer Mittagsverpflegung zu suchen.</p><p>Die typische ostdeutsche Verpflegungsregel gilt auch hier: vernünftige Restaurants sucht man vergeblich und wenn man sich weder für den fettigen örtlichen Ortsimbiss, meistens eine Mischung aus Dönermann und Italiener, noch für ein Kalorien-Puzzle aus dem lokalen Scotty-Netto entscheiden möchte, freut man sich immer, wenn es wenigstens einen Bäcker gibt, der so aussieht, als wenn er einen guten Mohnkuchen zustandebringt. Der mir angebotene war allenfalls durchschnittlich, aber dafür durfte ich ihn bei guter Gesellschaft genießen. Mangels weiterer Sitzgelegenheiten gesellte ich mich zu zwei Damen gehobeneren Alters und wählte als Gesprächseinstieg einen meiner Cool Cats-NFTs, der zu dem Zeitpunkt umgerechnet einige tausend Dollar wert war. Sie hätten von sowas gehört, sagten die Damen und das war unser Einstieg in ein sehr anregendes einstündiges Gespräch über Ökonomie, Gesellschaft, Infrastruktur, Politik und Corona-Impfungen. Anders als befürchtet, bestätigten sich meine plumpen Vorurteile gegenüber des ostdeutschen Landalters keineswegs; beide waren weder Impfgegnerinnen noch offen rechts eingestellt. Der differenzierte Extrakt unserer Konversation war, dass sich diese (und vermutlich auch viele andere) Region Ostdeutschlands auf eine abstrakte Weise abgehängt fühlt. Eine Konsequenz, auf die wir uns verständigen konnten, war die bessere strukturelle Integration, die Schaffung von lokaler Ökonomie, die über Hofläden und Ein-Euro-Shops hinausgehen müsse und die Wiedergewinnung der Attraktivität ländlicher Regionen für den Nachwuchs. Denn es ist kein Vorurteil, dass ein Großteil der hier ausgebildeten Jugend sobald sie die Grenze zur Volljährigkeit überschreitet, in die Großstädte abwandert, in ihrem Falle Schwerin, Hamburg und Bremen.</p><p>Nach dieser inspirierenden Mittagspause machte ich mich wieder auf den Weg und folgte ungeachtet des Komoot-Plans nicht der Bundesstraße nach Glasow, sondern folgte dem beschilderten Radweg nach <strong>Lebehn</strong>, der ab ebendiesem Ort in einen unmöglich zu befahrenden, 3km langen Wirtschaftspfad aus Treibsand mündet. Er gehörte definitiv zu den mentalen Herausforderungen dieser Reise: wer schonmal ein Fahrrad mit Gepäck über diese Distanz geschoben hat, wird mir beipflichten, dass man spätestens ab der der Hälfte eines solchen Trampelpfads damit beginnt, über den Sinn des Lebens nachzudenken. Glücklicherweise gings im Anschluss auf halbwegs glatter Strecke über ein paar Winkel weiter gen Süden. Ein paar Schokoladenkekse, die noch aus Prenzlau übrig waren, retteten die letzten Kilometer. Dort traf ich erstmals auf einen polnisch-deutschen Grenzübergang und bekam einen Vorgeschmack auf das prägende Marschland der Oder.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*u_VDncE1aC-EbOMwmjJx7A.jpeg" /><figcaption>Polen ganz nah</figcaption></figure><p>Mein Ziel war der <a href="https://www.campingplatz-mescherin.de/">Campingplatz am Oderstrom</a> am Rand des kleinen Grenzorts <strong>Mescherin</strong>, auf dem man, obwohl er auf der deutschen Seite liegt, vorrangig polnisch spricht, aber dank seiner Lage an einer der schönsten Radrouten des Landes auch auf Holländer und Briten trifft. Ich schlug mein Zelt unter einer hochgewachsenen Birke auf und stellte nach wenigen Minuten fest, dass auch eine Armee von undefinierbaren Vögeln diesen Baum als Raststätte bevorzugt, sodass ich es rasch einige Meter außer Fallreichweite ihrer Hinterteile bewegen musste. Ganz so aufmerksam war das benachbarte elektrisch unterstützte Radreiseehepaar nicht, aber ich vermied es, sie mit der Situation zu konfrontieren und wünschte ihnen stattdessen innerlich viel Glück und Kraft beim Putzen. Die Sani-Anlagen dieses Camping-Platzes sind definitiv nicht luxuriös und die Duschen erinnerten mich wieder einmal an längst vergangene kompanieweite Gefechtsbesprechungen im Mannschaftsduschraum, aber wenn man einmal alle Scham abgelegt und eine Pferdebremsen- bzw. Zuckersandtortur hinter sich gebracht hat, ist einem warmes Wasser ohnehin wichtiger als der Erhalt männlicher Würde.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*9HKZ2pnrWmwh-PREHBC4Hg.jpeg" /><figcaption>Ein Vorschau auf die Oder</figcaption></figure><p>Zur Entschädigung und meinem Glück kam ein polnischer Koch auf die Idee, sein “<a href="https://park-restaurant.com/">Park-Restaurant</a>” direkt auf diesem Campingplatz zu eröffnen und Gerichte deutscher Prägung anzubieten, es stehen aber auch einige polnische Spezialitäten auf der Karte, darunter Piroggen und Kartoffelpuffer mit Gulasch, aber ich entschied mich für den sicheren Weg und wählte das Zigeunerschnitzel, das hier ganz unschuldig, völlig ungeniert und politisch längst nicht mehr korrekt, seinen ursprünglichen Namen trägt. Wer mit Oma und Opa, Kind und Kegel mal einen netten Ausflug ins Grüne machen möchte, dem sei dieses Plätzchen wärmstens ans Herz gelegt.</p><p>Ich beschloss den Tag mit einem Blick in den Himmel: hunderte Wildgänse nutzen die Region um den Campingplatz als Zwischenstopp auf ihrem Weg nach Süden und zogen in ununterbrochenen Schwärmen über unsere Köpfe hinweg. Genauso attraktiv scheint das Fleckchen Erde für Mückenmütter zu sein, die ich als Zentrlalberliner längst für ausgestorben hilt; ihr Nachwuchs bevölkerte in kurzer Zeit meine Beine und wie mir am nächsten Tag klar wurde, war es mir längst nicht gelungen, alle von ihnen in die ewigen Jagdgründe zu schicken. Kurz bevor ich ins Zelt kroch, lernte ich meinen Nachbarn kennen, der ein deutlich ambitionierteres Ziel als ich verfolgte. Er kam aus Zittau und plante 100km-Etappen bis nach Friesland und hatte dafür ein wirklich anspruchsvolles Flaschen- und Taschensetup an seinem Bike befestigt, sodass man kaum noch Rahmen oder Reifen erkennen konnte. Ich wünschte ihm viel Glück und gute Beine und genoss anschließend die Ruhe dieses Ortes. Es gelingt mir wie vermutlich vielen anderen auch selten, in einem Zelt die Nacht durchzuschlafen, sodass ich kurz vor Sonnenaufgang wach wurde und bemerkte, dass man absolut gar nichts hörte. Ein Ziel hatte ich hiermit erreicht: ich versuchte, auf der Tour Orte zu finden, die 100% geräuschlos sind und hier, kurz hinter der deutsch-polnischen Grenze, zwischen Schilfrohr und Gänserastplatz, hatte ich sie plötzlich gefunden.</p><h4>Tag 6 Mescherin — Parstein</h4><p>Die Nacht zählte aus besagten Gründen zu den angenehmsten, die ich überhaupt auf einem Campingplatz verbracht habe und so konnte ich morgens nach einer raschen Dusche ziemlich selbstbewusst in den Tag starten.</p><p><a href="https://www.komoot.de/tour/445025382">From Gartz (Oder) to Parstein | Rennrad-Tour | Komoot</a></p><p>Der Weg aus Mescherin führt über einen malerischen, aber schattigen und daher relativ kühlen Wanderweg nahe an der Oder entlang und schließlich trifft er bei <strong>Gartz</strong> auf den <a href="https://www.oder-neisse-radweg.de/">Oder-Neiße-Radweg</a>. Ein großes Schild weist darauf hin, dass er wegen Bauarbeiten geschlossen sei, aber der Wirt des danebenliegenden Cafes versicherte mir glaubwürdig, dass das Schild schon viel zu lange dort stand und der Weg längst wieder befahrbar sei. Am Einstieg des Radwegs (km 6,2) traf ich auf einen reichlich ambitionierten polnischen Radfahrer, der am Morgen in Stettin aufgebrochen war, auf der deutschen Seite bis nach Kostrzyn fahren und auf der polnischen Seite wieder zurückkehren wollte; ich weiß natürlich nicht, ob er das geschafft hat, aber ich habe seine Tour in Komoot spaßeshalber einmal nachgestellt:</p><p><a href="https://www.komoot.de/tour/451237747?ref=wtd">Rennrad-Tour | Rennrad-Tour | Komoot</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*FIAtgIzIIeJZ0yIKq8PAww.jpeg" /></figure><p>Der <a href="https://www.oder-neisse-radweg.de/">Oder-Neiße-Radweg</a> ist gerade für schnelle Fahrer perfekt belegt und führt schnurgerade an der weitestgehend trockengelegten Oderniederung auf dem Deich entlang. Da es nahezu keinen Baumbewuchs beiderseits der Strecke gibt, fährt man allerdings permanent im Wind, was je nach Wettersituation, Fahrrad und Kleidung ziemlich anstrengend sein kann; mich hat der Wind an diesem Tag jedenfalls hart getroffen und machte leichtes Rollen entlang des Weges völlig unmöglich. Entschädigt wurde ich von den grandiosen Ausblicken, den vielen kleinen Haltemöglichkeiten an den Brücken, die zu den malerischen Oderstädtchen führen und vielen freundlichen Radlern, mit denen man sich über Fahrtziele und Ausrüstungen austauschen kann. Nach 20km Kampf mit dem Wind gelangte ich gut durchlüftet in die Industriestadt <strong>Schwedt</strong>, in der ich mangels Alternative wieder einmal beim lokalen Norma Bananen, Sandwiches und Mineralwasser verpflegte und an einer gut versteckten Parkbank inmitten des “Tabakviertels” der Stadt verschnaufen und mich mental auf die nächsten zwanzig Kilometer entlang des Oderstroms vorbereiten konnte.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*tjfRUVVS14ra6v-4cXUYaw.jpeg" /></figure><p>Bei Stolzenhagen (km 47) bog ich in Richtung meines Tagesziels <strong>Parstein</strong> ab und wurde erneut von den auf Pasewalker Höhe bereits bekannten eiszeitlich bedingten Gletscherhügeln getroffen, die 50 Meter über dem Oderspiegel liegen und deren Anstieg ich mit der Ambition eines Alpinspezialisten anging und letztlich nur mit dank Mobilisierung einiger Kraftreserven überwand. Der <a href="https://parsteiner-see-camping.de/">Campingplatz am Parsteiner See</a> ist großzügig angelegt und schön gelegen und zieht Tagestouristen aus ganz Deutschland an, was nicht zuletzt an seinem namensgebenden Seezugang liegen dürfte. Hier kann man Jesus-gleich über 200m weit durch klares, flaches Wasser in den See hineinwaten, bis er einem schließlich bis an die Hüften reicht.</p><p>Ich schlug mein Zelt am Rande der leicht abschüssigen Zeltwiese auf und verpflegte bei “<a href="https://rons-diner.de/">Ron’s Diner</a>”, der Pizzas mit einer Qualität backt, die weit über das erwartbare Niveau eines Lokals auf einem Campingplatz hinausgehen. Sonnenverbrannt, windgebeutelt und kugelrund gegessen blieb mir für den Rest des Tages nicht viel mehr übrig, als von der Liegewiese aus für die Schwimmversuche der Kleinstkinder im 10cm flachen Wasser gedankliche Sternebewertungen abzugeben.</p><h4>Tag 7 Parstein — Berlin</h4><p>Man sagt ja, dass Rückwege immer kürzer sind als Hinwege, weil der Gedanke, sein Haupt endlich wieder im vertrauten Heim betten zu können einen Sog der Sehnsucht entfacht, der Beine schneller rotieren lässt. Auch meine letzte Etappe stand unter diesem Zeichen und ich brauchte für die restlichen 76km deutlich weniger Zeit als ich erwartet hatte.</p><p><a href="https://www.komoot.de/tour/446259391?ref=wtd">From Parstein to Kreuzberg | Rennrad-Tour | Komoot</a></p><p>Nach einer regnerischen Nacht, die von ständigem Hin- und Herrutschen im Zelt geprägt war, das ich blöderweise auf zu stark abfallendem Gelände aufgebaut hatte, warf ich einen letzten Blick auf die Morgenstimmung über dem Parsteiner See, faltete ein letztes Mal in Ruhe alle Klamotten zusammen und folgte dem Weg in der Richtung, aus der ich vortags gekommen war. Dieses Stück Brandenburg haben kleine Biobauernhöfe und Hofläden für sich entdeckt. Mein Weg führte mich zunächst einige Kilometer auf einem Radweg entlang einer kleinen Landstraße, die von Obstbäumen gesäumt ist und sich nach 10km zu einer Bundesstraße öffnet. An einem Sonntag morgen waren hier erfreulich wenige Fahrzeuge unterwegs und Feuchte der Nacht hing noch in den Bäumen und sorgte für eine angenehme Kühle; perfekte Bedingungen für einen ausdauernden Antritt auf glattem Asphalt. Auf dem Weg nach Eberswalde quert man den malerischen Klosterort <strong>Chorin</strong>, der sich übrigens als guter Startpunkt für Radtouren Richtung Angermünde und Prenzlau bewährt hat, und von Berlin Hbf mit der Regionalbahn in weniger als einer halben Stunde zu erreichen ist. Ab Kloster Chorin führt wieder ein gut ausgebauter, gerader Radweg Richtung Eberswalde, der sich am Eingang der der Stadt nochmals deutlich verbreitert.</p><p><strong>Eberswalde</strong> ist ein ansehnliches Städtchen, das wie so viele Orte, die ich besuchte, nicht übermäßig viele Optionen für die Rast bietet, jedenfalls nicht an einem Sonntag morgen. Ich entschied mich wie wahrscheinlich jeder Tourist, der Eberswalde kreuzt, für die offensichtliche: den prominent am zentralen Marktplatz gelegenen <a href="https://www.wiese-brot-gustav.de/">Bäcker Gustav</a>. Ein bisschen zu offensichtlich, denn es gab leider keinen Platz mehr, den man mir anbieten konnte und somit blieb mir auch auf der letzten Etappe die Chance auf ein sinnvolles Frühstück in würdevoller Haltung verwehrt. Ich entschied mich für eine Zimtschnecke und eine Sesamseele, die zu den besten Backwerken gehörten, die ich als Convenience Backshop-geplagter Neuköllner seit langem genossen habe (zur Verteidigung: Back.art in der Dieffenbachstraße macht hervorragende Walnussbrötchen und Pasteis de Nata).</p><p>Der Weg südlich von Eberswalde führt durch ehemaliges Gletschergebiet und ist mit Sicherheit ein Geheimtip für Wanderer; für Radfahrer gibt es einige kleinere Unebenheiten zu erklimmen, und ich fragte mich, ob ich mit einem saftigen Rührei statt einer trockenen Seele das Umschalten auf den kleinen vorderen Kranz hätte vermeiden können. In <strong>Biesenthal</strong> tankte ich bei einer erstaunlich gut besuchten Tankstelle eine Club Mate und fuhr ohne weitere Unterbrechung weiter nach <strong>Bernau</strong>. Der Vorort von Berlin mit seiner alten Stadtmauer und der historischen Kirche mag ein Traumort für stadtnah suchende Eigenheimbesitzer sein, ich fand ihn aber noch nie so richtig überzeugend. Ich durchquerte die Stadt und pausierte an einer lieblosen Industriebrache, wo ich mir den letzten Rest der Eberswalder Zimtschnecke genehmigte.</p><p>Man weiß, dass man wieder im Berliner Einzugsgebiet angekommen ist, sobald man die A10 am Dreieck <strong>Schwanebeck</strong> quert. Hier verlaufen auch relativ gut befahrbare, aber stellenweise verwurzelte Radwege neben der Bundesstraße und ab dem Örtchen mit dem musikalischen Namen <strong>Lindenberg</strong> steigt die Tankstellendichte um 300%.</p><p>Kaum überquert man die Stadtgrenze, wird man selbst an einem Sonntag sofort vom Verkehrswahnsinn der Großstadt erschlagen: Autos die sich an Ampeln stauen, Radfahrer, die einem in der falschen Richtung entgegenkommen, Baustellen und Fußgängerfurten, die die Radwegsituation spontan unterbrechen und Straßenschäden, die einen zwingen, zum Bordstein einen Meter Abstand zu halten sind die typischen Highlights, die der Bezirk Pankow in seinem Norden zu bieten hat. Schon die Parkstraße in <strong>Weißensee</strong> macht da mit ihrem glatten Belag eine wohltuende Ausnahme, schlagartig besser wird die Situation, sobald man in grüner politisierten Bezirken die Popup-Radwege und baulich getrennten Fahrradspuren in Anspruch nehmen kann. Das tun allerdings gerade Sonntagmittags auch viele andere Radler und so verringerte sich die Durchschnittsgeschwindigkeit bei der Passage nach <strong>Kreuzberg</strong> gefühlt um die Hälfte.</p><h4>Aftermath</h4><p>Nach über 450 getrackten und sicherlich über 50 nicht getrackten Kilometern gönnte ich mir zur Feier der unfall- und plattenfreien Tour ein zünftiges Chicken Madras bei meinem Lieblingsinder am Maybachufer, schüttelte meine Zeltplanen und den Schlafsack aus und genoss es, wieder auf einem bequemen Sofa sitzen zu können. Home Sweet Home könnte man sagen, bis der erste Notfalleinsatz am Kotti mich wieder aus der heimeligen Idylle riss.</p><p>Was kann man von dieser nicht allzu anspruchsvollen, aber sicherlich auch nicht trivialen, kleinen Privattour nun mitnehmen?! Zunächst: wenn Ihr einen einen Urlaub an der See machen möchtet, braucht Ihr dafür weder Pkw noch Bahncard, sondern vor allem ein solides Fahrrad, ein bisschen Ausdauer, einen stabilen Gepäckträger und ein bisschen Camping-Equipment. Die meisten Campingplätze haben Waschmaschinen und Trockner am Start, sodass man auch ein bisschen länger an einem Ort verweilen kann, wenn man nicht wie ich den Weg als Ziel sieht. Den Weg zum Ziel zu machen ist allerdings eine ganz wunderbare Möglichkeit, dem Alltag zu entfliehen und ein bisschen was zu erleben; auch wenn ich definitiv keine spektakulären Erinnerungen an diese Tour mit nach Hause genommen habe, überwiegen die vielen Eindrücke, die man unterwegs sammelt, die Mühe, die man manchmal aufwenden muss, um über das hügelige Hinterland zu strampeln.</p><p>Ich kann jedem nur empfehlen, es einmal auzuprobieren!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=57e5805e1c22" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Wer baut den besten Impfausweis?]]></title>
            <link>https://medium.com/t14g/wer-baut-den-besten-impfausweis-e8fad1dc1535?source=rss-53cacc38e8a4------2</link>
            <guid isPermaLink="false">https://medium.com/p/e8fad1dc1535</guid>
            <category><![CDATA[passport]]></category>
            <category><![CDATA[vaccinations-for-travel]]></category>
            <category><![CDATA[verifiable-credentials]]></category>
            <dc:creator><![CDATA[Stefan Adolf]]></dc:creator>
            <pubDate>Wed, 10 Mar 2021 11:10:48 GMT</pubDate>
            <atom:updated>2021-04-23T09:36:51.252Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Tx4Sh0g0AzajhU3m3lAJSA.png" /></figure><h3><strong><em>tl;dr</em></strong></h3><p><em>Der Bund hat unter Hochdruck ein Konsortium aus IBM und ubirch damit beauftragt, eine Lösung für digitale Impfnachweise zu entwickeln. Mit dieser Entscheidung setzt man auf eine Lösung, die Impfzertifikate auf mehreren Blockchains verankert, personenbezogene und korrelierbare Daten beim Überprüfen offenlegt und zur Identitätsprüfung weitere analoge Merkmale benötigt.</em></p><p><em>Wir diskutieren im Folgenden, warum man nicht besser dem international laufenden Standardisierungsverfahren folgt und mit auf Self Sovereign Identities (SSI) basierten Verifiable Credentials (VC) einen Ansatz wählt, der sowohl aus Effizienz-, Datenschutz- und Interoperabilitätsgründen für den internationalen Einsatz deutlich besser geeignet wäre.</em></p><p>––––</p><p>Seit dem 9. März 2021 ist klar: Die 2.7 Mio. schwere Ausschreibung des Bundes über die Entwicklung eines datenschutzkonformen, digital auswertbaren und fälschungssicheren Impfnachweises geht an ein Konsortium aus dem Kölner Startup <a href="https://ubirch.de/">Ubirch</a> und dem Software-Konzern IBM. Innerhalb von 12 Wochen sollen sie (auf Grundlage ihrer bisherigen Entwicklungen) einen Impfnachweis entwickeln, der es Personen ermöglicht, ihren Immunitätsstatus z.B. in Flugzeugen oder an Theaterkassen nachzuweisen.</p><p>Im folgenden analysieren, bewerten und kritisieren wir diesen Ansatz. Wir beschäftigen uns seit Anfang 2021 mit digitalen Impfzertifikaten gemäß internationaler interoperabler Standards im dezentralen Umfeld, verfolgen aufmerksam alle Aktivitäten der internationalen Initiativen und entwickeln angesichts der Vielfalt der weltweit zum Einsatz kommenden Impfzertifikate derzeit quelloffen einen “<a href="https://github.com/elmariachi111/ultimate-non-infectious-verifier/blob/main/README.md">universal verifier</a>”, der in der Lage sein soll, alle Varianten solcher Zertifikate zu verifizieren. Inspiriert wurde dieser Artikel von folgendem Tweet:</p><h3>JavaScript is not available.</h3><p>Soso, der Digitale Impfpass „wird kryptografisch signiert und in insgesamt fünf Blockchains hinterlegt&quot;Kann mir bitte jemand erklären, warum man dafür *überhaupt* eine Blockchain braucht?Und wofür vier weitere?</p><p>Wir möchten vorwegschicken, dass wir uns zwar mit ubirch’s Protokoll auf Quellcode-Ebene auseinandergesetzt haben, aber mangels direkter Erfahrung mit dem Code einige technische Details im folgenden möglicherweise nicht zu 100% korrekt darstellen. Wir behaupten, dass diese Fehler für die generelle Bewertung des Ansatzes aber zu vernachlässigen sind und beheben sie nach konstruktiven Hinweise gerne nachträglich.</p><h3>1. Analyse</h3><p>Wie sich den <a href="https://www.spiegel.de/netzwelt/gadgets/ubirch-und-ibm-erhalten-zuschlag-fuer-deutschen-digitalen-impfnachweis-a-9f26439b-8fd8-4118-9221-eb8844946c69">heute</a> dazu <a href="https://www.heise.de/news/Digitaler-Corona-Impfpass-IBM-Ubirch-und-fuenf-Blockchains-5076161.html">erschienenen</a> <a href="https://www.golem.de/news/corona-impfuing-ibm-erhaelt-zuschlag-fuer-digitalen-impfnachweis-2103-154774.html">Artikeln</a> und <a href="https://twitter.com/Linuzifer/status/1369262315711979520">Tweets</a> entnehmen lässt, beruht die Sicherheit von ubirchs Lösung auf einer Verankerung der Hashes von Impfzertifikaten auf mehreren Blockchains. Persönliche Informationen sind von diesen öffentlich sichtbaren Hash-Ankern nicht ableitbar. Im Detail ist die Verankerung ein wenig komplizierter, denn würde man tatsächlich jeden einzelnen Hash eines Zertifikats auf eine lineare Blockchain schreiben, stieße man unweigerlich an die Leistungsgrenzen von dezentralen Ledgern.</p><p>Daher nutzt ubirch ein Rollup-Prinzip, das auch in Level 2-Netzwerken oder in zugangsfreien dezentralen Dateisystemen wie IPFS genutzt wird. Nodes sammeln über einen längeren Zeitraum Zertifikatshashes, ordnen sie gemäß ihrer empfangenen Reihenfolge zu einer Baumstruktur und bilden daraus einen durch Hashlinks verbundenen Merkle-Tree, dessen Root-Knoten auf der Chain verankert wird. Man kann nun lediglich durch Kenntnis eines Zertifikats, seiner Eltern-Hashes im Merkle-Tree und der Ankertransaktion des Root-Hashes beweisen, dass das Zertifikat zu einem bestimmten Zeitpunkt verfügbar war und seither nicht verändert wurde.</p><p>Diese Komplexität hat ubirch ursprünglich nicht für Impfnachweise entwickelt, sondern um massenweise IoT-Events auf Blockchains zu verankern. Daher ist ihre Implementierung primär auf Skalierbarkeit ausgelegt und wird <a href="https://github.com/ubirch/ubirch-event-log">quelloffen in Scala</a> zur Verfügung gestellt. Ubirch stellt Clients in <a href="https://github.com/ubirch/ubirch-client-go">Go</a>, <a href="https://github.com/ubirch/ubirch-protocol">C++</a> , <a href="https://github.com/ubirch/ubirch-protocol-java">Java</a> und <a href="https://github.com/ubirch/ubirch-protocol-python">Python</a> ebenfalls quelloffen zur Verfügung.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/996/0*R9RtbH9feKLtodgl" /><figcaption>ubirch event log ecosystem (Quelle: <a href="https://github.com/ubirch/ubirch-event-log">github</a>, Stand 09.03.2021)</figcaption></figure><p>Interessant ist die Auswahl von Blockchains, auf die ubirch Ankertransaktionen schreibt:</p><ul><li>Ethereum (Netzwerk unbekannt)</li><li>Ethereum Classic: ein seit 2016 existierender Ethereum-Fork, der mittlerweile nahezu keine praktische Relevanz mehr hat und nicht update-fähig ist</li><li>IOTA Mainnet: ein durch die IOTA Foundation entwickeltes DAG-Protokoll (“Tangle”), das kostenlose geldwerte Transaktionen zulässt, indem es den PoW zu den Clients verschiebt, die dafür zwei vorhergehende Transaktionen (“Tips”) wählen müssen. Bis heute ist IOTA’s Konsens mangels intrinsischer Inzentivierung auf einen zentral betriebenen Coordinator angewiesen, der bereits seit 2017 (!) durch einen kurz bevorstehenden (!!) “<a href="https://coordicide.iota.org/">Coordicide</a>” obsolet gemacht werden soll. Das aktuelle Vorhaben “<a href="https://github.com/iotaledger/goshimmer/wiki">GoShimmer</a>” ist auf dem besten Wege dahin, aber es ist nicht klar, ob sich ein uninzentivierter dezentraler Konsens überhaupt in der höchst aversiven Welt der Kryptoprotokolle stabilisieren lässt.</li><li><a href="https://www.govdigital.de/">GovDigital</a>: ein von der gleichnamigen “<em>Genossenschaft zur Integration innovativer IT-Lösungen der digitalen Daseinsvorsorge im öffentlichen Sektor</em>” betriebenes zugangsbeschränktes aber lesefreies <a href="http://bcp-govdigi01.tir.budru.de/block/649842">Ethereum PoA-Netzwerk</a> (Geth), mit Validatoren aus dem staatlichen / institutionellen Umfeld und fragwürdiger Dezentralität.</li><li><a href="https://bloxberg.org/">Bloxberg</a>: ein von internationalen Forschungsinstitutionen (z.B. KIT, FIT, TH Köln u.v.a.) aufgesetztes und betriebenes, <a href="https://blockexplorer.bloxberg.org/">zugangsbeschränktes Ethereum PoA-Netzwerk</a> mit einem simplen Faucet-System.</li></ul><h3>Use Cases</h3><p>Eine einfache Erläuterung des Funktionsprinzips <a href="https://ubirch.de/digitaler-impfnachweis">findet Ihr auch hier</a> im Original.</p><p>Die persönlichen und medizinischen Informationen, die zur Erzeugung und Verifikation des Zertifikats notwendig sind, werden während der Ausstellung des Zertifikats kodiert, aber <em>unverschlüsselt</em> in einen QR-Code verpackt und dieser dem Patienten mit der Bitte um sichere Verwahrung mitgegeben, z.B. auf Papier, per Email oder einer dafür geeigneten, proprietären Software-Wallet (die vermutlich IBM liefern soll).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/0*Lj2WsYwJnwkHKzPk.PNG" /><figcaption>Quelle: <a href="https://ubirch.de/digitaler-impfnachweis">ubirch</a> (Stand 9.3.2021)</figcaption></figure><p>Der Hash wird mittels oben genanntem Verfahren mit vielen anderen Hashes zu einem Merkle-Root kondensiert und dieser auf Blockchains verankert. Ein Prüfer kann einen QR-Code scannen, die Klartext-Informationen entnehmen, daraus erneut einen Hash erzeugen und einen ubirch “Filter-Node” beauftragen, ihn mit Hilfe anderer Hashes des entsprechenden Merkle-Trees aufzulösen. Heraus kommt eine Blockchain-Transaktion, die gewissermaßen den Hash der Impf-Informationen des Patienten enthält. So will ubirch sicherstellen, dass die präsentierte Information exakt der entspricht, die zu einem bestimmten Zeitpunkt von einer bestimmten Person (dem “Arzt”) über den Präsentierer getroffen wurde.</p><h3>Demo</h3><p>Man kann die Informationen leicht anhand der öffentlichen zugänglichen Demonstratoren extrahieren und auf Blockchains nachverfolgen: Hier ist ein QR-Code, der auf <a href="https://www.govdigital.de/govdigital/projekte">govdigital</a> veröffentlicht wurde:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/465/0*3ZCfmrm9KjE6Ydp9" /><figcaption>Quelle: <a href="https://www.govdigital.de/govdigital/projekte">govdigital</a> (Stand: 09.03.2021)</figcaption></figure><p>Wer ihn scannt, erhält <a href="https://zxing.org/w/decode?u=https%3A%2F%2Fwww.govdigital.de%2Fportals%2Fgovdigital%2FImages%2FUBIRC_QRCODE_DEMO_Certification.png%3Fver%3D2021-01-25-194729-283">folgendes Resultat</a> vom QR-Typ “URL”:</p><pre>https://ubirch.de/v#f=Mustermann;g=Felix;b=19680812;p=T01000322;i=3CF75K8D0L;d=202008261430;t=PCR;r=n;s=2feffc151cb726bb9ed7</pre><p>Wer die URL besucht, sieht folgendes:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/770/1*d7n9v-fVA06yDQ-NGtMehA.png" /><figcaption>Quelle: <a href="https://ubirch.de/v#f=Mustermann;g=Felix;b=19680812;p=T01000322;i=3CF75K8D0L;d=202008261430;t=PCR;r=n;s=2feffc151cb726bb9ed7">ubirch</a> (Stand 09.03.2021)</figcaption></figure><p>Ubirch selbst bietet eine Visualisierung der hinterlegten Anker an:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*h5F-dq0W1nYS0FmE_atjlw.png" /><figcaption>Visualisierung der Chain-Verankerung (Quelle: <a href="https://console.prod.ubirch.com/verification/graph?hash=WuWITSoIqHVvR9uwoF4dFLRX4G1f2gzy%2BUKvHxB70co%3D">ubirch</a>, Stand 09.03.2021)</figcaption></figure><p>und verlinkt auf die <a href="http://bcp-govdigi01.tir.budru.de/tx/0x66b7e146500eb36ad0cf77dbfeadaddffe3326b26bea0b36207874330216adaa">einzelnen</a> <a href="https://blockscout.com/etc/mainnet/tx/0xfaf69a4b2e0aa304095e6a46a92f5df2b0d8540baf83c323bb1a30dfc8f6cda7/internal-transactions">Chain</a>-<a href="https://explorer.iota.org/mainnet/transaction/YJVUAIZVASFMHUOTMOEHSVPRPCKKOHVKHNNPTC9JKMHO9BYGMPYXRIUHPCNDEAIQE9BBLDQHW9LEZ9999">Explorer</a>, in denen man die Ankertransaktion sehen kann:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/770/1*-OLrk1HlNvjWB5xvuItO2Q.png" /><figcaption><a href="http://bcp-govdigi01.tir.budru.de/tx/0x66b7e146500eb36ad0cf77dbfeadaddffe3326b26bea0b36207874330216adaa">Ankertransaktion auf govdigital </a>(Ethereum PoA) Stand: 09.03.2021</figcaption></figure><h3>2. Bewertung</h3><p>Man muss sich zunächst vor Augen führen, wozu ein Impfnachweis in der Praxis dienen soll; zwei Anwendungsfälle stechen dabei heraus. Im einfachsten Fall möchte man an der “Tür” eines Theaters, einer Bar oder eines Einkaufszentrums sicherstellen, dass die Eintretenden eine vergleichsweise geringe Infektionsgefahr für andere darstellen.</p><p>Man kann diesen Case zweifach ausgestalten: Man kann z.B. ausschließlich geimpften Personen den Zutritt gewähren (was effektiv zur Debatte einer Impfpflicht führt, in die wir hier nicht einsteigen möchten), um sicherzustellen, dass selbst wenn eine davon infektiös ist, sich alle anderen nicht anstecken können und von der Veranstaltung selbst keinerlei Gefahr ausgeht, zum Superspreading-Event zu werden. Andererseits kann man Geimpfte und (potenziell) nicht Geimpfte räumlich so stark mischen, dass eine maximale räumliche Distanz zu potenziell ansteckenden Personen gewahrt wird.</p><p>Der typische Anwendungsfall ist allerdings der internationale Reiseverkehr: Seit Jahrzehnten erlauben z.B. manche Länder die Einreise nur unter Vorlage einer gültigen Gelbfieberimpfung. Fluggesellschaften können daher durchaus darauf bestehen, dass Fluggäste einen aktuellen Testnachweis oder eben einen Impfnachweis erbringen, bevor sie den Passagier transportieren.</p><p>Die Fälschungssicherheit eines Impfpasses mag manchem zunächst als überzogene Anforderung erscheinen, tatsächlich sind Fälle bekannt, in denen sich Reisende <a href="https://www.travelandleisure.com/travel-news/travelers-using-counterfeit-covid-test-results">illegal Testausweise erschlichen</a> haben und deren Aussteller <a href="https://www.travelandleisure.com/travel-news/brazilian-tourists-jailed-faking-covid-19-tests">dafür auch hart bestraft wurden</a>. Der Schwarzmarktpreis eines gefälschten Testergebnisses lag laut diesen Quellen zwischen 150 und 300€.</p><h3></h3><p>Hab mir schonmal einen Impfnachweis besorgt, inspiriert vom Beispielcode auf der Website pic.twitter.com/hZgx64NfyL</p><p>Die ubirch-Lösung entspricht in ihrer Handhabung etwa dem Verfahren, das in China oder Israel (“Green Pass”) zum Einsatz kommt: Der Nachweisführende präsentiert eine Ankerinformation und persönliche Merkmale, der Verifizierer schlägt das entsprechende Zertifikat nach, prüft dessen Echtheit und gleicht ein analoges Merkmal (z.B. den Namen einer Person) vor Ort ab. Unter Gesichtspunkten des Datenschutzes ist ubirch vermutlich vielen anderen Lösungen weit voraus, da die Impfnachweise selbst in keinem zentralen Register stehen, sondern vom Nachweisführer selbst beigebracht werden.</p><h3>3. Kritik</h3><p>Wer ist eigentlich berechtigt, solche Impfzertifikate auszustellen? Einfache (naive) Antworten: das BMG, Hausärzte, Bundeswehrsoldaten im Impfzentrum oder Vertrauensstellen der Krankenkassen. Transportiert man diese Antworten ins Digitale, wird es aber plötzlich sehr kompliziert: Wer verhindert, dass ich als Programmierer kein Zertifikat über mich selbst ausstelle, und es mit Hilfe der für Verifizierer offen zugänglichen Nodes auf eine Blockchain schreibe?</p><p>Es gibt für diese Frage einige sehr gute Antworten, die Ihr weiter unten findet. Im Rahmen der ubirch-Lösung ist sie aber primitiv: Irgendjemand muss den schreibenden Zugang für die Zertifikatshashes beschränken. Anders formuliert und sehr stark vereinfacht: Eine Hausarztpraxis muss sich bei ubirch “anmelden”, damit sie Zertifikate für ihre Patienten ausstellen und verankern kann. Die Kooperation mit IBM soll in Deutschland dafür sorgen, dass dieser Prozess reibungslos in den Praxis- / Impfzentrumsalltag integriert wird. Hier <a href="https://ubirch.de/digitaler-impfnachweis">ein Zitat von der ubirch-Website</a>:</p><blockquote>Der Digitale Impfnachweis wird vor Ort im Impfzentrum oder beim Hausarzt erstellt. Die erforderlichen personenbezogenen und Impfdaten können direkt aus dem vor Ort genutzten System übernommen werden. Dafür gibt es bereits Integrationen wie beispielsweise in Excel, weitere sind möglich. Alternativ werden die Daten über ein schlankes WebInterface bzw. eine App erfasst. Durch eine weitestgehende Automatisierung bleibt der Aufwand minimal und lässt sich leicht in den Impfprozess integrieren.</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/640/0*y2J7teHcUxY5nAaN.png" /><figcaption>Quelle: <a href="https://ubirch.de/digitaler-impfnachweis">ubirch</a> (Stand 09.03.2021)</figcaption></figure><p>Um die Systeme von Hausärzten dazu zu autorisieren, solche Zertifikate mit Hilfe von ubirch-Nodes auf Blokchains zu verankern, bedarf es eines großen organisatorischen Integrationsaufwands: Arztpraxen müssen sich gegen IBM / ubirch authentifizieren (wer die Debatte um den KBV-seitigen Heilberufsausweis verfolgt weiß, wie viel Sprengstoff dieses Thema birgt) und unterliegen nun allen Gefahren, die eine zentrale Autorisierung mit sich bringt: verlorene Schlüssel, betrügerische Absichten, Mehrfachverwendung von Schlüsselmaterial, Kompromittierung der Schlüsselkarten, technische Komplikationen usw.</p><h4>Nachweisführung und Identifikation</h4><p>Wer am Fluggate seinen ubirch-Impfnachweis vorlegt, präsentiert vorrangig ein (digitales) Stück Papier, dessen Inhalt der Verifizierer auf einer Blockchain nachschlagen und damit ziemlich sicher sein kann, dass die Informationen auf dem Papier korrekt sind und zu welchem Zeitpunkt sie ausgestellt wurden. Diese Information alleine würde keinesfalls genügen, um eine Impfung der Person zu bescheinigen, weil sie sehr einfach kopierbar ist. Daher muss der Nachweisende zusätzlich persönlich identifizierbare Informationen vorlegen, die Bestandteil des Zertifikatshashes sind. Im aktuellen ubirch-Fall sind dies (es werden die Anwendungsfälle “Corona-Test” und “Corona-Impfung” behandelt)</p><ul><li>der volle Name</li><li>das vollständige Geburtsdatum</li><li>Eine persönliche Identifikationsnummer (z.B. Reisepass oder Patienten-ID)</li><li>Eine Identifikationsnummer des Tests bzw. Impfnachweisdokuments</li><li>Ein Testdatum bzw. die Impfdaten</li><li>Die Testmethode bzw. der verwendete Impfstoff</li><li>das Testergebnis (positiv / negativ)</li></ul><p>Sobald ein Verifizierer sich vergewissert hat, dass er dem Zertifikat selbst trauen kann, vergleicht er nun diese Informationen mit weiteren Merkmalen des Nachweisführers, z.B. dessen Personalausweis.</p><p>Ich hoffe, jemand hat die Glocken gerade klingeln gehört: Es stecken zwar keinerlei private Informationen im Ankerzertifikat, aber jeder Verifizierer erhält an dieser Stelle Zugriff auf eine Menge persönliche und medizinische Informationen, die für den eigentlichen Nachweis einer Immunisierung völlig überflüssig sind. Da dieser Abgleich manuell stattfindet, ist er fehleranfällig und wenn man ihn digitalisiert führt er zu einer maximalen Korrelierbarkeit personenbezogener Daten.</p><p>Das ist im internationalen Flugverkehr sicherlich noch hinnehmbar, aber für lokale Usecases ein <strong>maximales Datenschutzdesaster</strong>: Warum sollte Dieter Hallervordens <a href="https://www.schlossparktheater.de/start/index.html">Schlossparktheater</a> (das Ihr bitte sofort besucht, sobald Ihr Eure zweite Impfung im Arm habt!) oder die <a href="https://www.monkeybarberlin.de/">Monkey-Bar</a> Eure Versichertennummer oder Euren Geburtstag erfahren, wenn Ihr einfach nur nachweisen müsst, dass Ihr geimpft seid?</p><h4>Sicherheit der Nachweisführung</h4><p>Richtig Spaß macht ein Impfnachweis, der monatelang auf einem Zettel zusammen mit dem Personalausweis durch jede Bar getragen wird, nicht. Daher arbeitet die IOTA Foundation zusammen mit einem der namhaftesten Hersteller von fälschungssicheren Smartcards (Zebra) an <a href="https://www.zebra.com/gb/en/blog/posts/2021/dlt-blockchain-technology-can-help-us-create-globally-trusted-vaccination-verification-system.html">einem Impfausweis auf einer Plastikkarte</a>, die sowohl die gedruckten Informationen des Zertifikats und den entsprechenden QR-Code, eine über NFC zugängliche digitale Version des Zertifikats und als zusätzliches Sicherheitsmerkmal (“Evidence”) das Passbild des Trägers enthält.</p><p>Davon abgesehen, dass der Druck einer solchen Karte nicht billig und auf planetarem Scale auch kaum durchführbar ist, stellt sich die Frage, ob der impfende Arzt auch ein Foto des Patienten schießen soll oder ob man es durch Korrelation mit den Versichertendaten (Stichwort: ePA / eGK) beziehen kann und wer diese Schnittstelle in sicherer Form bereitstellen könnte oder, viel einfacher: Wer die dafür notwendigen Zebra-Drucker betreibt und finanziert.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FIvv1JArtHvM%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DIvv1JArtHvM&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FIvv1JArtHvM%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/2e2eff828f52c9178ff41fadb8ccea7d/href">https://medium.com/media/2e2eff828f52c9178ff41fadb8ccea7d/href</a></iframe><h3>Wer braucht eine Blockchain, wenn er 5 benutzen kann?</h3><p>Wirklich absurd wird es, wenn man die Onchain-Speicherung der Impfnachweise betrachtet. Der einzige denkbare Grund, warum man den Nachweis (bis zu) 5x auf irgendwelchen ominösen PoA-Chains verankert ist, dass eine dieser Blockchains oder der Zugang für Verifier zu ihnen “ausfällt” oder der beschränkte Zugang zu ihnen kompromittiert wird und es einem Angreifer gelingt, Transaktionen zu schreiben, die er nicht schreiben können sollte.</p><p>Das ist genau der Grund, warum jeder, der das Thema Blockchain wirklich ernst nimmt, verstehen sollte, dass permissioned Blockchains außerhalb eines industriellen bzw. notariellen Einsatzes (z.B. in ubirch’s ursprünglichem Usecase der Maschinentransaktionen oder im <a href="https://www.poa.network/">POAnetwork</a>) keinerlei Vorteile gegenüber replizierten Datenbanken haben.</p><p>Blockchains ermöglichen es dank ihres verteilten Konsensmodells, dass einander völlig unbekannte Teilnehmer, die sich nicht nur nicht vertrauen, sondern sogar gegenteilige Interessen vertreten, miteinander auf einer vertrauensvollen (bzw. vertrauenslosen, je nach Betrachtung) Grundlagentechnologie miteinander Transaktionen austauschen können — ein Konzept, das als “Coopetition” bekannt ist und das Ethereum Mainnet zu einer außerordentlich gut funktionierenden, bis heute nicht kompromittierten Plattform des maschinellen Vertrauen gemacht hat, die tagtäglich Milliardenwerte absichert und verschiebt.</p><p>Die Stabilität dieser Netzwerke wird intrinsisch inzentiviert: Dadurch sind sie ab einer gewissen Größe (z.B. durch die Verteilung von PoW-Minern oder der Verteilung von PoS-Stakes im Eth2-Netzwerk) absolut unkomprimittierbar und unabschaltbar; fällt ein Node aus, kann man sich jederzeit mit einem anderen verbinden.</p><p>Eines der größten Missverständnisse von klassischen Unternehmen, die Blockchain-Technologie für sich entdecken ist, dass man ein “dediziertes” Blockchain-Netzwerk aufsetzen und mit Passwörtern nur bestimmten Teilnehmern zur Verfügung stellen kann. Man verschiebt damit nämlich den grundsätzlichen Sicherheitsgedanken, dass Teilnehmer ihre Berechtigungen durch transparente Smart Contracts gewährt bekommen, an die Vordertür der Validator-Nodes und verliert alle Mechanismen, die onchain zur Absicherung und Vergabe dieser Berechtigungen vorhanden sind, wie Multisignatur-Wallets, DAOs oder tokenbasierte Rechte-Vergabe.</p><p>Doch die viel relevantere Frage ist: Muss man überhaupt Impfzertifikate auf eine Blockchain schreiben, damit sie sicher sind?</p><p>Nein.</p><h3>4. Die bessere Alternative: Verifiable Covid Credentials</h3><blockquote>Stell Dir vor, die ganze Welt einigt sich gerade auf eine Lösung, aber ein deutsches Startup hat eine “bessere” Idee.</blockquote><p>Die Herausforderung, einen sicheren digitalen und maximal interoperablen Impfnachweis herzustellen, der auch auf globaler Ebene für alle möglichen denkbaren Einsatzszenarien funktioniert, und ihn binnen weniger Monate zu realisieren ist so groß, dass viele kluge Köpfe sich seit längerer Zeit damit beschäftigen. Sie versuchen, zu einem globalen Konsens über Formate und Interaktionen auf Grundlage dafür geeigneter Technologie-Stacks und -Standards zu gelangen. Für Implementierer innerhalb der Europäischen Union setzt ein <a href="https://ec.europa.eu/health/sites/health/files/ehealth/docs/vaccination-proof_interoperability-guidelines_en.pdf">Papier der Europäischen Kommission vom 27. Januar 2021 </a>die Richtlinien, nach denen ein Impfnachweis idealerweise gestaltet werden sollte:</p><iframe src="https://drive.google.com/viewerng/viewer?url=https%3A//ec.europa.eu/health/sites/health/files/ehealth/docs/vaccination-proof_interoperability-guidelines_en.pdf&amp;embedded=true" width="600" height="780" frameborder="0" scrolling="no"><a href="https://medium.com/media/4b12a444afbc1537e022720681c26947/href">https://medium.com/media/4b12a444afbc1537e022720681c26947/href</a></iframe><h3>Initiativen</h3><p>Ehrlich: Wie viele Unternehmen, glaubt Ihr, arbeiten weltweit an dem Problem der “nachweisbaren, unfälschbaren, interoperablen, datensparsamen Impfzertifikate”? Wir haben nicht gezählt, aber hier sind ein paar der größten Initiativen, die viele Partnerunternehmen hinter sich vereinen oder auf Grundlage staatlicher Vorgaben längst an global einsetzbaren Lösungen arbeiten:</p><ul><li><a href="https://www.goodhealthpass.org/">Good Health Pass Collaborative</a> (gegründet im Februar 2021)<br>eine technologisch agnostische unabhängige “Dachorganisation”, die primär die Kommunikation zwischen Herstellern koordinieren möchte und der auch ubirch angehört.</li><li><a href="https://www.covidcreds.org/">Linux Foundation Public Health Covid Credentials Initiative </a>(Q2/2020)<br>arbeitet primär im nordamerikanischen / britischen politischen Umfeld und vereint Initiativen zur schematischen und technischen Ausgestaltung eines SSI/DID/VC-Prozesses</li></ul><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FionT4gvM4Os%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DionT4gvM4Os&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FionT4gvM4Os%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/b0dfee5a4c3ec49a9184d6524cf56097/href">https://medium.com/media/b0dfee5a4c3ec49a9184d6524cf56097/href</a></iframe><ul><li><a href="https://vaccinationcredential.org/">Vaccination Credential Initiative</a> (Dez 2020)<br>Microsoft, Salesforce, Oracle u.a., arbeiten an einem Credential-Standard auf Grundlage der sog. FHIR4/HL7 kompatiblen SMART Health Cards (Microsoft)</li><li><a href="https://www.canimmunize.ca/en/home">CanImmunize</a><br>Kanadische Initiative zur Definition eines auf medizinischen Formaten basierenden Impfdokuments</li><li><a href="https://www.iata.org/en/programs/passenger/travel-pass/">IATA Travel Pass</a><br>eine von Fluggesellschaften getriebene Initiative, einen digitalen “Travel Pass” zu entwickeln, um den internationalen Flugverkehr wieder öffnen zu können</li></ul><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FZx3otZ63wFw%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DZx3otZ63wFw&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FZx3otZ63wFw%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/00a14db54465896f199a68311449cfb8/href">https://medium.com/media/00a14db54465896f199a68311449cfb8/href</a></iframe><p>Eine weit darüber hinaus gehende, außerordentlich erschöpfende Liste vieler Unternehmen, die bereits Lösungen hierfür vorgestellt haben, die in einigen kleineren oder größeren Ländern (Indien!) bereits im Einsatz oder der Erprobung sind, hat der kanadische Startup-Gründer und Canimmunize-Supporter David Janes <a href="https://docs.google.com/document/d/1MQfZzlkYkXCXvnUXd7Cd6Y5g0RRXrKxGGqVcbBnSk1k/edit?usp=sharing">in einem detaillierten Google Document zusammengetragen</a>.</p><h4>Self Sovereign Identity &amp; Verifiable Credentials</h4><p>Seit 2014 tragen unterschiedlichste Unternehmen unter dem Dach der <a href="https://identity.foundation/">Decentralized Identity Foundation (DIF)</a> Spezifikationen, Implementierungen und Standards zusammen, die nicht weniger als der Revolution der Frage nachgehen: <em>Was ist eigentlich eine digitale Identität und wie weist man sich damit gegenüber digitalen Systemen aus?</em> Im Kern funktioniert es wie folgt:</p><ul><li>Eine Identität ist eine Sammlung von Schlüsselpaaren, die vollständig unter der Kontrolle einer Entität (Mensch oder Maschine) sind.</li><li>Technisch wird diese Identität durch einen global eindeutigen <a href="https://w3c.github.io/did-core/">Dezentralen Identifizierer (DID)</a> repräsentiert, z.B. did:ethr:0x90f8bf6a479f320ead074411a4b0e7944ea8c9c1</li><li>Mit Hilfe von sogenannten Resolvern lassen sich DIDs zu DID Dokumenten auflösen, die das gerade aktuelle, öffentliche Schlüsselmaterial, das eine DID benutzt zugänglich macht. Es gibt vielfältige zentrale und dezentrale Verfahren, darunter auch Blockchain-basierte, wie ein Resolver die vom Controller hinterlegten Schlüssel seiner DID zu einem DID Dokument auflösen kann. Eine naive ist die Verankerung von Changesets als Events auf der Ethereum-Blockchain, komplexere wie das chain-agnostische <a href="https://identity.foundation/sidetree/spec/">Sidetree</a> nutzen dafür Merkle Tree-Verfahren, um mit Hilfe von DLTs viele Changesets in einer nachweisbaren Ordnung zu speichern. Firmen wie Jolocom arbeiten z.B. an einer vollständig Peer-basierten Identität, die ihre selbstsignierten Changesets als lokal verifizierbares Eventlog (<a href="https://medium.com/decentralized-identity/keri-for-every-did-a-microledger-f9457fa80d2d">KERI</a>) auf Anfrage mit Resolvern teilt.</li><li>Ein DID-Dokument enthält keinerlei personenbezogene oder sonstige Profilinformationen wie E-Mail-Adressen oder URLs. Es enthält stattdessen lediglich die aktuelle Liste an Public Keys, deren Verwendungszwecke und Referenzen auf Registrierungs-Dienste, auf denen man mit der DID zusammenhängende Informationen abrufen kann. Dennoch gibt es Anbieter, die eine DID mit einem “gewohnten” sozialen Profil anreichern, wenn man das möchte. <a href="https://3box.io/0x70631b7376f4956185dac1b9cb4e9f83ccbc2764/">3Box war dafür ein großartiges Beispiel</a>, befindet sich aber derzeit in einer großen strategischen Transformation.</li><li>Die privaten Schlüssel hinter der DID müssen vom Inhaber sicher aufbewahrt werden. Hierfür gibt es zahllose Wallets (z.B. Jolocom, lissi, trinsic, connect.me), die mehr oder weniger nutzerfreundlich unter Zuhilfenahme von Secure Elements, Passphrases, Mnemonics oder biometrischen Verfahren ein grundlegendes hohes Sicherheitsniveau herstellen</li><li>Der Controller einer DID kann seine privaten Schlüssel nutzen, um Daten für verschiedene Anwendungsfälle zu signieren</li><li>Der wichtigste Anwendungsfall ist die Ausstellung von “<a href="https://www.w3.org/TR/vc-data-model/">Verifiable Credentials</a>” (VC). Das sind Statements (“Claims”), die eine Identität über eine andere trifft und die kryptografisch von einem “Verifier” überprüfbar sind. Das klassische Beispiel für VCs ist ein “Universitätsabschluss”, den eine Universität über einen Alumni ausstellt und ihm diesen an eine Credential-Wallet überträgt.</li><li>Verifiable Credentials sind in sich geschlossene, maschinenles- und kryptografisch überprüfbare Dateien, die theoretisch in jedem beliebigen System aufbewahrt werden können. Der “Träger” eines Credentials wird als “Holder” bezeichnet und wird zum “Prover”, sobald er von einem “Verifier” darum gebeten wird, ein Credential, das bestimmten Kriterien genügt (“hat Universitätsabschluss”) zu präsentieren</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/826/1*FvDp5U1PNwNC_cQ20xS3eQ.png" /><figcaption>Quelle: <a href="https://www.w3.org/TR/vc-data-model/#ecosystem-overview">W3C</a></figcaption></figure><ul><li>Die Claims innerhalb der VCs (“subjects”) werden üblicherweise in klar schematisierten JSON-LD Datenstrukturen abgelegt, sodass ein Verifizierer ohne Kenntnis der ursprünglichen Claim-Absicht eine Vorstellung von der Semantik der Felder innerhalb des Claims erhalten kann.</li><li>Es existieren bereits in der Praxis sog. zero knowledge-Verfahren, die es einem Holder erlauben, einem Verifier nur bestimmte, oder sogar funktional abgeleitete Aspekte eines Credentials zu präsentieren, ohne dass der Herausgeber diese Kombination oder Variation bei der Erstellung des Credentials vorausgesehen oder individuell signiert hätte.</li></ul><h4>Immunization Credentials</h4><p>Um ein global akzeptiertes “Covid Credential” für Tests oder Impfungen herauszugeben, muss sich die Community darauf einigen, welche Informationen für einen Impfnachweis überhaupt relevant sind. Das oben genannte Papier der europäischen Kommission gibt dafür eine gute Vorlage, aber auch <a href="http://build.fhir.org/ig/dvci/vaccine-credential-ig/branches/main/">Spezifikationen innerhalb des FHIR/HL7-Konsortiums</a> (getrieben von Microsoft) oder der global anerkannten “Semantic Web” Initiative <a href="https://schema.org/docs/meddocs.html">schema.org</a> sind auf einem guten Weg, einen akzeptablen Standard für medizinische Informationen innerhalb von Credentials zu entwickeln, der mit Medizinsystemen generell kompatibel sind. Selbst wenn es mehrere solcher Standards gibt, ist ein Verifier entweder durch Auflösung der referenzierten JSON-LD Schemata oder durch Auflösung eines referenzierten Credential Schemas die Semantik eines Claims innerhalb eines Credentials zu verstehen.</p><p>Der Prozess, nach dem Credentials zwischen Issuer und Holder bzw. zwischen Prover und Verifier ausgetauscht werden, ist grundsätzlich spezifiziert und referenzimplementiert (<a href="https://jolocom.github.io/jolocom-sdk/1.0.0/">Jolocom</a>, <a href="https://github.com/hyperledger/aries-rfcs/blob/master/features/0454-present-proof-v2/README.md">Hyperledger Aries</a>). Der Standard, nach dem alle Parteien gegenseitig verschlüsselt Informationen miteinander austauschen, ist ebenfalls spezifiziert (<a href="https://identity.foundation/didcomm-messaging/spec/">DIDComm 2.0</a>, <a href="https://github.com/decentralized-identity/didcomm-rs">Jolocom</a>), aber noch längst nicht von allen Parteien interoperabel umgesetzt.</p><h3>Wann ist der Arzt eine Ärztin?</h3><p>Verifiable Credentials werden durch einen autorisierten Issuer (“Arzt”) herausgegeben, der dafür zunächst nicht notwendigerweise bei einer zentralen Stelle “angemeldet” sein muss. Die Erstellung von Credentials kann gemäß Spezifikation offline geschehen, wird von vielen kommerziellen Anbietern aber gerne kostenpflichtig angeboten. Jemand, der sich für einen Arzt hält, kann daher völlig unbeschränkt Impfzertifikate an beliebige Personen ausstellen, die niemals auf irgendeiner öffentlich sichtbaren Blockchain landen. Wer ein solches Credential präsentiert bekommt und die DIDs von Patient und Arzt resolven kann (dafür benötigt er ggf. lesenden Zugang zu einer öffentlichen Blockchain, auf dem die DIDs von Arzt und Patient verankert sind), kann jederzeit verifizieren, dass der Inhalt des Credentials kryptographisch der Wahrheit entspricht.</p><p>Das eigentliche Problem ist aber auch hier die Frage “ist der Arzt wirklich ein Arzt?”. Sie lässt sich im SSI-Szenario auf zwei Arten beantworten:</p><ul><li>Es existiert eine zentrale Registratur, die DIDs (oder Delegate-Keys) von Ärzten aufnimmt, die von übergeordneten Stellen (“WHO”, “BMG”, “KBV”) kontrolliert werden. Diese Registratur kann als Smart Contract oder DAO auf einer Blockchain implementiert sein, um maximales Vertrauen und Transparenz über die Issuer aufzubauen, sie kann aber —eine Analogie zu den “permissioned” Blockchains — auch mit einer hochverfügbaren Datenbank mit starker Zugangssicherheit implementiert werden.</li><li>Es gibt nur einige wenige “Root”-Akteure (WHO, BMG, KBV), deren DIDs in einer (de)zentralen Registratur als solche ausgezeichnet werden. Ihre Anzahl ist so gering (weltweit wenige 1000), dass sie ohne weiteres auf einer öffentlichen Blockchain abgelegt werden können. Diese Akteure signieren zeitlich begrenzte “Arzt”-Credentials, die sie an Ärzte ausstellen und in einer öffentlich zugänglichen Credential Registry hinterlegen. Diese Registry sollte zwar aus Skalierungs- und Stabilitätsgründen dezentral angelegt sein und Schreibzugriffe nur von Root-Akteuren akzeptieren, muss aber keinesfalls auf Blockchains basieren — hierfür eignen sich dezentrale Filesysteme wie IPFS oder Sia ganz hervorragend. Ein Verifier, der einen Impfnachweis validieren möchte, prüft zunächst die Signatur des Arztes, sucht danach die DID des Arztes auf der dezentralen Credential Registry und prüft, ob ein dort hinterlegtes “Arzt-Credential” von einem der global beglaubigten Root-Akteure ausgestellt wurde. Dieses Verfahren erinnert an die “Chains of Trust”, die z.B. Browser nutzen, um SSL-Zertifikate zu überprüfen. Tatsächlich eignen sich auch herkömmliche X.509-Zertifikate zur Ausstellung von Credentials und DIDs, sind aber in Zeiten von kurvenbasierter Kryptographie (insb. Secp256k1 und EdDSA) eher unüblich.</li></ul><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FfFKeMfYrK8M%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DfFKeMfYrK8M&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FfFKeMfYrK8M%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/578dad87418f2195faf0c356c3fb7bb3/href">https://medium.com/media/578dad87418f2195faf0c356c3fb7bb3/href</a></iframe><h3>Vorteile von Credential-basierten Lösungen gegenüber Chain-verankerten Zertifikaten</h3><p>Der immense Vorteil eines Credential-basierten Impfnachweises ist die dezentrale Datenhaltung beim Patienten und die Verschiebung des Trust-Verhältnisses von einem chain-basierten Anker hin zu einer lokal verifizierbaren Signatur. Es gibt absolut keine Notwendigkeit, das Zertifikat selbst auf eine (oder 5!) Blockchain zu schreiben, weil die Credentials kryptografisch gegen Manipulation geschützt sind.</p><p>Weiterhin besteht keinerlei Notwendigkeit, Nodes zu betreiben, die Impftransaktionen zu einem nachweisbaren Merkle-Tree Root zusammenführen oder auflösen. Damit entfällt auch die Notwendigkeit von zentraler Infrastruktur, die ubirchs Lösung voraussetzt, um den Hash eines vorgelegten Impfnachweises auf der Chain finden zu können.</p><p>Die Informationen des Impfzertifikats können, wenn man etwas mehr Energie in die Implementierung und Herausgeber-Logik investiert, vom Patienten selektiv präsentiert werden. Für den Besuch in einer Bar genügt es, wenn der Prover nur die Signaturen über den Impfnachweis übermittelt (zuzüglich einer Wegwerf-Signatur, um damit gleich auch die Luca-App überflüssig zu machen, aber das ist wieder ein anderes Thema)</p><h3>JavaScript is not available.</h3><p>Thread: ich werde immer öfter zur #LucaApp gefragt, die Clustererkennung zB in Restaurants ermöglichen soll, deshalb hier meine aktuelle Position dazu:- mich überzeugt die App bisher überhaupt nicht (Gründe weiter unten) - mich beunruhigt die Euphorie staatl. Stellen zur App /1</p><p>Es gibt eine überwältigende Menge an “Smart Wallets”, die hervorragend dafür geeignet sind, sowohl private Schlüssel der DIDs als auch die Credentials zu speichern, zu validieren und zu präsentieren. Hier ist eine Auswahl aus mehr als 150: <a href="https://jolocom.io/solution/">Jolocom</a>, <a href="https://lissi.id/">Lissi</a>, <a href="https://www.connect.me/">Connect.me</a>, <a href="https://trinsic.id/">Trinsic</a> und <a href="https://www.civic.com/healthkey/">Civic</a>.</p><p>SSI/DID-Technologien werden von Europa im Rahmen des <a href="https://ec.europa.eu/cefdigital/wiki/display/CEFDIGITAL/ebsi">EBSI</a> und der <a href="https://ssi-ambassador.medium.com/essif-the-european-self-sovereign-identity-framework-4572f6875e12">ESSIF</a> unterstützt und gefördert. In Deutschland arbeitet die Bundesdruckerei an eIDAS-konformen SSI-Lösungen, die auch beim deutschen <a href="https://www.personalausweisportal.de/SharedDocs/faqs/Webs/PA/DE/Haeufige-Fragen/11_projekt_digitale_identitaeten/PDI5_Identitaetsoekosystem.html">Personalausweis</a> zum Einsatz kommen werden. Es gibt vom Bund geförderte Initiativen wie <a href="https://idunion.org/">IDUnion</a>, die dedizierte dezentrale Identitäts-Netzwerke aufbauen und vorantreiben. Als Followup des “<a href="https://www.digitale-technologien.de/DT/Redaktion/DE/Standardartikel/SchaufensterSichereDigIdentProjekte/sdi-projekt_ssi.html">Schaufensters Sichere Digitale Identitäten</a>” gehen 4 Projektkonsortien ab April in eine Prototyping-Phase über, in der sie im Feld gut verwendbare SSI-Lösungen für verschiedenste Anwendungsszenarien umsetzen.</p><h3>Abwägung</h3><p>Wenn also SSI- und Credential-basierte Verfahren so offensichtlich besser für Impfnachweise geeignet sind und international für den Einsatz vorbereitet werden als chain-basierte Zertifikatsanker, warum hat sich der Bund bei seiner Ausschreibung dagegen entschieden?</p><p>Man muss es klar sagen: SSI-Technologie ist trotz ihrer Historie und ihres revolutionären Anspruchs, digitale Identität vollständig zu liberalisieren, ebenfalls ein hochexperimenteller Ansatz. Ihr nachhaltiger Erfolg wird sich erst in einigen Jahren in der Breite einstellen, unter anderem auch untermauert durch eine eIDAS-kompatible Identität, die an den Personalausweis gekoppelt ist.</p><p>Wenn man die Wahl zwischen zwei hochexperimentellen Technologieansätzen für einen Anwendungsfall hat und eine Menge Budget, um sie umzusetzen, warum entscheidet man sich dann nicht für den, der in vielen Bereichen des öffentlichen und privaten Lebens Einzug halten wird, sondern für eine Insellösung, die zwar ein grundsätzliches Problem löst, danach aber nur in industriellen Nischen Relevanz hat?</p><h3>Fazit</h3><p>Vor dem Hintergrund der mit Hochdruck vorangetriebenen selbstsouveränen Identitäten ist es unlogisch, für Impfzertifikate auf eine Lösung zu setzen, die</p><ul><li>sich an keinen semantischen Standard hält,</li><li>jedem Verifier eine unnötige Menge an privaten Informationen offenlegt,</li><li>Daten unnötigerweise auf (obskuren) Blockchains verankert,</li><li>auf proprietäre Lösungen zur Arztidentifikation angewiesen ist,</li><li>sich an keine Regeln internationaler Interoperabilität hält und</li><li>zur Überprüfung der Identität des Nachweisenden weitere analoge Merkmale zwingend voraussetzt</li></ul><p>Warum sich der Bund im Rahmen einer 2,7 Mio. Euro starken, intransparenten Ausschreibung für dieses Konsortium entschieden hat, wird bis zur Darlegung der Entscheidungskriterien ein Rätsel bleiben. Sich für eine Lösung zu entscheiden, die im Feld, z.B. am <a href="https://cointelegraph.com/news/iota-blockchain-used-to-track-covid-19-test-results-at-frankfurt-airport">Flughafen FFM</a> und im <a href="https://www.welt.de/politik/deutschland/article224916837/Altoetting-vergibt-bereits-einen-digitalen-Corona-Impfpass.html">Freistaat Bayern</a> bereits vertestet wurde, liegt nahe. Das bedeutet aber nicht, dass sie interoperabel oder international anschlussfähig ist.</p><p>Uns bleibt nur zu sagen: Was auch immer Ihr für Impfzertifikate bauen wollt, wir werden versuchen, sie alle zu verifizieren! Toi toi toi.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FGIgTk2ryk8I%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DGIgTk2ryk8I&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FGIgTk2ryk8I%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/de62b142fd1623bfa28c15a39bffd6a9/href">https://medium.com/media/de62b142fd1623bfa28c15a39bffd6a9/href</a></iframe><p>Wer mitmachen möchte, unser Repo (sehr viele weiterführende tiefe Links im Readme!) und das dazugehörige NPM-Package findet Ihr hier:</p><ul><li><a href="https://github.com/elmariachi111/ultimate-non-infectious-verifier/blob/main/README.md">elmariachi111/ultimate-non-infectious-verifier</a></li><li><a href="https://www.npmjs.com/package/@univax/core">@univax/core</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e8fad1dc1535" width="1" height="1" alt=""><hr><p><a href="https://medium.com/t14g/wer-baut-den-besten-impfausweis-e8fad1dc1535">Wer baut den besten Impfausweis?</a> was originally published in <a href="https://medium.com/t14g">t14g</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[After the Meltdown: rethinking event management platforms.]]></title>
            <link>https://medium.com/t14g/decentralized-event-management-platforms-d1fce0748a26?source=rss-53cacc38e8a4------2</link>
            <guid isPermaLink="false">https://medium.com/p/d1fce0748a26</guid>
            <category><![CDATA[decentralized]]></category>
            <category><![CDATA[events]]></category>
            <category><![CDATA[hackathons]]></category>
            <category><![CDATA[blockchain]]></category>
            <category><![CDATA[ethereum]]></category>
            <dc:creator><![CDATA[Stefan Adolf]]></dc:creator>
            <pubDate>Tue, 05 Nov 2019 15:48:10 GMT</pubDate>
            <atom:updated>2019-11-05T20:16:05.896Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*6uhBL2AZJbeQplsTUv3SwQ.jpeg" /></figure><h3>A decentralized approach for managing events, conferences and attendees</h3><p>Beginning of October many local community organizers received <a href="https://www.meetup.com/lp/payment-test-20191016">a notification</a> by wework owned meetup.com stating that they plan to evaluate changes to their business model. Put shortly, their idea was to either charge every attendee a <strong>2 Dollar fee</strong> for every RSVP while at the same time lowering the yearly costs for event organizers to 24 Dollars. What effectively sounds like a worthwhile idea to raise attendance rates, it could easily be interpreted as a desperate move by wework to monetize their remaining assets. If you’re interested in the whole story, <a href="https://www.theverge.com/2019/10/15/20893343/meetup-users-furious-new-rsvp-payment-test">The Verge has got a fantastic writeup here</a>.</p><h3>Tim Myers on Twitter</h3><p>@Meetup How do I cancel my account and delete all of my data. Asking for 19,000 friends?</p><p>This incident that I personally refer to as “<strong>meetup meltdown</strong>” makes one thing very clear: as long as you rely on a third party you will fully depend on their good will. They set the rules, that you have to play along and they can change them any time. Even worse: <em>if they go down because of this, they’ll take you with them</em>.</p><h3>Bridget Kromhout on Twitter</h3><p>Hey @Meetup, I just paid you $98.94 for 6 months. Our Thursday meetup this week has 139 RSVPs right now, so you&#39;re saying you&#39;ll want $278 additional for such an event. I&#39;m obviously not charging admission. Either you&#39;re changing this or we&#39;re leaving you. https://t.co/W2vspzwoVs</p><h3>jer on Twitter</h3><p>If any of these changes are coming to any of my Meetup groups I&#39;m gonna close them down and switch to something else. https://t.co/iaGbNE7pst</p><p>In the aftermath of the announcement many people jumped over board immediately. Regardless of the not too evil idea to charge (and even return!) a ridiculously low fee, nobody wanted to be the one to pay the bill for wework’s <a href="https://www.forbes.com/sites/greatspeculations/2019/08/27/wework-is-the-most-ridiculous-ipo-of-2019/#7ecaf0cf1ad6">disastrous attempt to go public</a> in September. Which is a legit decision. But here’s the issue: if you’re not on meetup.com — where are you building your community then? Suddenly alternatives were popping up like flowers in the desert after a rain shower: it felt like thousands of tweets by anxious meetup hosts hit our timelines, asking “<em>Which alternative would you recommend?</em>” <a href="https://twitter.com/search?q=meetup%20alternative">And the world is not short of them</a>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*esGqqq-7cvbJAcvpMLssgA.png" /></figure><p>If you think about it for a moment, any attempt to switch from meetup.com to yet another platform will end in an <strong>evil circle of doom</strong>: once that platform has to handle the whole load of planet earth’s meetup movements, it will sooner or later also come to the conclusion that charging a fee might be a good idea for one or another reason. So it’s time for smarter approaches that allow them to think slightly different.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/642/1*Ww9km7GoD1OWy0NbX9UkrQ.png" /></figure><p>FreeCodeCamp founder <a href="https://twitter.com/ossia">Quincy Larson</a> posted a tweet only hours after the meltdown incident encouraging his worldwide active coder community to start building a <strong>distributed alternative</strong> for FCC chapters right now. And the community followed.</p><h3>Quincy Larson on Twitter</h3><p>freeCodeCamp is building an open source alternative to Meetup. - No fees for organizers - No fees for participants People have been asking us for a free event tool for years. Now Meetup&#39;s new pricing scheme is forcing our hand. Let&#39;s build it together: https://t.co/1Po1I5l8C2</p><p>Within hours a <a href="https://discord.gg/vbRUYWS">dedicated Discord channel</a> went wild with around one thousand more or less experienced hackers, many of them seemingly skilled in frontend matters. Only a day later <a href="https://github.com/freeCodeCamp/chapter">their github repo opened up</a> and the discussion was piped into an endless stream of <a href="https://github.com/freeCodeCamp/chapter/projects/1">feature requests</a>. Everybody seemed <a href="https://github.com/freeCodeCamp/chapter/issues/1">to have a good idea</a> of how the organization of local community events could be improved. Everybody wanted to be aboard when the whole world starts to establish an open source meetup community platform. The first thing to see on the README was a <a href="https://github.com/freeCodeCamp/chapter/blob/master/data/schema.png">relational diagram</a> depicting the relations between users, organizers, venues and events — and it was no coincidence that it looked similar to the concepts that we knew so far as: meetup.com.</p><p>The FreeCodeCamp “<em>chapter</em>” repo takes it one step further, though. They absolutely recognized that a centralized platform will sooner or later end up with similar issues as our federated friends, so they want to <strong>distribute the moving parts</strong> on as many shoulders as possible. Local communities would run their own nodes and install the containerized chapter software on them.</p><p>The only centralized part in the system — as the time of writing — would be a <strong>discovery service</strong> making it possible for new users to find their local community’s hub nodes. A splendid idea. But you’d still need <strong>encouraged locals</strong> who are willing to take action and install and maintain a running chapter node (which obviously doesn’t come for free) and tell everybody to create accounts on them.</p><p>This kind of distributed linked network is not brand new: <a href="https://mastodon.social/about">Mastodon</a> and <a href="https://matrix.org/">Matrix</a> (the backbone of <a href="https://riot.im/">Riot.im</a>) are quite successfully building Twitter and Telegram replacements. Kazaa and <a href="https://diasporafoundation.org/">Diaspora</a> were showing early that <strong>P2P controlled filesystems</strong> and social networks, operated by globally distributed peer nodes had the perspective to break the restrictions of centralization.</p><p>But do you really want to build software using relational databases and machine based application hosting in the year 2020? SQL <a href="https://en.wikipedia.org/wiki/SQL">dates back to 1974</a>, and in the days of serverless functions, running a server also leaves the bad feeling of working with zombie technology here.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*-QghrrD88FeHfdNgR7QMag.png" /></figure><h3>The dawn of decentralized</h3><p>A ghost is roaming web town and its name is “<strong>Web3</strong>”. A phrase that follows up the early 00’s notion of a “<a href="https://en.wikipedia.org/wiki/Web_2.0">Web2.0</a>” that became a synonym for applications that embrace web technologies and exchange data with their home servers asynchronously aka “<strong>AJAX</strong>”. Web3 is all about decentralized applications and protocols: not a single server, company or developer should be responsible for uptime, assets and data but the network as a whole. The Web3 concept already has taken huge steps towards production readiness to change the way how we execute distributed code and synchronize trusted application state among peers.</p><p>One of the most accepted and proven decentralized application platforms is the <a href="https://solidity.readthedocs.io/en/latest/introduction-to-smart-contracts.html#the-ethereum-virtual-machine">Ethereum Virtual Machine</a> (EVM). Even today many people are probably misunderstanding the blockchain based Ethereum platform as a bare ICO-enabling, token mining, crypto-kiddie, ecologically questionable crypto-scam. Or simply put, a Bitcoin on steroids. Only that it isn’t.</p><p>At Etherum’s very foundation every node runs a <strong>bytecode interpreter</strong>. Miners are executing code written into the Ethereum blockchain simultaneously and deterministic while mining new blocks. Clients can add EVM executable bytecode to their transactions to have the miners run it and since it’s written and hashed in blockchain transaction code, it’s unchangeable, untinkerable and unbreakable. Therefore people refer to this kind of code as <strong>smart contract</strong>:<strong> </strong>nonnegotiable sets of rules that are carved in stone, forever.</p><blockquote>Just a fun fact here: the term “smart contract” <a href="https://en.wikipedia.org/wiki/Smart_contract">has been coined</a> in the 90s by mathematician <strong><em>Nick Szabo</em></strong>, long ago before blockchains ever had been thought of. Some people assume that Szabo is actually the man behind the ominous “<a href="https://en.wikipedia.org/wiki/Satoshi_Nakamoto#Nick_Szabo"><em>Satoshi Nakamato</em></a>” who once kicked it all off with his Bitcoin whitepaper (but he always denied that since). Yet another fun fact:<a href="https://ethgasstation.info/blog/gwei/"> the trillionth part</a> of 1 Ether is also referred to as 1 “Szabo” as an homage to his theoretical contribution.</blockquote><p>When you are going down a step from the philosopher’s cloud, coding smart contracts feels not too unrelated to coding in centralized programming concepts. While you’re free <a href="https://github.com/ConsenSys/ethereum-developer-tools-list#smart-contract-languages">to roll your own</a>, the Ethereum foundation introduced their Turing complete smart contract language “<strong>Solidity</strong>” as early as of 2014. Solidity smart contracts carry intrinsic state, have public and private methods that can mutate the contract’s state, can emit events, may contain value (expressed as Ether balance), support pure functions and can inherit code from other contracts and interfaces. For most developers Solidity smart contracts should therefore feel familiar: they’re more or less <strong>classes</strong>. Or put precisely: classes for persistent objects that represent their behavior and state schema. Many people can potentially deploy the same smart contract on Ethereum, effectively spawning instances of it.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/14fa85c539e7c56f08628f74bedf3db7/href">https://medium.com/media/14fa85c539e7c56f08628f74bedf3db7/href</a></iframe><p>Interacting with a smart contract in a state-changing way doesn’t come for free. Miners who execute the contracts’ code must run<strong> CPU cycles</strong> to execute the compiled bytecode. Ethereum therefore introduces the concept of “<strong>gas</strong>” to represent fees that are spent on every code execution step. Depending on the operation’s complexity an Ethereum client estimates an amount of gas that’s needed for the computation. At the time of execution a miner translates the gas value to “real” Ethers and expects it to have been sent along with the contract invoking transaction — if the sent funds aren’t sufficient, miners will reject the transaction. Every user who wants to interact with any smart contract in writing direction must therefore pass an appropriate amount of gas with the call.</p><p>Smart contracts are unstoppable and enable the authoring of so called <strong>decentralized apps</strong> (or short Đ<a href="https://www.stateofthedapps.com/platforms/ethereum">apps</a>). From a very simplified practical point of view they’re frontend heavy applications that use the Ethereum ledger as event source and database.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*b2epKpiBAAhB_N15Dp0-YA.png" /></figure><h3>Getting started with a decentralized event platform</h3><p>In early August 2019, during an internal hacking event called “<strong>BREAKOUT</strong>”, a team of 5 <a href="https://turbinekreuzberg.com/de/">Turbine Kreuzberg</a> engineers, POs and agile coaches formed team “<a href="https://github.com/cod1ng-earth/ethickets"><em>Ethickets</em></a>” to learn about Ethereum’s concepts and build a simple meetup clone.</p><p>Our first idea was to only store <strong>a list of RSVPed attendees</strong> on the ledger and maintain all the event details in a <a href="https://symfony.com/">Symfony</a> based backend application that interacts with Ethereum on a local <a href="https://github.com/ethereum/go-ethereum">Geth node</a> through an Elixir based gateway application. A React Native client should then enable users to discover and claim “<strong>tickets</strong>” for an event. At the event’s door somebody could manually check whether an attendee could present a public address that has been stored in the smart contract.</p><p>If you’re slightly experienced with Web3 you quickly will notice the many flaws of our very first approach: the Symfony backend application is ultimately centralized. You could skip the Elixir part alltogether and move Elixir backend interaction code (needed for event creation) to the PHP side. We actually didn’t do so because our Symfony developer felt uncomfortable with it but it’s <a href="https://github.com/digitaldonkey/ethereum-php">certainly possible</a>.</p><p>Another tricky part of our approach is the usage of React Native: as it turns out running a web3 client that interacts with Ethereum is <a href="https://medium.com/@generalpiston/how-to-react-native-w-web3-0x-js-0xconnect-39b3d6a4dca">not the easiest thing</a> to achieve on the native platform: that is mostly due to node.js’ <strong>crypto library</strong> being incompatible with the web platform and compiling the respective native plugins leads you into the rabbithole of iOS pods and Android JARs to burn in dependency hell. If you really need to interact with Etherum from a web/native client we now can recommend <a href="https://docs.ethers.io/ethers.js/html/cookbook-react.html">ethers.js</a>, but we didn’t discover that during BREAKOUT week.</p><p>We ended up with a working prototype that just ran a simple smart contract like this:</p><pre>pragma solidity &gt;=0.4.22 &lt;0.6.0;<br>contract <strong>ETHicketEvent</strong> {<br>    address payable hoster;<br>    <br>    mapping (address =&gt; uint8) tickets;<br>    <br>    constructor() public {<br>        hoster = msg.sender;<br>    }<br>    <br>    function <strong>requestTicket</strong>(address attendee) payable public {<br>        require (msg.value &gt; 1000000);<br>        hoster.transfer(msg.value);<br>        tickets[attendee] += 1;    <br>    }<br>    <br>    function <strong>getTicketCount</strong>(address requester) public view returns (uint8) {<br>        require(msg.sender == hoster);<br>        <br>        return tickets[requester];<br>    }<br>}</pre><p>To roughly explain what’s going on here: everybody who’d like to host an event can deploy a new instance of this smart contract thus becoming its recognized owner (hoster = msg.sender). To “buy” a ticket attendees invoke the requestTicketmethod sending along a minimum of one <a href="https://www.investopedia.com/terms/g/gwei-ethereum.asp">MWei</a>. The ticket price immediately is transferred to the event host. An internal hash table (mapping(address =&gt; uint8) tickets) is incremented on each transaction so that one attendee can buy more than one ticket.</p><p>The idea was that the centralized <a href="https://ethickets.herokuapp.com/v1/events/">Symfony backend</a> would keep track of <strong>smart contract instances</strong>, effectively allowing event hosts to manage all event details in a centralized way and just utilize Ethereum to sell and maintain “tickets”. Event owners would not necessarily need any knowledge of the blockchain in this concept. As you can see in one of the contracts’ <a href="https://ropsten.etherscan.io/address/0x575a50b88c368a78ec5ab775c05f6aa87b15bae6">transaction history</a>, this happened several times during Breakout week.</p><p>After failing on interacting with Web3 in React Native, we ended up using the brand new<a href="https://ionicframework.com/docs/react/your-first-app"> React based version of ionic</a> on the frontend and utilized the most well known desktop and mobile (still in beta) Ethereum interaction tool <a href="https://metamask.io/">MetaMask</a> aka “The Fox”. Upon startup our mobile optimized web app loads all events from the centralized API endpoint and creates a new Web3 wallet and account by using an injected (in our case: hardwired) private key. From here we could issue requests to the smart contract addresses that the API gave us, effectively being able to “buy” tickets from a fixed user account. We’ve been using the <strong>Ropsten testnet</strong> via an intermediary <a href="https://infura.io/">infura JSON-RPC</a> node, but we also tested it with our very own geth based Ropsten node — which went equally well. Unfortunately our network didn’t allow us to connect it via Wifi which rendered it unusable for demonstration purposes.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*G1Y5rs877-LAOtQp3ELHBA.png" /><figcaption>Our smart contract in the Remix IDE with active MetaMask plugin</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*u0dBkBZ8rqLcb2htU0tFdQ.png" /></figure><h3>Intermission: Đappcon</h3><h4>The final eye-opener</h4><p>What we definitely learned: either you go decentralized or you don’t. Having any centralized part in the whole system would break any other. With that in mind I attended <strong>Đappcon</strong> <a href="https://www.dappcon.io/">in August 2019</a>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*RlLoZJggeYZG6lGGvpLslg.jpeg" /></figure><p>A three day event that completely concentrated on the latest developments in the Ethereum world and it was no disappointment. Hundreds of international guests came to my hometown and I suddenly felt very understood — I noticed that we have not been on some esoteric path on a mysterious alien tech stack, but rather didn’t listen well enough to what so many of Đappcon’s attendees already understood: the Web2.0 as we know it is dead, the future already has begun years ago. Writing smart contacts in a way we were doing could already be considered old school. <a href="https://en.wikipedia.org/wiki/Decentralized_autonomous_organization">Decentralized Autonomous Organizations</a> are already (more or less) taking over our understanding of incorporated and limited companies as we know it. I’ve met digital nomads that make a living out of building Ethereum apps and they get paid in Ethereum and <a href="https://makerdao.com/en/dai">Dai</a> (an Ethereum backed Stablecoin oriented on USD). That was my personal turning point:<strong> I had to make this kite fly and I had to find a team for it</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_68-Xa19ep9MPru4RTOFig.png" /></figure><h3>The ĐOor — an EthBerlinZwei submission</h3><p>Only one day later the <a href="https://ethberlinzwei.com/">EthBerlinZwei hackathon</a> was about to take off and boy was I ready to write history.<a href="https://github.com/ethberlinzwei/Find-A-Team/issues/29"> I created a pitch</a> to find people to team up with and found three amazing musketeers to join the party: <a href="https://twitter.com/mr_hemulin">Tam</a> (Berlin/Israel), <a href="https://twitter.com/BenasZabita">Ben</a> (Lithuania) and <a href="https://twitter.com/Dakavon">Niels</a> (Hamburg) happily adapted the idea and we started remixing it. In short we wanted to solve the last part of the puzzle:</p><blockquote><strong>how to effectively identify someone coming to your event as a valid (and charged) attendee?</strong></blockquote><p>That’s why we called our project <strong>ĐOor</strong>. It’s potentially usable as a “door opener” for any kind of physical and non-physical entry restriction and it consists of three parts:</p><ul><li><strong>event management.</strong> Everybody can create a new event and control the event’s attendee list, ticket prices and content data.</li><li><strong>ticket sales / RSVPs</strong>. Everybody can discover all created events and signup for them eventually by sending some Ether along as ticket price.</li><li><strong>the bouncer use case</strong>. At the door an attendee’s identity is checked against the list of attendees. If she’s on the list, admission is granted.</li></ul><p>We decided to go with Solidity smart contracts again but were using <a href="https://openzeppelin.com/contracts/">OpenZeppelin</a> tools for it: they come with a huge amount of audited contracts that have been proven to work as great foundation for all common application needs. Further we were building our frontend on plain web technologies and chose to use Vue.js as frontend library (which I personally find a rather unfavorable choice because of the unnecessary conventional complexity when compared to React; but that’s a totally different story).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*WiCox5K3Xogq22dSea-Ibg.jpeg" /><figcaption>Niels, Tam, Ben &amp; Stefan = Team ĐOor</figcaption></figure><h4>Event management</h4><p>To create new events users interact with a unique instance of a so called DoorFactory that spawns new ĐOor contracts on their behalf. A creator is the first owner of that contract so all fees will be transferred to his account. Thanks to OpenZeppelin’s premade <a href="https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/ownership/Ownable.sol">Ownable</a> base contract, ĐOors can be easily transferred to new owners. Here are the more interesting parts of the code, starting with the Door factory contract:</p><pre>pragma solidity ^0.5.0;</pre><pre>import &quot;./Ownership.sol&quot;;<br>import &quot;<a href="http://twitter.com/openzeppelin/upgrades">@openzeppelin/upgrades</a>/contracts/Initializable.sol&quot;;</pre><pre>contract <strong>DoorFactory</strong> {<br>    address[] public doorAddresses;</pre><pre>    event <strong>NewDoorCreated</strong>(<br>        address indexed doorOwner,<br>        address indexed doorAddress,<br>        string indexed doorName,<br>        uint ticketPrice,<br>        bool allowDisposeLeftovers<br>    );</pre><pre>    function <strong>createNewDoor</strong>(uint256 _price, <br>         string memory eventName, <br>         bool allowDisposeLeftovers) <br>         public returns(address) <br>    {<br>      Door door = new <strong>Door</strong>();<br>      door.initialize(_price, eventName, allowDisposeLeftovers);<br>      door.transferOwnership(msg.sender);<br>      doorAddresses.push(address(door));</pre><pre>      emit <strong>NewDoorCreated</strong>(<br>        msg.sender,<br>        address(door),<br>        eventName,<br>        _price,<br>        allowDisposeLeftovers<br>      );<br>      return address(door);<br>  }<br>  ...<br>}</pre><p>and the spawned Door “instance” contracts:</p><pre>contract <strong>Door</strong> is Ownable, Initializable {</pre><pre>    string public nameOfEvent;<br>    uint public ticketPrice;<br>    <br>    uint attendeesCount;<br>    uint256 shares;</pre><pre>    enum AttendanceTypes { NONE, REGISTERED, ATTENDED }</pre><pre>    struct UserStruct {<br>        AttendanceTypes ticketStatus;<br>    }<br>    mapping(address =&gt; UserStruct) public users;</pre><pre>    function <strong>initialize</strong>(uint256 _price, string memory eventName)<br>             public initializer payable<br>    {<br>         ticketPrice = _price;<br>         nameOfEvent = eventName;<br>    }<br>    <br>    function <strong>buyEventTicket</strong>() public payable <br>    {<br>        require(users[msg.sender].ticketStatus == AttendanceTypes.NONE, &#39;User already has a ticket&#39;);</pre><pre>        require(<br>            msg.value == ticketPrice,<br>            &quot;msg.value does not meet the ticket price.&quot;<br>        );</pre><pre>        this._owner.<strong>transfer</strong>(msg.value);<br>        users[msg.sender].ticketStatus = AttendanceTypes.REGISTERED;<br>    }<br>    ...<br>}</pre><h4>Attendance</h4><p>Every client application (e.g. our Vue frontend) can now discover all existing door contracts that the factory has created by using its <a href="https://ropsten.etherscan.io/txsInternal?a=0x5D1aca1FD0f16d930030AeCf4FA68698A0Ce9112">contract address</a>, the contract’s <a href="https://github.com/d0or/dOor/blob/master/front/dOor/abis/DoorFactory.abi.json">ABI</a> and calling its getAllDoors method. Once discovered one can call the Door’s buyEventTicket method and send an appropriate ticket fee in Ethers. Each door keeps track of its own attendee list and relays the money directly to the current door owner.</p><p>Ben introduced a twist to the story that goes a little deeper: when you mark an event/door as “<em>withdrawable</em>”, attendees have to pay an upfront deposit, even if the event is free to attend (not unrelated to meetup.com’s idea). As soon as the owner identifies an attendee as having attended the event, the attendee has the right to get his deposit back. That’s quite a clever strategy to decrease <strong>no show-rates</strong>: if you don’t go to a meetup, your deposit is lost.</p><p>The quite popular “<a href="https://kickback.events/">kickback</a>” project came up with this idea first and ran quite a bit of events already pushing down no show rates to an all time low. Ben’s little withdraw method allows any attendee to withdraw his deposit after he had been marked as attended by the host and the event officially has ended.</p><h4>Proof of Attendance</h4><p>And here comes the hard part. How do you prove that someone attended an event in person? First, standing at the door the attendee has to somehow be able to present her <strong>public key</strong> since that’s the piece of data that a ĐOor contract saves as indicator for her “ticket”. But what keeps her from simply giving a friend (or the whole world) her public key? After all it’s even stored <a href="https://ropsten.etherscan.io/tx/0x2235e0dfa8f2760baeaceacd2ce8bc15cb4dc52a57ce83981c69473d0e71102d">publicly visible</a> in the blockchain’s history so everybody could simply pick up a public key that had signed on and try to get into the event with it.</p><p>The simplest prevention strategy would be to mark a public address that passed the door as “attended” and block every other attendee who tries to use the same address again. However that would mean that we’re now potentially excluding the true ticket holder: <em>first come first enter</em> never has been a good idea, except in biology.</p><p>A quite promising variant is the issuing of <a href="https://eips.ethereum.org/EIPS/eip-20">ERC20</a> tokens as event tickets. Each token would represent one ticket and to get into the location you simply transfer your token to the bouncer’s wallet. As soon as that transaction is confirmed, the door opens. Good idea, but what keeps you from simply transferring that token to a friend of yours. Shouldn’t be an issue for free events but for exclusive events that might not be exactly what you want. Non fungible <a href="https://eips.ethereum.org/EIPS/eip-721">ERC721</a> tokens (NFTs) can remedy that issue but they’re contradicting the reality: besides the number printed on it, a ticket for the next Madonna show is interchangeable. The good thing about NFTs is: you could seamlessly prove which way it went and it’s absolutely unique to the first issuer and owner. A great idea for secondary ticket market applications actually but here’s the caveat: <strong>Ethereum transactions are slow.</strong></p><p>While on Ropsten testnet it takes around 30 seconds until a transaction can considered as confirmed, on Ethereum mainnet one token transaction might take up to 2 minutes (avg block time of 15s x 7 confirmations). If you’re serving free coffee at your ĐOor that might be an option for someone but surely not for the masses.</p><p>As it turns out, asymmetric cryptography comes with a builtin solution to this problem and it’s <strong>private key signatures.</strong></p><h4>Open, Sesame</h4><p>So here’s our solution: when an attendee knocks at the ĐOor, the bouncer creates a random 4-digit string and presents it to the attendee. The attendee signs that short lived shared secret with his private key and creates a QR code containing the signature. The bouncer scans the QR code on the presenter’s device and calls Ethereum’s <a href="https://web3js.readthedocs.io/en/v1.2.2/web3-eth-personal.html#ecrecover">ecRecover</a> method with the random string known to him.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/695/1*S-wACgalLEL3-Qx7vahRTw.jpeg" /><figcaption>checking in with ĐOor</figcaption></figure><p>This method <a href="https://docs.ethers.io/ethers.js/html/api-advanced.html#cryptographic-operations">will yield the public key</a> of the attendee standing at the door in this moment. He can check that the public key is known to the ĐOor contract (which is a matter of milliseconds since it doesn’t include a status change) and trigger a new transaction to set the addresses state to “attended”. Since all operations happen either offchain or are just reading contract state, the overall verification process takes <strong>not longer than 5 seconds </strong>and is even faster if the bouncer keeps a local copy of all attendee addresses.</p><p>That’s the rough summary on what our team achieved at EthBerlinZwei. <a href="https://devpost.com/software/door">Our DevPost submission</a> contains links to all the code and our preliminary demos.</p><h3>Stefan Adolf on Twitter</h3><p>We built ĐOor during @ETHBerlin: a #decentralized door opener that manages events and admissions. Attendees prove their identity by signing a random secret offchain. Thank you @Dakavon @mr_hemulin &amp;amp; @BenasZabita for making it happen :) https://t.co/R1iUVIMMIL @OpenZeppelin</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*rK8zgCN6gmz93OX0vRrRZg.png" /></figure><h3>Team Meeting: event management and discovery</h3><p>While the ĐOor idea is a fabulous tool to check an attendee’s “ticket” to gain admission, one question remains open: <em>should we really manage events and their metadata on that platform</em>?</p><p>If we did so, event hosts were supposed to use a frontend owned by us to add new events by a factory provided by us in a format that we have to come up with. We’d finally end up as the next meetup.com as well — with a decentralized database but still with a central concept how event data should look like.</p><p>Time for yet another hackathon: our completely new team (with me being the only participant who joined from team ĐOor, the others being <a href="https://github.com/Blub-Blub">Sascha</a>, <a href="https://twitter.com/bussyjd">Jean Daniel</a>, <a href="https://github.com/czarly">Sebastian</a> and <a href="https://github.com/elektronaut0815">Hendrik</a>) at <a href="https://diffusion.events/">Diffusion 2019</a> (October 20th) wrapped their minds on how we could make events discoverable without owning or defining them. Since it’s hard to convince a completely new team to hack on something the team before had left behind, we went with the new name “<strong>Team Meeting</strong>” and started from scratch.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*TWHSBh24O55_hPbizisQWA.jpeg" /></figure><h4>Use what’s there: the semantic web</h4><p>For the data part we came up with the idea to go with what’s already available, and as it turns out the ideas of a <a href="https://en.wikipedia.org/wiki/Microformat">semantic web</a> is very alive. Most likely out of SEO reasons many sites that display and host event pages are enriching their markup with <a href="https://microformats.io/">micro formats</a> or <a href="https://developers.google.com/search/docs/guides/intro-structured-data">structured data</a> — small but well defined pieces of information, either provided as additional attributes inside the markup, meta headers or meta blocks hidden in script tags and formatted as <a href="https://json-ld.org/">JSON-LD</a>.</p><p>A browser visiting a page that contains <a href="https://schema.org/Event">schema.org microdata formats</a> immediately recognizes that the user is browsing an event page and could extract all meta data from it: Title, venue location or opening times are all available in a machine readable format. Good for us that <a href="https://www.meetup.com/CODING-PORTUGAL/events/264314473/">meetup.com</a> and <a href="https://www.eventbrite.com/e/react-day-berlin-2019-tickets-61442110005">eventbrite</a> make heavy use of it: they expose lots of event content on their event pages hoping that GoogleBot makes sense of them. Here’s an example of JSON-LD formatted metadata on eventbrite for the upcoming React.Day:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/5b450c0a4f318e7705ea298a6ec02201/href">https://medium.com/media/5b450c0a4f318e7705ea298a6ec02201/href</a></iframe><blockquote>So why should be GoogleBot the only client to make sense of that data?</blockquote><p>We decided to write a <strong>Chrome extension</strong> that detects microdata formats and extracts event data from pages. As soon as it detects an event, it offers the user an “RSVP” action (or potentially a “buy ticket” button if the event is not free). Once a user hits that button, we’re transmitting the event data to a free, decentralized and globally storage: <a href="https://ipfs.io/"><strong>IPFS</strong></a>.</p><p>Thanks to the alpha version of <a href="https://github.com/ipfs/js-ipfs">ipfs-js</a> that works without the need to run your own or connect a dedicated IPFS node — peer discovery and upload happens only in the browser (ipfs-js just keeps some constant root nodes to discover peers). Once on IPFS each event gets a unique <strong>content identifier</strong>, the <a href="https://docs.ipfs.io/guides/concepts/cid/">CID</a>. After some seconds the information is stored on the worldwide decentralized storage network (e.g. <a href="https://ipfs.io/ipfs/QmevnNxM2qTRJp6DFdq7Xh2g5GoMXWLoNGAKSjTtKQRv1w">https://ipfs.io/ipfs/QmevnNxM2qTRJp6DFdq7Xh2g5GoMXWLoNGAKSjTtKQRv1w</a>)</p><p>Since we cannot access a MetaMask / web3 context from within the browser extension’s scope, we’re redirecting the user to a statically hosted Đapp landing page that requests a web3 context and is preloaded with the event page’s original URL and its IPFS CID. Here the user can finally sign up for the event by sending a small transaction to dedicated smart contract’s rsvpForEvent methods:</p><pre>pragma solidity ^0.5.8;</pre><pre>contract <strong>Meeting</strong> {</pre><pre>struct <strong>EventStruct</strong> {<br>    address[] rsvps;<br>    bytes cid;</pre><pre>bool isCanceled;<br>  }</pre><pre>mapping(bytes32 =&gt; EventStruct) public <strong>events</strong>;<br>mapping(bytes32 =&gt; uint8) public <strong>meetups</strong>;<br>mapping(bytes32 =&gt; uint8) public <strong>attendees</strong>;</pre><pre>event <strong>MeetupCreated</strong>(string url, bytes cid);<br>  event MeetupRSVPee(string url, address attendee);</pre><pre>function <strong>rsvpForEvent</strong>(string memory url, bytes memory cid) public {<br>    bytes32 id = keccak256(abi.encode(url));</pre><pre>    meetups[id] = meetups[id] + 1; // cheap existence check</pre><pre>    if (meetups[id] &gt; 1) {<br>      events[id].rsvps.push(msg.sender);<br>    } else {<br>      emit MeetupCreated(url, cid);<br>    }</pre><pre>    bytes32 attend = keccak256(abi.encode(url, msg.sender));<br>    attendees[attend] = 2; // code for attending</pre><pre>    emit MeetupRSVPee(url, msg.sender);<br>}</pre><pre>function <strong>rsvpForExistingEvent</strong>(string memory url) public {<br>    bytes32 id = keccak256(abi.encode(url));<br>    require(meetups[id] &gt; 0, &quot;event needs to be created first&quot;);</pre><pre>    bytes32 attend = keccak256(abi.encode(url, msg.sender));<br>    attendees[attend] = 2;</pre><pre>    emit MeetupRSVPee(url, msg.sender);<br>}</pre><pre>function <strong>isAttending</strong>(string memory url) public view returns (bool attending) {<br>    attending = isOtherAttending(url, msg.sender);<br>}</pre><pre>function <strong>isOtherAttending</strong>(string memory url, address identity) public view returns (bool attending) {<br>    bytes32 attend = keccak256(abi.encode(url, identity));<br>    attending = attendees[attend] == 2;<br>}</pre><pre>function <strong>isRegistered</strong>(string memory url) public view returns (bool registered) {<br>    bytes32 id = keccak256(abi.encode(url));<br>    registered = meetups[id] &gt; 0;<br>}</pre><pre>function <strong>countAttendees</strong>(string memory url) public view returns (uint users) {<br>    bytes32 id = keccak256(abi.encode(url));<br>    users = meetups[id];<br>  }<br>}</pre><p>That’s a more or less <a href="https://ropsten.etherscan.io/address/0xe742EF468584506C32B86541d0c3d4878857Af66">working contract</a> to anchor new events and their attendee list on the ledger. What’s missing is the <strong>discovery</strong> part (show me events nearby ‘Berlin’). For this we had to dig slightly deeper into the box of secrets:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*KYhBiMFzYldwfQ8zo0iCnw.png" /></figure><h4>The Graph: derive a GraphQL API from Ethereum events</h4><p>Assume you’d like to <strong>find nearby events</strong> only by iterating Ethereum transactions and fetching their related content one by one. If the amount of stored events grew large it’d be a massive overhead to do so on every request and that’s why one has to come up with a (potentially centralized) <strong>projection</strong> that persists the event store’s generated state in a <strong>queryable database</strong>. If we were only to index the event data on IPFS, <a href="https://orbitdb.org/">OrbitDB</a> could be a suitable option but since we are about to update the projection as soon as an RSVP occurs, we decided to go with the <a href="https://twitter.com/graphprotocol">The Graph</a>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YVJnHrvh87mJO5prkZB8kg.png" /><figcaption><a href="https://thegraph.com/explorer/subgraph/bussyjd/teammeeting?selected=playground">GraphQL API</a> inferred by events emitted by our smart contract</figcaption></figure><p><a href="https://thegraph.com/">The Graph</a> is a YML-configured <strong>GraphQL-SaaS /</strong> self hosted service that listens on <strong>events</strong> on Ethereum and IPFS and updates its internally persisted state according to the event data. You can write <strong>handlers</strong> and <strong>mappings</strong> that are invoked as soon as an event is triggered and within these you can do nearly anything you need to fetch the data that’s related to the event. The Graph mappings <a href="https://thegraph.com/docs/define-a-subgraph#writing-mappings">are written in AssemblyScript</a>, a subset of TypeScript and compiled to an executable WASM binary.</p><p>There are two mandatory parts to configure and build your Graph instance: first you’d want to define a GraphQL Schema definition for the projected entities. The Graph is inferring an ORM like entity layer that you can use inside your handlers to read and write entities to The Graph’s provided “store” abstraction. The most important part is the “<strong>subgraph</strong>” configuration that The Graph uses to setup event listeners for your smart contracts and bind your custom handlers to events and entities:</p><pre>specVersion: 0.0.2<br>schema:<br>  file: ./schema.graphql<br>dataSources:<br>  - kind: ethereum/contract<br>    name: Contract<br>    network: ropsten<br>    source:<br>      address: &quot;0xe742EF468584506C32B86541d0c3d4878857Af66&quot;<br>      abi: Contract<br>    mapping:<br>      kind: ethereum/events<br>      apiVersion: 0.0.3<br>      language: wasm/assemblyscript<br>      entities:<br>        - MeetupCreated<br>        - MeetupRSVPee<br>      abis:<br>        - name: Contract<br>          file: ./abis/Contract.json<br>      eventHandlers:<br>        - event: MeetupCreated(string,bytes)<br>          handler: handleMeetupCreated<br>        - event: MeetupRSVPee(string,address)<br>          handler: handleMeetupRSVPee<br>      file: ./src/mapping.ts</pre><p>Being configured like this, The Graph will setup services that listen on MeetupCreated or MeetupRSVPee events of the Contract contract and feed all that data into a hosted database (which actually uses Postgresql under the hood) with an automatically generated <a href="https://thegraph.com/explorer/subgraph/bussyjd/teammeeting?selected=playground">GraphQL API</a> layer on top of it. The frontend can simply ask for deep graph data, e.g. to filter upcoming events with specific tags in a certain city.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*anNav7DmO3Q8yforT9eVJw.jpeg" /></figure><p>Our final Devpost submission for “Team Meeting” <a href="https://devpost.com/software/team-meeting">can be found here</a>. Currently the code is still in hackathon state but works more or less as explained above.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*esGqqq-7cvbJAcvpMLssgA.png" /></figure><h3>Consolidation &amp; Conclusion</h3><h4>What we were building and what we’re about to build</h4><blockquote>All the code and facts that you’ve seen above are the result of three weekends without sleep, achieved by around 10 people who never have met before in their lives. So please bear with us: this is not a working piece of software yet.</blockquote><p>At the time of writing we’re in the middle of figuring out how we continue this project. We most likely stay on the Ethereum chain, even though there’s a lively discussion going on whether <a href="https://www.parity.io/substrate/">Parity / Substrate</a>, <a href="https://nearprotocol.com/">NEAR</a>, <a href="https://skale.network/">elastic Eth Sidechains</a> or <a href="https://medium.com/chainsafe-systems/ethereum-2-0-a-complete-guide-d46d8ac914ce">Eth2.0 / Serenity</a> are the stacks to wait for or build on. Personally I’d happily stay with the proven Ethereum stack and embrace MetaMask as “identity” wallet and mandatory dependency for interactions.</p><p>We will surely invest some energy in the <strong>event detection / storage / discovery</strong> part of the whole story since this is what the most owned, federated and siloed part of the current meetup/event ecosystem is. The people behind our ĐOor idea want to take it a step further and add more close-to-event features (e.g. Kickback-like RSVP deposits that will be transferred back to their origin as the proof of attendance had taken place) whereas Team Meeting prefers to decouple functionality as much as possible to just help with the plain chain anchored event data base.</p><p><strong>If you want to be part of the discussion or would like to dig through or contribute to our code or you want to fork it and build your own new meetup.com: go ahead, the way is free for you — here’s our “ ĐOor” organization that currently maintains both our ĐOor and Team Meeting repos: </strong><a href="https://github.com/d0or">https://github.com/d0or</a> . <strong>If you’d like to support or integrate us in any way, don’t by shy and contact us.</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d1fce0748a26" width="1" height="1" alt=""><hr><p><a href="https://medium.com/t14g/decentralized-event-management-platforms-d1fce0748a26">After the Meltdown: rethinking event management platforms.</a> was originally published in <a href="https://medium.com/t14g">t14g</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Turbine goes: XPOMET Health Hackathon 2019]]></title>
            <link>https://medium.com/t14g/turbine-goes-xpomet-health-hackathon-2019-2560071f1aee?source=rss-53cacc38e8a4------2</link>
            <guid isPermaLink="false">https://medium.com/p/2560071f1aee</guid>
            <category><![CDATA[healthcare]]></category>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[hackathons]]></category>
            <dc:creator><![CDATA[Stefan Adolf]]></dc:creator>
            <pubDate>Tue, 15 Oct 2019 07:19:26 GMT</pubDate>
            <atom:updated>2019-10-15T07:22:39.583Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qlLItytDIHhI9PQ0ABbhvA.jpeg" /></figure><p><a href="https://www.healthhackathon.com/">Hackathon #7</a> this year introduced me to the unknown waters of health tech &amp; <strong>machine learning</strong>. I’ve always tried to get myself into these areas, so I’m glad I finally have been forced to wrap my head around them. The organization team (thank you <a href="https://theimpact.farm/">impactfarm</a> for making it outstanding) told us four weeks in advance about the challenge they had in mind for us — and thankfully they also came up with a team name: From September 14 on, we could refer to ourselves as the “<strong>Turbiners</strong>” (which is slightly incorrect, since two of us were absolutely unaffiliated with Turbine). So, we had four weeks of time preparing our project — which is still hard when you’re on a full-time job — and it read: “<strong>intelligent claim management in the digital health ecosystem</strong>”.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*0z86zsaEcY4-g_uF" /></figure><p>Now, what you may not be aware of: <strong>Fraud</strong> is a highly underrated and <a href="https://www.predictiveanalyticsworld.com/sanfrancisco/2013/pdf/Day1_1550_Biermann.pdf">very relevant topic</a> in the health industry. According to <a href="https://www.mckinsey.com/industries/healthcare-systems-and-services/our-insights/artificial-intelligence-in-health-insurance-smart-claims-management-with-self-learning-software">a McKinsey study</a> from 2017 there’s a saving potential for health insurers in Germany of up to <strong>half a billion euros</strong> a year — only by checking reimbursement claims by care providers (doctors, hospitals, hospices etc.) more thoroughly. As it turns out, 70% of all claims need to be checked, but only 8–10% of the potentially fraudulent cases are finally identified and corrected. If that doesn’t sound like a good case for Machine Learning, what does?</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*EPVJZGGZlWt2Fg3QEHLT2A.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*dUkWET5M0okY6LQE" /><figcaption>Team Turbiners during another ”sorting things out” session</figcaption></figure><p>Since our team had been assembled quite randomly, we were extraordinarily lucky to have had <a href="https://www.linkedin.com/in/elena-williams-769757a5/">Elena Williams</a> in our team. She’s currently studying <strong>data science</strong> in Hamburg and could contribute much of her knowledge into our project. Around two weeks before the hackathon we were looking for data sets that could help us and eventually Elena came up with <a href="https://www.kaggle.com/rohitrox/healthcare-provider-fraud-detection-analysis">this one</a>. It contains 130.000 claims by more than 5400 providers and has been examined by experts who identified the fraudulent entries. What’s important to understand: Fraud can only be observed on a<strong> provider level</strong>. The unique claims are pretty much unobtrusive, so any model we could come up with only would operate on providers and never on particular claims.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*p1yy5xQIJXUONmx2VH68ag.png" /></figure><h3>Bayer Karriere on Twitter</h3><p>„So how do you feel on the second day of the #healthhackathon19, Elena?!&quot; https://t.co/Bl8n4RRMXR</p><p>The original notebook takes three approaches to analyse the dataset: Logistic Regression, <a href="https://medium.com/machine-learning-101/chapter-5-random-forest-classifier-56dc7425c3e1">Random Forest Classifiers</a>, support vector machines and an <a href="https://www.datacamp.com/community/tutorials/autoencoder-keras-tutorial">auto encoder</a>. They reached a predictive accuracy of anything between 50–90%. To boost the accuracy further, Elena tried to figure out better features to train the model and relied on a Keras Deep learning model with four layers. According to the training evaluation she reached an <strong>accuracy of 93%</strong> in the end which is quite outstanding.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/372/0*8MZ-u9th9K-2QW7t" /></figure><p>In the meantime, the rest of the team concentrated on making the prediction model usable — seeing is believing, right? So I created a fresh React app, imported all the test data into a <strong>Sqlite</strong> database (sic) and wrote a <strong>Flask</strong> micro API that’s capable of selecting all claims for a given provider. It also comes with an endpoint to call the predict function of the trained model. I noticed quite early that this is not a simple task: All these data scientists use their highly interactive Jupyter notebooks for one reason or another, but that’s not something that you want to build a “<strong>reliable</strong>” service on (do you?). So most of our backend work consisted in transferring Elena’s data transformation and feature extraction code into a <strong>plain Python backend</strong>.</p><p>The plan was to upload an Excel / CSV-file with a batch of beneficiary / claim data on the frontend, translate it into the presentation that Elena’s model would expect and run the prediction on it. Thankfully our junior dev Sascha took care of the upload part, so I could concentrate on the integration. I made one observation that could be helpful for others: While Sqlite comes with <a href="https://www.quackit.com/sqlite/tutorial/import_data_from_csv_file.cfm">great support</a> of automatic <strong>CSV imports</strong> it unfortunately translates a string value of “NaN” to “NA” (which might be the NaN-representation of Sqlite, who knows). When reading this data with Pandas again, it interprets it as string. Once we figured that out, following up the other 250 cells was close to a piece of cake. Python people might know that but let me repeat: The tensor manipulation features of Panda’s <a href="https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html#pandas.DataFrame">DataFrame</a> are simply outstanding! If you happen to do any data analysis in any language — stop here and switch to Python, it will save you days of data manipulation.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*yivp9y9_RoVES_Wl7opdcQ.png" /></figure><p>A major issue we weren’t able to figure out is the <strong>scaling of predicted values</strong>. Elena’s model performed nicely on training and testing data sets but calling the prediction on a single data set (consisting of around 60 claims, derived from the original training data) just ended up in an array of unusable float data — in the end, she didn’t develop a binary classifier, but rather a predictor that yields a certain <strong>probability</strong> of having identified a fraud. Unfortunately, without a clear output it wasn’t possible for us to demonstrate our model’s accuracy, but I’m pretty sure that’s mainly due to our missing experience.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ul7pUQ2KSwGFAYCRjrch7A.png" /></figure><p>If you’d just like to get a feeling for all achievements, here is a deployment for you (it’s currently asleep, give it 30 seconds to wake up &amp; another 20 seconds to download the database from my S3 bucket): <a href="https://turbiners.netlify.com">https://turbiners.netlify.com</a>. The codebase is split into a <a href="https://github.com/cod1ng-earth/hh-fraud-detection-api">Python backend</a> and a <a href="https://github.com/cod1ng-earth/hh-fraud-detection-frontend">React frontend</a>. It looks so nice because I’ve been using <a href="https://v2.grommet.io/">Grommet JS</a> for styling.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*S5Gnq4lRl-3Jp-Mb" /></figure><p>Another part of the jury’s evaluation was a <strong>business model canvas</strong> for our case. Now, since I’m a down-to-earth, glue-level, hard rock listening developer I must admit that my business development skills have degraded and I still have the strong opinion that “business” and “hackathon” are never a good match. I’ll still share a few of our ideas and would like to thank <a href="https://www.linkedin.com/in/florian-schulze-735bb0109/">Florian Schulze</a>, Turbiners’ team member #4 for the effort he took from our shoulders by starting off ideas:</p><ul><li>Value proposition: we want to build a digital claim management service (running on our side) and an obfuscator /<strong> anonymizer service</strong> (running on the insurance / client’s side).</li><li>Our key partners would be <strong>insurance auditors</strong> with lots of experience in detecting medical claim fraud cases.</li><li>Our primary customer segments would be <strong>German health insurance companies</strong> and their attached consultancies.</li><li>As sales channels we identified health conferences and <strong>SaaS solution marketplaces</strong> (e.g. offering a blackboxed service instance of us on customer operated dedicated AWS instances).</li><li>After quite some discussion, we agreed that our preferred<strong> business model </strong>would be to take a 0.5% share of all analysed claim reimbursements files (which could add up to around €50–100mn revenue / year depending on quality of prediction and market share)</li></ul><p><a href="https://docs.google.com/presentation/d/e/2PACX-1vSISM6XwtUw-Cl58HZjg3h3fU8ha4WVzqCyNVEubfzrVZTdmjrGyKKS6PzKBcZ3qaiSTKDTWAXGqrA6/pub?start=false&amp;loop=false&amp;delayms=60000">Here’s our final pitch deck</a>:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/960/1*9xQMZE7ORdx7XQE5hSUPuQ.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*KdsWphWUaPcrT_bnT_jNzg.png" /></figure><h4>Some miscellaneous takeaways and side notes.</h4><ul><li>The winning team (consisting of only 1 member) in our category has absolutely earned his prize: He threw together an Android app, a Blockchain, a VR channel and MongoDB and built an app that first tells you which exercise to execute and then scans your body movements to identify that you’re doing it right. Once done, it stores your achievement on a chain and registers your activity in Mongo. I’m dead sure that it took most of the four weeks of preparation to put all these pieces together, and I was quite impressed by his demo.</li><li>The other category dealt primarily with machine support in “real” health applications, e.g. ophtomal… eye diseases. One team certainly stood out: They used some weird looking lens concept to scan your eyeball. With a little machine learning / <strong>image classification</strong> attached, they were able to identify major health conditions within just a fraction of the costs a “real” medical device would need.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*HqGvsoT9FFQSOLuA" /><figcaption>Sascha seems to enjoy his walkthrough of an inflated intestine</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*p1yy5xQIJXUONmx2VH68ag.png" /></figure><h4>Contacts and Takeaways</h4><p>The most important reason why I personally wanted to join the health hackathon, though: I’ve been looking for <strong>contacts, inspiration and validation</strong> of the real world use case I’m currently working on at Turbine. That is: storing a patient’s <strong>medical record</strong> and its access rights on a decentralized ledger. And I have not been disappointed:</p><p>Several parties, among them four co-workers of Berlin’s Charité, lawyers, doctors and consultants strongly confirmed my assumption: <strong>There is absolutely nothing like a shared digital patient file in Germany</strong>. All approaches toward it are heading into the direction of either medication plans, fitness tracking or “eGK” applications that collect and store data that a patient collects himself (e.g. by tracking her blood pressure). It’s astonishing, but every time I roughly illustrated our idea everybody became very excited and immediately offered their full support.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*EPVJZGGZlWt2Fg3QEHLT2A.png" /></figure><h4>Conclusion</h4><p>This is what a conference and hackathon should look like. The food could’ve been better (no complaints about bad food if it’s for free, yes, I’m already sorry), the beer could’ve been more plenty, the surround sound of all four conference panels could’ve been less annoying and the unnecessary artificial “pressure” that the main hackathon sponsors have been building up upfront was unnecessary. But besides that, we all had a lot of fun! :) Next up: <a href="https://diffusion2019.devpost.com/">Diffusion 2019!</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*uXhyiCkOKvsMD2eybM2bTQ.jpeg" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2560071f1aee" width="1" height="1" alt=""><hr><p><a href="https://medium.com/t14g/turbine-goes-xpomet-health-hackathon-2019-2560071f1aee">Turbine goes: XPOMET Health Hackathon 2019</a> was originally published in <a href="https://medium.com/t14g">t14g</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Das Bitcoin-Prinzip]]></title>
            <link>https://medium.com/t14g/das-bitcoin-prinzip-fdd65bcb6560?source=rss-53cacc38e8a4------2</link>
            <guid isPermaLink="false">https://medium.com/p/fdd65bcb6560</guid>
            <category><![CDATA[dlt]]></category>
            <category><![CDATA[bitcoin]]></category>
            <category><![CDATA[blockchain]]></category>
            <category><![CDATA[cryptocurrency]]></category>
            <category><![CDATA[currency]]></category>
            <dc:creator><![CDATA[Stefan Adolf]]></dc:creator>
            <pubDate>Thu, 19 Sep 2019 07:31:01 GMT</pubDate>
            <atom:updated>2019-09-19T07:31:01.925Z</atom:updated>
            <content:encoded><![CDATA[<h4>Vom Begriff zur Anwendung: Nutzen, Kritik und Schattenseiten der stärksten Kryptowährung der Welt</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*f-EyLwFzC4SlZGoy6rY3mA.jpeg" /></figure><h3>Wo waren Sie…</h3><p>…als die Kryptowährungs-Kurse Ende 2017 explodierten? Als der Wert eines einzigen Bitcoins die Schallmauer von 20.000 Dollar <a href="https://www.coinbase.com/price/bitcoin">durchbrach</a>? Erinnern Sie sich an den tiefen Fall wenige Tage später und das Durchschreiten des Kurstiefs im Frühjahr 2019? Haben Sie eventuell Geld in “Cryptotokens” investiert, in Ihrem Freundeskreis über den ökologischen Impact des Bitcoin-Minings diskutiert, bei ICOs und vielversprechenden Token-Vorstellungen mitgewettet? Und sich dabei immer wieder auch gefragt: <em>hat das alles einen realen Nutzen</em>? Oder standen Sie auf der Gegenseite und haben das Ganze stets als anachronistischen <a href="https://de.wikipedia.org/wiki/Tulpenmanie">Tulpenzwiebelwahnsinn</a> abgetan, ausgelöst von ein paar neurotischen Visionären aus Fernost, immer auf der Jagd nach dem nächstgrößeren unhaltbaren Werteversprechen, um unbedarften Investoren das Geld aus der Tasche zu ziehen?</p><p>Ganz gleich wo Sie stehen oder standen: die maßgebliche Technologie hinter <strong>Kryptowährungen</strong> ist alles andere als eine substanzlose Erfindung eines unbekannten Philanthropen mit japanischem Kunstnamen. Die <strong>Blockchain</strong> und ihre Varianten sind eine Erfindung, die man nicht nur ernst nehmen, sondern analysieren, bewerten und für sich nutzbar machen sollte. Ganz abgesehen davon, dass mancher den weltweit verteilten “Kassenbüchern” (frei übersetzt aus dem englischen “<strong>Ledger</strong>”) zutraut, das Wertesystem westlicher Demokratien nachhaltig erschüttern zu können, kann man unvoreingenommen feststellen: sie ermöglichen einer Gruppe von Teilnehmern, die sich nicht kennen und daher auch nicht im Hinblick auf ihre Absichten vertrauen können, miteinander zu interagieren, indem sie Geldwerte transferieren oder langfristige Übereinkommen treffen. Im folgenden wollen wir die Technologie und die Gedanken hinter <strong>Bitcoin</strong> vorstellen, ihren Nutzen diskutieren und zeigen, dass sie weiter fortgeschritten und marktfähig sind, als mancher vielleicht denken mag.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*pAXvWxmtbDXO8wwjfxdaMA.png" /></figure><h3>Währung kommt von Wahrheit</h3><p>Eine <strong>Währung</strong> ist ein Instrument des Vertrauens: wenn Sie sich mit einem Bauern darauf einigen, dass er mit Ihnen ein Ei gegen eine Glasmurmel tauscht, sind die Werte “Murmel” und “Ei” ineinander konvertierbar. Wenn jemand nun einen Weg findet, äußerst günstig viele Glasmurmeln herzustellen, wird der Bauer irgendwann mehr als eine Murmel für ein Ei verlangen. Die möglicherweise groteskeste Version eines solchen Geldsystems sind die tonnenschweren <a href="https://de.wikipedia.org/wiki/Rai_(Währung)">Rai-Steinscheiben</a>, die auch heute noch Inhaber von Immobilien nachweisen.</p><p>Glasmurmeln, Steinscheiben und Euro-Banknoten haben für die meisten Marktteilnehmer selbst keinen besonderen Wert, sie stehen nur symbolisch für Eier, Kraftfahrzeuge und Netflixserien, die man damit konsumieren kann. In einer ökonomischen Zivilisation sind wir auf solche Symbole des <strong>Vertrauens</strong> angewiesen, um beliebige Werte ineinander überführen zu können, Handel zu treiben und durch Verleih und Zins Wachstum zu ermöglichen. Banken und Regierungen fallen dabei seit der Erfindung des Geldes besondere Rollen zu: sie schaffen die Regeln für die Währung, sie garantieren mit ihrem Namen und ihrem Vermögen für die Einlagen der Marktteilnehmer und sie steuern die Verfügbarkeit, den Zins und den Verleih von Geld; sie sind gewissermaßen der Ursprung, aus dem sich das <strong>Währungssystem</strong> entwickelt. Sie garantieren, dass man für einen Schein mit aufgedruckter Zahl einen halbwegs stabilen Gegenwert erwarten kann, indem sie die Spielregeln des Systems festlegen. Seitdem sich in den Siebziger Jahren das <a href="https://en.wikipedia.org/wiki/Bretton_Woods_system">Bretton Woods-System</a>, gemäß dem jeder US-Dollar mit einer bestimmten Menge Gold gedeckt sein musste, selbst außer Kraft setzte, können alle Institutionen, die ihr Geld gegen den Dollar konvertieren, nahezu beliebig neues Geld erschaffen, indem sie es z.B. über ihre Zentralbanken zu einem bestimmten Zinssatz verleihen. Solches Geld bezeichnet man im Investorensprech als <a href="https://www.investopedia.com/terms/f/fiatmoney.asp">“<strong>Fiat</strong>”-Geld</a>, aus dem Lateinischen “Es werde” (<a href="http://vulgate.org/ot/genesis_1.htm">Genesis 1, §3</a>).</p><p>Sobald man sich auf eine Bezeichnung der Währung (Glasmurmel, Euro oder Bitcoin) geeinigt hat, ist der Weg zu einem <a href="https://de.wikipedia.org/wiki/Buchgeld"><strong>giralen Geldsystem</strong></a> nicht weit: Sie können einer Bank einen Hundert-Euro-Schein anvertrauen und der Bankangestellte wird in einem Buch hinterlegen, dass Sie jetzt 100 Euro Guthaben auf ihrem Konto haben. Sobald Sie einen Teil Ihres Guthabens gegen einen anderen Wert tauschen möchten, teilen Sie der Bank mit, welchem Konto Sie einen gewissen Betrag gutschreiben möchten, weisen dies dem Empfänger nach und können dafür die entsprechende Gegenleistung erwarten. Kommt der Empfänger seinen bezahlten Pflichten nicht nach, können Sie mit Hilfe ihres bei der Bank bestellten <strong>Kontoauszugs</strong> glaubhaft nachweisen, dass die Transaktion zu einem bestimmten Zeitpunkt stattgefunden hat. Der uneingeschränkte Fluss des Geldes, bestehend aus Einzeltransaktionen, ist die Grundlage jeder Art von wirtschaftlicher Transaktion; Bankkonten dienen als Nachweis für Absichten und Leistungen.</p><p>Das im englischen Sprachraum gebräuchliche Wort für Währung ist “<strong>currency</strong>”, was den Sinn des Geldes viel besser verdeutlicht als der deutsche Begriff, der mutmaßlich der “Wahrheit” entlehnt wurde, tatsächlich aber auf die “<a href="https://de.wikipedia.org/wiki/W%C3%A4hrung">Gewährleistung</a>” zurückgeht: Geld ist ein <strong>transaktionales Schmiermittel</strong> zur Steuerung von Warenströmen, Werten und Dienstleistungen. Es besitzt keinen stehenden Wert, sondern ist nur ein volatiles Werkzeug, um Besitztümer zu tauschen und Ansprüche geltend zu machen.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*DRGFmNZS8maLrcgqZjJtBw.png" /></figure><h3>Vertrauen und Vertrauensbruch</h3><p>Geld ist in unseren westlichen Kulturen derart fest verankert, dass wir kaum noch merken, dass das Vertrauen in Banken, Geld und Regierung nur in unseren Köpfen existiert. Die <strong>Banken- und Finanzkrise</strong> ist nur spurlos an den meisten Bürgern vorbeigezogen, weil die EZB ihren gewaltigen Vertrauensvorsprung in eine Geldflut ummünzte, um das Euro-Einlagensystem zu stützen und seitdem mit Minimalzinsen die Wirtschaft halbwegs am Laufen hält. Aber fragen Sie mal eine enteignete Hausbesitzerin im amerikanischen Mittelwesten, einen Lehmann-Banker oder einen ehemaligen Deutsche Bank-Vorstand, wie die das sehen.</p><p>Unlautere Marktteilnehmer sorgen dafür, dass sich herkömmliche Währungssysteme erschüttern lassen; Landes- und Zentralbanken sowie der <a href="https://en.wikipedia.org/wiki/International_Monetary_Fund">Internationale Währungsfonds</a> werden seit der Krise nicht müde, neue <strong>Kontrollinstrumente</strong> zu erfinden und per Gesetz zu installieren, um den weltweiten Kapitalmärkten Regeln aufzuerlegen. Sobald systemrelevante Teilnehmer wie Italien, Venezuela, China oder eine <a href="https://de.wikipedia.org/wiki/Hypo_Real_Estate">bayerische Immobilienbank</a> anfangen, sich über diese Regeln zu ihrem eigenen Vorteil hinwegzusetzen, sind alle vertrauensstiftenden Bemühungen der Institutionen wertlos. Das System steht auf Messers Schneide, Populisten untergraben weltweit das geborgte Vertrauen in den Staat, Banken können unter der anhaltenden Nullzinspolitik kaum noch genug erwirtschaften, um die Einlagen ihrer Kunden zu garantieren; es lohnt sich für sie einfach nicht mehr, Geld zu verleihen und schon gar nicht mehr, die <strong>Girokonten</strong> ihrer Kunden zu verwalten.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*yradzmb7rw92xAl1gENHrw.png" /></figure><h3>Die letzte Chance auf Rendite: riskante Hebelwetten auf die Zukunft</h3><p>Um überhaupt noch Geld mit Geld zu verdienen, bedarf es Finanzprodukten mit <strong>Hebelwirkung</strong>: Futures, Hedgefonds, Derivate, Optionen und Obligationen. Da es auch mir schwerfällt, sie im Ansatz zu verstehen, möchte ich mich hier nicht zu weit mit Erläuterungen ihrer Funktionsweise aus dem Fenster lehnen. Im Kern geht es aber bei allen diesen Ideen um die simple Tatsache, dass man mit einer “Wette” auf den Eintritt eines Ereignisses Geld verdienen kann.</p><p>Einfaches Beispiel: ich wette mit Ihnen, dass ein Liter Superbenzin am 21. August 2021 zwei Euro kosten wird. Ich garantiere Ihnen, dass ich Ihnen diesen Liter Superbenzin an ebendiesem Datum für genau zwei Euro verkaufen werde und fixiere unsere Absprache auf einem Zettel, den ich Ihnen heute für zwei Euro verkaufe. Wenn das Benzin in zwei Jahren 2,50 Euro kostet, haben Sie 0,50 Euro gewonnen, kostet er dagegen nur 1,50 Euro, gewinne ich 0,50 Euro.</p><p>Anstatt den Zettel zu behalten, können Sie ihn aber auch morgen für drei Euro an einen pessimistischen Bekannten verkaufen, je nachdem, welchen Benzinpreis Sie in ihrem Kaffeesatz lesen. Je näher der Stichtag rückt, desto wertvoller oder wertloser wird der Zettel, je nach Sichtweise. Wenn Sie sich beim Kauf des Zettels mir gegenüber sogar <strong>verpflichtet</strong> hätten, den Liter Superbenzin für diesen Preis abzunehmen, kann es je nach Benzinpreis für Sie ein ziemlich einträgliches oder gefährliches Geschäft werden. Diese Art der <strong>terminierten Verbriefung von Preiswetten</strong> ist ein tagtäglich millionenfach gehandeltes Wertpapier namens “<a href="https://de.wikipedia.org/wiki/Termingesch%C3%A4ft">Termingeschäft</a>” und maßgeblich für die Schwankungen des Spritpreises an Tankstellen <a href="https://www.zeit.de/wirtschaft/2015-01/oelpreis-tanker-contango">verantwortlich</a>. Das Verhältnis zwischen dem gehandelten Wert des Papiers und dem realen Wert des zugrundeliegenden Geschäfts ist der “Hebel”, mit dem Rendite oder Verluste berechnet werden.</p><p>Abseits der Frage, ob Sie diese Art von Geschäften für verwerflich halten und am liebsten gleich den modernen Kapitalismus abschaffen wollen, möchte ich Sie zu der Überlegung anregen, was an diesem Geschäft im Kern nicht stimmt. Zunächst einmal das <strong>Vertrauen</strong>: wissen Sie sicher, dass ich Ihnen 2021 den versprochenen Liter Superbenzin überhaupt aushändigen kann? Dann die <strong>Transparenz</strong>: der Marktteilnehmer, der Ihnen den Zettel für drei Euro abkauft, wird alles daran setzen, den Preis z.B. durch Verknappung, Zölle, üble Nachrede oder terroristische Anschläge auf 3,50 Euro zu treiben, ohne dass ich nachvollziehen kann, wer dafür verantwortlich ist.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*JkeZQzLWJ1NO5BvdCqKljA.png" /></figure><h3>Bankkonten sind ein Konzept für Privilegierte</h3><p>Ein ganz anderes Problem mit Währungen und Geld entsteht, wenn man in einer Region lebt, in der man nicht auf einen starken Rechtsstaat, Institutionen und Regierungen vertrauen kann. Über <a href="https://www.capital.de/wirtschaft-politik/ueber-zwei-milliarden-menschen-besitzen-kein-bankkonto">1,7 Milliarden</a> Menschen auf unserem Planeten <a href="https://de.statista.com/infografik/18482/top-10-laender-nach-anteil-der-erwachsenen-die-kein-bankkonto-haben/">haben keinen Zugang zu einem <strong>Bankkonto</strong></a><strong> </strong>— der absoluten Grundlage, um gegenseitiges Vertrauen in Transaktionen aufbauen zu können. Wenn Sie meinen, dass sich auch größere Transaktionen mit Hilfe von Glasmurmeln oder Bargeld abwickeln ließen, dann fragen Sie mal einen kolumbianischen Drogenkurier nach dessen Meinung.</p><p>Gleichzeitig liegt in failed States wie <a href="https://de.wikipedia.org/wiki/Wirtschaftskrise_in_Venezuela">Venezuela</a> die reale Bedrohung der permanenten <a href="https://de.wikipedia.org/wiki/Hyperinflation">Geldentwertung</a> in der Luft. Sobald ein Staat unkontrolliert Geld in Umlauf bringt oder seine Schulden nicht mehr bedienen kann, verlieren seine Bürger und internationalen Partner schlagartig das Vertrauen in das bunte Papier, das er einmal Währung nannte; in Venezuela lag die Inflationsrate 2018 deswegen bei <a href="https://edition.cnn.com/2019/05/29/economy/venezuela-inflation-intl/index.html">130.000 Prozent</a> (das ist kein Komma!) und daran ist weder die CIA noch der schwankende Ölpreis schuld, sondern ein massiver, <a href="https://www.forbes.com/sites/stevehanke/2019/01/01/venezuelas-hyperinflation-hits-80000-per-year-in-2018/#2b5166a04572">anhaltender <strong>Vertrauensverlust</strong></a> von Bürgern in ihre Institutionen.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*pAXvWxmtbDXO8wwjfxdaMA.png" /></figure><h3>Bitcoin: ein faires Vertrauenssystem für eine weltweit akzeptierte Währung</h3><p>2009 kam ein gewisser <strong>Satoshi Nakamoto</strong> (es ist nicht öffentlich bekannt, <a href="https://en.wikipedia.org/wiki/Satoshi_Nakamoto">wer das ist</a> — möglicherweise sogar eine ganze Gruppe von Entwicklern) auf eine brillante Idee. Er kreierte mit <strong>Bitcoin</strong> ein nicht beliebig produzierbares digitales Wertesymbol (die Glasmurmel) und erfand gleichzeitig ein vertrauenswürdiges, transparentes <strong>Buchhaltungssystem</strong>, auf das beliebig viele Teilnehmer gleichzeitig lesend wie schreibend zugreifen können. Spannenderweise fällt der Begriff “<strong>Blockchain</strong>” in Nakamotos <a href="http://satoshinakamoto.me/bitcoin.pdf">legendärem Whitepaper</a> kein einziges Mal.</p><p>Der Kern von Satoshis Idee ist ein lineares Buchhaltungssystem. Doch was würde passieren, wenn wir alle unkontrolliert gleichzeitig in das selbe Buch schreiben könnten? Angenommen, ich würde laut Kassenbuch über einen Bitcoin verfügen und Sie würden mir einen Gebrauchtwagen für diesen Bitcoin verkaufen wollen; In dem Moment, in dem Sie mir den Schlüssel überreichen, schreibe ich in unserem Kassenbuch Ihrem Konto meinen Bitcoin gut. Da es keine zentrale Instanz gibt, die mich daran hindern könnte, schreibe ich nur einen Augenblick später <strong>den selben Bitcoin</strong> einem anderen Teilnehmer gut, der mir dafür eine wertvolle Mingvase vor die Haustür stellt. Bevor Sie merken, dass aus meinem Bitcoin zwei geworden sind, bin ich mit ihrem Auto und der Vase im Kofferraum bereits über alle Berge. Die Verhinderung solcher “<strong>Double-Spends</strong>” ist das zentrale Problem, das Blockchains lösen.</p><p>Was wir benötigen, um uns gegenseitig ohne jegliches Zutun einer dritten Partei vertrauen und kontrollieren zu können, ist ein System zum fehlerfreien, unfälschbaren und eindeutigen Nachweis meines <strong>Kontostands</strong> und zur Abwicklung von Transaktionen in einer<strong> festgelegten zeitlichen Abfolge</strong>. Sie müssen sich hundertprozentig sicher sein können, dass ich beim Abschluss unserer Transaktion über den geforderten Betrag verfüge. Um dieses Vertrauen herzustellen, müssen sich alle Bitcoin-Teilnehmer verbindlich auf die <strong>Reihenfolge</strong> und <strong>Finalität</strong> von Transaktion einigen. Über diese Herausforderung, die man als “<a href="https://en.wikipedia.org/wiki/Byzantine_fault">byzantinische Fehlertoleranz</a>&quot; oder kurz <strong>BFT</strong> bezeichnet, zerbrechen sich Informationswissenschaftler seit den 1970er Jahren den Kopf — obwohl ich nicht ausschließen möchte, dass tatsächlich ein paar byzantinische Generäle vor einem halben Jahrtausend vor dem selben Problem standen: wie stellt eine beliebig große Gruppe einen Konsens über die aktuell geltende Wahrheit her, wenn jeder genau weiß, dass einige Teilnehmer in der Gruppe ein falsches Spiel spielen und versuchen, zu ihrem Vorteil falsche Daten einzutragen?!</p><p>Bitcoin war der weltweit erste Ansatz, der das BFT-Konsensproblem mit Hilfe einer Peer-to-Peer replizierten <strong>Blockchain</strong> löste — bis heute hat sich dieser Ansatz bewährt, wird von Millionen von Teilnehmern akzeptiert und hat sich millionenfach als unerschütterliches Instrument des Vertrauens bewährt.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*DRGFmNZS8maLrcgqZjJtBw.png" /></figure><h3>Seeds, Hashes, Wallets und Nonces: Fundamente der Blockchain</h3><p>Um am Bitcoin-Ledger teilzunehmen, benötigt man zuallererst den <strong>Seed</strong> eines kryptografischen Schlüsselpaars, nicht unähnlich den Schlüsseln, die man zur Kommunikation mit SSH-Servern oder zur GPG-Verschlüsselung von Emails nutzt. Dieser Seed weist seinen Besitzer als Inhaber aller von ihm ausgehenden Transaktionen aus — wer ihn besitzt, hat uneingeschränkte Kontrolle über das <strong>Guthaben</strong>, das durch die Saldierung aller mit oder gegen ihn durchgeführten Transaktionen ermittelt wird. Der dazugehörige <strong>Public Key</strong> ist die eindeutige, unveränderliche, öffentliche Bitcoin-Adresse, die für alle Teilnehmer sichtbarer Bestandteil aller Transaktionen ist. Aus diesen Fakten leiten sich zwei grundlegende Eigenschaften der Bitcoin-Blockchain ab:</p><ul><li>“<em>Not your keys, not your Bitcoin</em>”: wer die Kontrolle über seinen Seed verliert, verliert sein Guthaben — wer ihn besitzt, verfügt über das Guthaben. Wird der Seed kompromittiert, hat man gleichzeitig die Kontrolle über sein Konto verloren.</li><li>Bitcoin-Transaktionen sind <strong>nicht anonym</strong> und ihr Inhalt ist <strong>nicht verschlüsselt</strong>. Jeder kann alle jemals getätigten Bitcoin-Transaktionen nachverfolgen und damit sehr leicht Rückschlüsse über die Teilnehmer der Transaktion ziehen. Sobald eine öffentliche Bitcoin-Adresse mit einer Person in Bezug gebracht werden kann, kann man unmittelbar feststellen, mit wem und in welcher Höhe diese Person Geld ausgetauscht hat.</li></ul><p>Für die sichere Aufbewahrung und die sichere Interaktion mit der Blockchain sind Apps verantwortlich, die man gemeinhin als “<strong>Wallet</strong>” bezeichnet. Der Begriff ist so malerisch wie irreführend, denn er verleitet zu der Annahme, dass sich die Bitcoins eines Nutzers in seiner Geldbörse befinden. Tatsächlich enthält die Wallet nur den Schlüssel, um die Kontrolle über eine Bitcoin-Adresse und ihr saldiertes Guthaben nachzuweisen.</p><p>Ein anderes Vorurteil: um mit der Blockchain interagieren zu können, benötigt man eine vollständige aktuelle Kopie des gesamten Ledgers — <a href="https://www.statista.com/statistics/647523/worldwide-bitcoin-blockchain-size/">derzeit sind das mehr als 250 GB an Daten</a>. Wäre das tatsächlich der Fall, wäre die Technologie schon heute im realen Leben unbenutzbar. Daher kommunizieren Wallets mit öffentlich sichtbaren <strong>Nodes, </strong>die Kopien der Blockchain vorhalten und vermitteln lediglich vorbereitete Transaktionen dorthin. Wer völlig unabhängig von anderen Teilnehmern mit Bitcoin interagieren möchte und wirklich niemandem vertraut, kann aber auch selbst <a href="https://bitcoin.org/en/full-node">einen solchen Node betreiben</a>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*yradzmb7rw92xAl1gENHrw.png" /></figure><h3>Wenn aus dem Nichts Geld entsteht: Proof of Work und Mining</h3><p>Transaktionen werden nicht einzeln in den Ledger geschrieben, sondern zu <strong>Transaktionsblöcken</strong> eines begrenzten Umfangs zusammengefasst — derzeit sind das pro Block etwa 1,2 MB, die durchschnittlich etwa 1000–3000 Transaktionen enthalten. Neben den Transaktionen enthält ein Block den <strong>Hashwert</strong> und den Index des vor ihm liegenden Blocks, sodass man vom Ende beginnend alle Blöcke bis <a href="https://btc.com/000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f?page=1&amp;asc=1&amp;order_by=tx_hash">zum allerersten</a> jemals generierten Block (der <em>Genesis</em>) zurückverfolgen kann: so prägte sich der Begriff “Blockchain”. Das wichtigste technische Instrument in diesem Verfahren ist die sichere <strong>Hashfunktion</strong> (SHA-256), die aus einer beliebig großen Eingangsdatenmenge einen relativ kurzen, eindeutigen Wert ermittelt und bei der kleinsten Veränderung der Daten zu einem völlig anderen Ergebnis führt.</p><p>Aber wie stellt man sicher, dass niemand in betrügerischer Absicht falsche oder widersprüchliche Transaktionen in einen Block schreiben kann? Die einfache Antwort: das kann man gar nicht sicherstellen. Man stellt vielmehr sicher, dass sich alle Teilnehmer auf eine Blockchain einigen, die ausschließlich valide Blöcke enthält. Die <strong>längste Blockchain</strong>, auf die sich alle Teilnehmer einigen können, entspricht dann der “Wahrheit”.</p><p>Die Bitcoin-Blockchain enthält hierfür eine eingebaute “Hürde”, die man nehmen muss, um überhaupt einen validen Block zu erzeugen und die auf Grund ihres zeitlichen und rechnerischen Aufwands als “<strong>Proof of Work</strong>” bezeichnet wird (wir erläutern die Details des <strong>Hashcash</strong>-Verfahrens an dieser Stelle nur stark vereinfacht, mehr konkrete Details finden Sie z.B. <a href="https://www.coindesk.com/bitcoin-hash-functions-explained">hier</a> und <a href="https://en.bitcoin.it/wiki/Hashcash">hier</a>). Ein sich berufen fühlender Teilnehmer fügt eine beliebige Menge ihm vorliegender Transaktionen und den Hash eines aktuellen Vorgängerblocks zu einem neuen Block zusammen und berechnet darüber einen ersten Hashwert. An diesen hängt er eine vom Bitcoin-Protokoll vorgegebene, <a href="https://btc.com/stats/diff">über die Zeit wachsende</a> Anzahl Nullen an (die sogenannte <strong>Difficulty</strong>) und sucht nun nach einem weiteren Wert (dem “<strong>Nonce</strong>”), der gemeinsam mit den Transaktions- und Vorgängerdaten dieses Blocks unter neuerlicher Ausführung der Hashfunktion zu ebendiesem Hash führt. Sobald ein passender Nonce gefunden wurde, meldet er den finalen Block an das Netzwerk und bittet alle anderen Teilnehmer um Überprüfung; während das Auffinden des Nonces <strong>extreme Rechenleistug</strong> erforderte, ist seine Überprüfung gegen den Rest des Blocks eine nahezu kostenlose Operation, sodass ein einmal validierter Block gute Chancen hat, schnell von vielen Teilnehmern im Netzwerk akzeptiert und damit Bestandteil der weltweit akzeptierten Blockchain zu werden.</p><p>Doch warum machen sich einige Teilnehmer überhaupt auf die anstrengende und aufwändige Suche nach Nonces für Blöcke von Transaktionen, die nichts mit ihnen selbst zu tun haben? Weil sie sich laut Bitcoin-Protokoll innerhalb ihres neuen Blocks eine festgelegte Summe von Bitcoins <strong>gutschreiben</strong> dürfen, die dadurch neu erzeugt werden! Derzeit werden aufgrund dieser Eigenschaft des Bitcoin-Protokolls pro Block etwa 12,5 neue Bitcoins “gemünzt”: <a href="https://btc.com/60fbf4331df189b6974f50cd67aae5cfa687541bb327b3948a15e358d5ada0c2">dies ist ein Beispiel</a> für die entsprechende Output-Transaktion innerhalb des Blocks <em>593418</em>. Die Kombination aus schwerer Arbeit mit anschließendem Geldregen führte zu der metaphorischen Bezeichnung “<strong>Miner</strong>” für Teilnehmer, die mit der Lösung des Hash-Rätsels beschäftigt sind.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*JkeZQzLWJ1NO5BvdCqKljA.png" /></figure><h3>Bitcoin: Systemische Schwächen</h3><p>Man erkennt hier schnell eine<strong> fundamentale Schwäche</strong> des Bitcoins. Da die Inzentivierung der Miner, einen extremen Rechenaufwand zu betreiben, vergleichsweise hoch ist (12,5 Bitcoin lassen sich derzeit in etwa 125.000 Euro wechseln), herrscht unter ihnen eine Stimmung wie am <a href="https://de.wikipedia.org/wiki/Klondike-Goldrausch">Klondike 1896</a>. Besonders enttäuschend ist, dass der allergrößte Teil des Rechenaufwands, für den sie <strong>exorbitante Mengen Energie </strong>aufwenden, für den Betrieb der Bitcoin-Blockchain völlig <strong>wertlos</strong> ist: Aberbillionen von Transaktionshashes werden berechnet und verworfen, sobald ein Miner das Rennen um den nächsten Block gewonnen hat. Mit normalen C/GPUs sind <a href="https://en.wikipedia.org/wiki/Brute-force_search">Brute-Force</a>-Suchen dieses Ausmaßes ohnehin nicht zu stemmen; die aktuelle Difficulty des Bitcoin-Netzwerks erfordert den großflächigen Einsatz sogenannter <a href="https://www.poolin.com/shop-miner-list">Ant-Miner</a>, spezialisierte Hardware, die ihre Betreiber zu Rechenpools zusammenschließen und die gemünzten Bitcoins untereinander aufteilen.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/860/1*33Ztd4niVJjNNYPruNdGxg.jpeg" /></figure><p>Niemand kann mit Sicherheit sagen, wie viele dieser Geräte auf der Welt in diesem Augenblick gleichzeitig auf Hochtouren nach Hashes suchen und dabei pro Exemplar bis zu 3000 W aufnehmen. Aktuelle Hochrechnungen vergleichen den Energiebedarf des Bitcoin-Netzwerks mit dem <strong>Energieverbrauch</strong> kleiner Staaten wie Dänemark oder dem Libanon. <a href="https://www.cell.com/joule/pdf/S2542-4351(19)30255-7.pdf">Diese</a> leider nicht mehr kostenlos zugängliche Studie und <a href="https://www.coindesk.com/carbon-footprint-bitcoin">dieser ausführliche Coindesk-Artikel</a> taxieren den Energiebedarf auf etwa <strong>45 TWh/Jahr</strong>, was man auf eine Emission von <strong>23 Mt CO²/Jahr</strong> umrechnen kann. Eine einzige erfolgreiche Bitcoin-Transaktion ist demnach für <strong>200 kg CO²</strong> verantwortlich, genauso viel ein Standardbenziner auf der Reise zwischen Glücksburg und Genf verbraucht.</p><p><strong>Jede einzelne Bitcoin-Transaktion sollte daher außerordentlich gründlich abgewogen werden.</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*pAXvWxmtbDXO8wwjfxdaMA.png" /></figure><h3>Hashraten, Transaktionsgebühren und Geschwindigkeit</h3><p>Das Bitcoin-Protokoll wurde von Satoshi Nakamoto so entworfen, dass die fürstliche Vergütung der Miner ab einer bestimmten Blockhöhe wegfällt. Alle <strong>21 Millionen Bitcoins</strong> sind dann im Umlauf und es können keine neuen mehr entstehen. Ab diesem Zeitpunkt werden Miner lediglich durch <strong>Transaktionsgebühren</strong> inzentiviert, die Eintragende ihnen für das Mining eines Blocks gutschreiben können. Das tun sie bereits heute: Für die Eintragung <a href="https://www.blockchain.com/btc/tx/9d29cc581866f8c88d643a8b5506803dd4eeedcfef84cff087829fa0839e650b">dieser privaten Transaktion</a> zahlte ich beispielsweise 0.00007707 BTC Gebühren (etwa 0,75 Euro); das klingt nicht viel, aber stellen Sie sich einmal vor, Ihr Kreditinstitut würde Ihnen die gleichen Gebühren für eine girale Euro-Transaktion abziehen — sie würden schon am nächsten Tag zu einer Bank wechseln, die keine Gebühren erhebt. Zur Stoßzeit des Cryptobooms Ende 2017, zu der die halbe Welt binnen Tagen auf den rollenden Bitcoin-Zug aufspringen wollte, waren einige Teilnehmer sogar bereit, <a href="https://www.blockchain.com/btc/tx/e1e7bd6c02cd21ab9c290847856e9c77120dfd40a72e60a3e105f6445ad90462">Transaktionsgebühren weit über 50 Euro</a> <a href="https://btc.com/stats/fee">zu bezahlen</a>.</p><p>Hinzu kommt die durchs Blockhain-Verfahren bedingte <strong>Dauer der Finalisierung</strong>: bis ein Block mit meiner Transaktion durch mindestens 6 spätere Blöcke fest in die weltweit längste Blockchain eingetragen wurde und somit als final bestätigt gilt, können mehrere Stunden vergehen. Eine von ihrem Girokonto ausgehende innerdeutsche Überweisung wird je nach Verfahren und Ziel von Ihrer Bank heutzutage binnen Minuten bestätigt, das zentral gesteuerte <strong>VISA-System</strong> benötigt dafür sogar nur Sekunden (und verarbeitet zu Stoßzeiten bis zu 50.000 Transaktionen pro Sekunde, Bitcoin <a href="https://bitinfocharts.com/bitcoin/">schafft in seiner derzeitigen Auslegung und Hashrate lediglich 7–12</a>).</p><p>Zur Bezahlung eines Abendessens, einer Tasse Kaffee oder eines Wochenendeinkaufs ist Bitcoin wegen seiner Transaktionsgebühren und -zeiten derzeit nicht geeignet. Stattdessen eignet sich Bitcoin viel besser für kurzfristige Spekulation und zur Wertaufbewahrung und das ist möglicherweise die <strong>abschreckendste Konsequenz</strong> seiner unkontrollierten Vertrauensbasis. Erinnern Sie sich an die terminbasierten Optionsscheine auf Grundlage des Benzinpreises? Ähnliche <a href="https://www.spiegel.de/wirtschaft/unternehmen/termingeschaefte-befeuern-bitcoin-boom-a-1182136.html">Wetten</a> <a href="https://blog.goodaudience.com/bitcoin-futures-are-not-the-future-of-bitcoin-8769330ca3f5">werden derzeit</a> auf den Kurs des Bitcoin <a href="https://bitcoinfuture.com">abgeschlossen</a>. Wegen unkontrollierbar ausgelöster Hype-Zyklen und externer Effekte, die Anleger in vermeintlich sichere Häfen wie Edelmetalle oder Kryptowährungen investieren lassen, sinkt und steigt der Preis eines Bitcoins im Wochentakt; viele sprechen bereits davon, dass sie ihr Bitcoin-Guthaben als <strong>digitales “Gold”</strong> betrachten, als relativ immobile, Schwankungen unterliegende, aber dauerhaft wertbehaftete Geldanlage. Bei einer solchen Volatilität würde niemand auf die Idee kommen, sich sein Gehalt in Bitcoin auszahlen zu lassen — man wüsste ja nicht, ob der Lohn in einer Woche noch dazu reicht, um seine Miete in Euro bezahlen zu können.</p><p>Es sei denn, der Vermieter akzeptiert ebenfalls Bitcoin und bezahlt mit ihm seine Rechnungen. Dann entfällt nämlich das leidvolle <strong>Umrechnen</strong> in eine Referenzwährung; und das ist derzeit das größte Akzeptanzproblem von Kryptowährungen und Glasmurmeln: solange wir ihren Wert immer an anderen Werten orientieren, bleiben sie <strong>volatil</strong>. Das langfristige Ziel der Community lautet daher, die Akzeptanz von Bitcoin soweit zu stärken, dass die Kryptowährung ein akzeptiertes Zahlungsmittel wird. Ohne neue Ideen, Änderungen am Bitcoin-Protokoll und der Unterbrechung des digitalen Goldrauschs der Miner wird das nicht funktionieren.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*DRGFmNZS8maLrcgqZjJtBw.png" /></figure><h3>Anwendungen außerhalb der Token-Economy</h3><h4>» Bitcoin Cash</h4><p>Eine einfache Möglichkeit, Transaktionsraten von Bitcoin zu beschleunigen und die Kosten für eine einzige Transaktion zu senken, ist die<strong> Größe eines Blocks</strong> zu erhöhen: Die Komplexität der Hashsuche steigt nämlich nicht notwendigerweise proportional zur Blockgröße. Diese naheliegende Änderung im Bitcoin-Protokoll wurde neben anderen Vorschlägen erstmals im Rahmen des Segregated Witness <a href="https://github.com/bitcoin/bips/blob/master/bip-0091.mediawiki">(Segwit)-Proposoals BIP-91</a> vorgeschlagen und 2017 intensiv von der Community diskutiert. Das Ergebnis des darauf folgenden Disputs zwischen Minern war ein <strong>Hardfork</strong> der Bitcoin-Blockchain: da sich bei weitem nicht alle Teilnehmer an den vorgeschlagenen Änderungen beteiligen wollten, teilte sich Bitcoin am 1. August 2017 in zwei Lager.</p><p>Wer auf der <a href="https://btc.com/00000000000000000019f112ec0a9982926f1258cdcc558dd7c3b7e5dc7fa148">Blockhöhe 478559</a> ein Bitcoin-Guthaben hatte, wurde Zeuge einer wundersamen Geldverdoppelung mit ungewissem Ausgang: abhängig davon, welcher Blockchain man folgte, hatte man plötzlich den “echten” Bitcoin oder eine ab diesem Block davon unabhängige Währung namens <strong>Bitcoin Cash</strong> in seiner Wallet — aus einer Glasmurmel wurden plötzlich zwei! Dies ist der letzte gemeinsame Block auf <a href="https://blockchair.com/bitcoin/block/478558">Bitcoin</a> und <a href="https://blockchair.com/bitcoin-cash/block/478558">Bitcoin Cash</a>.</p><p>In diesem Augenblick konnte niemand voraussagen, welche der beiden in Zukunft ihren Wert erhalten würde. Wie im ursprünglichen Beispiel hängt es ja davon ab, ob einem der Bauer ein Ei für eine Murmel verkauft und welche der Murmeln er ab sofort akzeptiert. Viele Inhaber der neuen Währung versuchten in den darauf folgenden Tagen ihre Cash-Coins in Fiat zu tauschen und so sank der Kurs von “Bitcoin Cash” zunächst gegenüber dem Bitcoin stark, stabilisierte sich aber nach dem Platzen der ersten Kryptoblase Ende 2018 auf einem niedrigen Niveau.</p><p>Genau diese <strong>Stabilität</strong> macht Bitcoin Cash zu einer interessanten Alternative für den originären Bitcoin, denn die Transaktionszeiten und -kosten von Bitcoin Cash-Überweisungen sind unter anderem wegen einer Blockgröße von derzeit <strong>32 MB</strong> (Bitcoin: 1 MB) deutlich geringer als im Bitcoin-Netzwerk. Besser gesagt: sie wären es, wenn Bitcoin Cash die selbe Dominanz wie Bitcoin erreichen würde. Derzeit werden einfach zu wenige Transaktionen an das Hauptnetz herangetragen, um den Effekt nachvollziehen zu können. Fest steht jedoch: eine Bitcoin-Transaktion <a href="https://bitinfocharts.com/bitcoin/">kostet derzeit umgerechnet etwa 0,86 Dollar</a>, eine Bitcoin Cash-Transaktion lassen sich Miner nur <a href="https://bitinfocharts.com/bitcoin%20cash/">mit 0,0029 Dollar</a> vergüten.</p><p>Bitcoin Cash und andere <a href="https://www.investinblockchain.com/a-full-list-of-bitcoin-hard-forks/">Hardforks der Bitcoin Blockchain</a> haben in erster Linie das Ziel, die <strong>Praktikabilität</strong> von Bitcoin zu erhöhen, indem sie Blockgrößen und Mining-Regeln modifizieren. Das finden manche Miner natürlich weniger gut, weil sie nach einem Fork höchstwahrscheinlich Profite verlieren — was man sowohl verständlich als auch in Anbetracht der offensichtlichen Nachteile des aktuellen Bitcoin-Proktolls als egoistisch bewerten kann.</p><h4>» Lightning Network: Payment Channels für schnelle und kostenlose Off-Chain-Transaktionen</h4><p>Auch Bitcoin Cash leidet am intrinsischen Problem von Blockchains, die ihre Validierung über eine Verkettung von Hashes bis zum Ursprungsblock vornehmen: Sie können nur wachsen und nie vergessen.</p><p>Würden alle Bewohner des Planeten Erde Bitcoin als primäres Zahlungsmittel verwenden und sogar ihre Brötchen, Eier oder Kugeln Eis mit Kryptowährungen bezahlen, stieße jede Bitcoin-ähnliche Technologie zwangsläufig auf das selbe Problem: <strong>Skalierbarkeit</strong>. Ein paar clevere Köpfe kamen daher — inspiriert von Satoshis ursprünglichem Paper — auf die Idee, ähnlich wie im Bargeldverkehr kleine Transaktionen gar nicht auf der Blockchain selbst zu speichern, sondern sogenannte <strong>Payment-Channels</strong> dafür zu öffnen. Sie nennen es das <a href="http://lightning.network/docs/">Lightning-Netzwerk</a>.</p><p>Angenommen, Sie kaufen regelmäßig Eier beim Bauern ihres Vertrauens für einen relativ kleinen Betrag; warum sollte das die ganze Welt mitbekommen? Es wäre viel praktischer, wenn Sie und der Bauer <strong>ein eigenes Kassenbuch</strong> eröffnen, zu Beginn eine bestimmte Menge von Glasmurmeln auf ein von ihnen beiderseitig eröffnetes <strong>Pfandkonto</strong> einzahlen (hierfür ist das <a href="https://bitcoinelectrum.com/creating-a-multisig-wallet/">Multisignatur-Feature</a> der Bitcoin-Blockchain erforderlich, mit dem mehrere Parteien eine gemeinsam kontrollierte Adresse erzeugen können) und von dort ausgehend ihre individuellen Transaktionen abwickeln — jedes Mal, wenn Sie ein Ei kaufen, ziehen Sie ihrem Glasmurmelkonto eine Murmel ab und schreiben es dem Bauern gut, ohne dass die Welt das mitbekommt.</p><p>Die Anzahl der Glasmurmeln in diesem geschlossenen System bleibt immer gleich und ohne Zustimmung der jeweils anderen Partei können Sie keine Glasmurmeln aus dem System entnehmen. Damit innerhalb eines Payment-Channels Geld den Besitzer wechseln kann, signieren beide Teilnehmer jede Transaktion, der sie zustimmen, mit ihrem <strong>privaten Schlüssel</strong>. Kommt es zum Disput, kann jeder Teilnehmer des Channels den aktuellen Saldo (die “Balance”) des Channels zurück in die Blockchain schreiben und damit effektiv den Channel schließen und die Guthaben beider Seiten auf den letzten gemeinsam signierten Stand finalisieren. Im Lightning-Kontext wird dieser Vorgang gerne mit dem “<strong>Gang vor Gericht</strong>” illustriert: sobald es zum Disput kommt, trägt man die aktuellen signierten Kontostände der unbestechlichen globalen Instanz vor, die sie dann endgültig ins globale Kassenbuch überträgt. <a href="https://lightning.network/lightning-network.pdf">Diese Präsentation</a> illustriert recht anschaulich, wie das ganze im Bitcoin-Kontext technisch funktioniert.</p><p>Wenn jeder Teilnehmer mit vielen anderen Teilnehmern kleinteilige Payment-Kanäle öffnet, entsteht ein <strong>Netzwerk von individuellen Kassenbüchern</strong>, die alle durch die übergeordnete Währung Bitcoin gedeckt sind. Um mit einem beliebigen Teilnehmer im Lightning-Netzwerk Werte austauschen zu können, versucht das Protokoll zunächst, einen Pfad zwischen den beiden Beteiligten im Netzwerk zu finden. Existiert so ein Pfad, wird der gewünschte Wert über alle Knoten (“Hops”) geleitet, bis er am Ziel angekommen ist. Da diese Transaktionen nicht Bestandteil des globalen Ledgers sind, sondern alleine von den Signaturen der Teilnehmer abhängig sind, können sie <strong>deutlich schneller</strong> durchgeführt werden und bleiben<strong> frei von Transaktionskosten</strong>. Sie sind daher auch für <strong>Micropayment</strong>-Anforderungen geeignet. Um am Lightning-Netzwerk teilnehmen zu können, bedarf es <a href="https://github.com/lightninglabs/lightning-app">dedizierter Wallet-Clients</a> und <a href="https://github.com/lightningnetwork/lnd">Lightning-Nodes</a>, die Features wie Multisigs, private Signaturen und das Konzept der Payment-Channels unterstützen.</p><p>Ein anderer Nebeneffekt von Lightning ist seine Unabhängigkeit von der zugrunde liegenden Blockchain-Technologie, sofern sie Multisignaturen unterstützt. Wenn jemand einen Wert in der Alternativwährung Litecoin transferieren möchte, genügt es, den in Bitcoin umgerechneten Wert durchs Lightning-Netzwerk an ein Kanalende zu verschicken, das selbst eine Ursprungstransaktion in Lightcoin hält — die einzelnen Teilnehmer innerhalb des Netzwerks müssen dafür nichts über Lightcoin wissen.</p><h4>» Blockstack: Dezentrales Filesystem und im Ledger verankerte Identitäten</h4><p>Die vermeintlich aufregendste Anwendung von dezentralen Ledgern sind sogenannte <strong>Smart Contracts</strong>; das ist Code, der während des Mining-Prozesses automatisch ausgeführt wird und darin hinterlegte Geschäftsregeln anwendet. Bitcoin unterstützt dieses Verfahren grundsätzlich im Rahmen der Opcode-Schicht seiner Transaktionen, in Ermangelung einer verständlichen, ausdrucksvollen <strong>Programmiersprache</strong> und wegen der recht begrenzten Blockgröße sind solche Contracts aber im Bitcoin-Netzwerk derzeit nahezu bedeutungslos. Vielleicht benötigt man aber auch gar keine “dezentrale virtuelle Maschine”, die beispielsweise ein zentraler Bestandteil des konkurrierenden Ethereum-Ledgers ist. Um Applikationen schreiben zu können, die die Ergebnisse von <strong>dezentral ausgeführtem Code</strong> persistieren, genügt es eindeutig nachzuweisen, wer den Code ausgeführt hat (Identität) und was das Ergebnis der Ausführung war (Persistenz).</p><p>Seit 2013 arbeitet das New Yorker Startup <a href="https://blockstack.org/">Blockstack</a> an einer Infrastruktur, mit der sich solche <strong>dezentralen Apps</strong> (oder kurz dApps) realisieren lassen. Im Zentrum steht der an Bitcoin gebundene <strong>Blockstack Naming Service</strong>, mit dessen Hilfe Nutzer ein dezentrales Identitätsdokument (<strong>DID</strong>) mit Hilfe einer speziell für diesen Zweck generierten Wallet in einer Bitcoin-Transaktion verankern. Solange man seinen Key nicht verliert, kann man sich damit lebenslang eindeutig als Person ausweisen.</p><p>Um gegenüber Dritten die Glaubwürdigkeit der realen Identität zu verstärken (das kann je nach Anwendungsfall sinnvoll oder gefährlich sein), erlaubt Blockstack die Anreicherung der Identität mit <strong>sozialen Proofs</strong>: indem man z.B. einen <a href="https://twitter.com/stadolf/status/970693705568047104">speziellen Tweet</a> zu einer bestimmten Zeit absetzt, kann man gegenüber dem Protokoll nachweisen, dass man ein <strong>Twitter-Profil</strong> kontrolliert und somit halbwegs glaubwürdig nachweisen, dass man tatsächlich die Person ist, für die man sich ausgibt.</p><p>Der einfachste Weg, um mit seiner Identität zu interagieren, ist die ebenfalls <a href="https://browser.blockstack.org/">dezentrale Blockstack-App</a>. Lassen Sie sich von der augenscheinlich zentral gesteuerten Webseite im Browserfenster nicht täuschen: die Applikation selbst lässt sich völlig unabhängig von einem bei Blockstack beheimateten Server starten und interagiert potenziell autonom mit einem Bitcoin-Node. Meine persönliche Blockstack-Identität ist z.B. <a href="https://explorer.blockstack.org/name/stadolf.id">hier</a> öffentlich einsehbar und <a href="https://blockchair.com/bitcoin/transaction/d8ee766d5ae5881fbef5a75186c1317ea9b3c6f2a53de7e5bd2d13be44046e56">seit März 2018</a> in der öffentlichen Bitcoin-Blockchain verankert.</p><p>Sobald man über eine <strong>nachweisbare Identität</strong> verfügt, kann man sie dafür nutzen, sich gegenüber dezentralen Applikationen auszuweisen und sich bei ihnen anzumelden. Das hat einen gewaltigen Vorteil gegenüber den zentralen, “federated Logins” a la “<em>Login mit Facebook</em>”: Anmeldungen und Interaktionen innerhalb einer Applikation können nicht getracked werden und die von der Applikation gespeicherten Daten können nicht ohne Zutun des Anwenders mit einer dritten Partei geteilt oder zu anderen Zwecken analysiert werden. Blockstack nennt dieses Merkmal bildhaft “<strong>Applications that can’t be evil</strong>”.</p><p>Neben der Verankerung von Identität bietet die Blockstack-Platform unter der Bezeichnung “<em>Gaia-Hub</em>” einen <strong>dezentralen Storage-Layer</strong> an, der sich noch in der Testphase befindet. Sofern man dem Unternehmen selbst vertraut, kann man sich einfach an den verteilten Storage-Hub von Blockstack anschließen und kommt damit derzeit in den Genuss eines virtuell unendlich großen Speicherplatzes. Wer hingegen die vollständige Kontrolle über seine Daten behalten möchte, kann <a href="https://github.com/blockstack/gaia/tree/master/hub">selbst einen Gaia-Knoten betreiben</a>; derzeit werden Cloud-Dienste wie AWS S3, Azure Blob Storage und GCP unterstützt, man kann aber auch einfach das Filesystem eines Servers anschließen, dem man selbst vertraut. Alle Daten, die dezentrale Applikationen im Namen des Nutzers speichern, landen auf der vom Nutzer kontrollierten<strong> Gaia-Instanz</strong>. Der Missbrauch von Profildaten, geheimen Dateien, Fotos oder Nachrichten ist daher ausgeschlossen, sofern der vom Nutzer gewählte Speicherort nicht kompromittiert ist; obwohl dieses System weit von der Vorstellung eines vollständig verteilten Dateisystems wie z.B. <a href="https://ipfs.io/">IPFS</a> entfernt ist, bietet es mit einfach Methoden Sicherheit, Skalierbarkeit und Privatsphäre für dezentrale Applikationen.</p><p>Auf Grundlage von Identität und verteiltem Speicher lassen sich schließlich Applikationen programmieren, die im Browser des Nutzers laufen und dennoch über dezentrale Merkmale verfügen. Blockstack inzentiviert Entwickler mit seinem “<a href="https://app.co/mining">App-Mining</a>”-Programm. Das klingt nach Blockchain, hat aber nichts mit “Mining” zu tun: stattdessen wählt das Unternehmen selbst im Monatstakt Applikationen nach <strong>Beliebtheit und Funktionalität</strong> aus und vergütet ihre Entwickler mit Prämien bis zu 20.000 US-Dollar. Mittlerweile haben sich auf Grund dieses Anreizes über 250 Apps in den von Blockstack betriebenen AppStore <a href="https://app.co/blockstack">app.co</a> aufnehmen lassen und werden aktiv entwickelt. Ausgezahlt werden die Prämien in Form der Blockstack-eigenen Kryptowährung <strong>Stacks</strong> (STX).</p><p>Was zunächst nach einem Gag aus der Marketing-Abteilung klingt, ist das Resultat eines 2018 erfolgreich durchgeführten Token Sales, der langfristig Blockstacks Entwicklung finanzieren soll. Das Unternehmen veröffentlicht derzeit weitergehende Tools, darunter auch die LISP-ähnliche (und aus besonderen Gründen nicht Turing-vollständige) Smart Contract-Sprache <a href="https://blog.blockstack.org/introducing-clarity-the-language-for-predictable-smart-contracts/">Clarity</a>, mit der sich “echte” Smart Contracts auf der STX-Blockchain realisieren lassen.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*yradzmb7rw92xAl1gENHrw.png" /></figure><h3>Synopsis &amp; TL;DR</h3><p>Bitcoin ist derzeit gemessen an seiner Akzeptanz das nachweislich am besten funktionierende <strong>dezentrale Währungssystem</strong>, das keinerlei Kontrolle durch externe Parteien unterliegt. Dabei sind natürlich auch die systemischen Schwächen der Ledger-Technologie im Falle Bitcoin am sichtbarsten: Fragen zur Skalierbarkeit, Nutzbarkeit und hohen Transaktionsgebühren werden von Sekundärtechnologien bereits adressiert, sind aber noch längst nicht abschließend beantwortet.</p><p>Den durch intensiven, aber zum größten Teil überflüssigen <strong>Mining-Aufwand</strong> erzeugten Vorteil, ein nicht kompromittierbares System des Vertrauens zu sein, erkauft sich Bitcoin mit einem <strong>untolerierbaren ökologischen Fußabdruck</strong>, der sich nur durch Level-2-Technologien oder alternative Konsensverfahren auf ein erträgliches Maß reduzieren lässt.</p><p>Davon abgesehen ist Bitcoin ein verlässliches, weltweit funktionierendes Protokoll zum Austausch von Werten und zur Absicherung von Vertrauen — ein nicht zu unterschätzendes erstes Werkzeug auf dem Weg in eine dezentrale Zukunft, in der jeder mit jedem über alle Grenzen hinweg sichere Geschäfte abschließen und Verträge eingehen kann, ohne von Währungen, Regularien, Zöllen oder korrupten Institutionen eingeschränkt zu werden.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=fdd65bcb6560" width="1" height="1" alt=""><hr><p><a href="https://medium.com/t14g/das-bitcoin-prinzip-fdd65bcb6560">Das Bitcoin-Prinzip</a> was originally published in <a href="https://medium.com/t14g">t14g</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[10 Reasons to attend DEV DAY’19 (2019/05/25)]]></title>
            <link>https://medium.com/@stadolf/devday19-7864414116bc?source=rss-53cacc38e8a4------2</link>
            <guid isPermaLink="false">https://medium.com/p/7864414116bc</guid>
            <category><![CDATA[events]]></category>
            <category><![CDATA[developer]]></category>
            <category><![CDATA[hacker]]></category>
            <category><![CDATA[coding]]></category>
            <category><![CDATA[conference]]></category>
            <dc:creator><![CDATA[Stefan Adolf]]></dc:creator>
            <pubDate>Mon, 29 Apr 2019 14:53:16 GMT</pubDate>
            <atom:updated>2019-04-29T14:53:16.758Z</atom:updated>
            <content:encoded><![CDATA[<p>Open your calendars and mark the day: on May 25th (yes, that’s a Saturday!) we’re hosting DEV DAY for the 4th time (2nd in Berlin) and here are the 10 ultimate reasons why should join us :)</p><h3>Turbine Kreuzberg on Twitter</h3><p>🔊12 talks with live code &amp;amp; demos, 2 panel discussions, a #codingchallenge by @platformsh ,meet &amp;amp; greet with @blockstack @jolocom and @twilio and a lunch buffet🍴 in the beer garden of @Festsaal are waiting for you at #devday19 on 🗓️ May 25th! https://t.co/Xpx9r1EuXK 🇩🇪🇵🇹</p><h3>10. DEV DAY is about the art of coding and the every day life of developers, not dedicated to a certain topic</h3><p>You for sure have attended conferences that focus on a certain technical field, technology or tech stack, for example “kubernetes” (<a href="https://events.linuxfoundation.org/events/kubecon-cloudnativecon-europe-2019/">Kubecon</a>), “Golang” (<a href="https://www.gophercon.com/">GopherCon</a>) or <a href="https://events.google.com/io/">Google I/O</a>. DEV DAY is different: we explicitly <strong>don’t</strong> focus on a certain area but instead we want to host a conference according to our 2019 motto “<strong>Coding &amp; Beyond</strong>”. It doesn’t matter if you just jumped into the software development business or you are about to do so, whether you’re an experienced señor(a) developer or if you’re affiliated with programming in any other way, e.g. as scrum master, product owner, founder or agile coach: this is an event you want to attend for sure.</p><h3>9. Devs of all trades form a crowd of inspiring people in a great location</h3><p>DEV DAY’19 is not only dedicated to talks and presentations, it’s rather a one day platform event that we’re providing for anybody interested in coding. In practice that means that all talks are primarily given to inspire all attendees and discuss the concepts on site. The spaces that we chose to host DEV DAY will give everyone enough room to go beyond the talk and discuss aspects of it with speakers and attendees afterwards.</p><p>DEV DAY in Berlin is hosted in the spacious event area of <a href="https://festsaal-kreuzberg.de/"><strong>Festsaal Kreuzberg</strong></a> which you might know from the last music gig you might have attended in Berlin. We have booked the large event space (not the music stage ;) ) on the western side of the building, have reserved a large room for our live video stream with Faro, kept one large room free for our coding challenge attendees and you can use the large beer garden area to get in touch with other people and discuss things without disturbing others.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*LvOntLLxqxcAQebcZs5IGg.jpeg" /><figcaption>Festsaal Kreuzberg (the boxes will be moved away of for DEV DAY ;) )</figcaption></figure><p>In <strong>Faro</strong> the event will again be hosted by the local Turbine Kreuzberg subsidiary, which until then will have gained a lot of new space (be surprised where that’ll be ;) ). It comes with a large auditorium and a dedicated speaker’s stage, a whole basement area that hosts our coding challenge and the Berlin live stream, as well as a cozy street site for networking.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kbCoywRmPD-JfzAtugJWAg.jpeg" /><figcaption>the Turbine Kreuzberg office in Faro / Portugal</figcaption></figure><p>Besides the 12 talks we’re also hosting two <strong>panel discussions</strong> during the lunch break where we’re inviting all speakers, sponsors and even some very special guests to the stage to discuss two highly relevant developer topics and want to dig deeper into the “beyond” part of this year’s claim.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*LgIUZy2FXKbQJiKYHuXOHA.jpeg" /><figcaption>Panel discussion 2018 in Berlin</figcaption></figure><h3>8. Feel the spirit of the Algarve, even when you are in Berlin</h3><p>The idea of DEV DAY started back in 2016, when Turbine Kreuzberg’s Faro office hosted it for the first time. We’ve learnt a lot since then, e.g. about the preferred spirit we want to live and promote during our DEV DAYs. 2019 will be the second year that we’re hosting DEV DAY in Berlin and we want to give everybody the chance to take part in both conferences.</p><p>We therefore stream all the talks (and even the moderation) <strong>live on Youtube </strong>in a dedicated room and if you like, you can get in touch with the audiences and speakers at the other site with video chats in real time.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*U5Mpf92oQ1dlXJQUhoyoyw.jpeg" /><figcaption>The Berlin audience watches the Faro live stream 2018</figcaption></figure><p>Here’s a preview how talks look like when they’re streamed:</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FQc_Ae_Ps-zk%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DQc_Ae_Ps-zk&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FQc_Ae_Ps-zk%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/2a2ef8bc066fef3f58465333b7f49371/href">https://medium.com/media/2a2ef8bc066fef3f58465333b7f49371/href</a></iframe><h3>7. We’ve got 12 great talks and they all “fight” for the Best Speaker Award</h3><p>Lets face it: every speaker at a conference has already taken away a grand prize! Taking the stage earns you a lot of positive karma provided by your audience. You have 30 minutes to illustrate your ideas, to show what you love most, to push your ideas into the minds of more than 100 people hanging on your lips.</p><p>But out of a DEV DAY tradition we’re taking this one step further and print a memorable “<strong>Best Speaker Award</strong>” on site with our 3D printers. After the last stage has been taken and the virtual curtain has fallen, our audience will vote for the “best speaker” they experienced that day. If everything runs good, she can take home the freshly printed trophy right away.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Hoeyz0mSAfS_Lzg3TnC6hA.jpeg" /><figcaption>it’s a Turbine, yes. But 2019 it will be something different, sorry ;)</figcaption></figure><p><strong>2019’s talk topics include</strong></p><p><em>directly craft related topics</em></p><ul><li>frontend development 2020: what’s on your stack?</li><li>UX is kind. UX is smart. UX is emotion</li><li>Tick Tock. What the Heck is Time-Series data?</li><li>Unity Audio — making the best of what it’s got</li><li>Writing compilers in Javascript using ANTLR</li></ul><p><em>upcoming technologies</em></p><ul><li>How machine learning is used in processing text (ML)</li><li>Current trends in NLP for finance (ML/NLP)</li><li>Things can talk in our office (IoT)</li><li>Adding Decentralized IDs and User-Owned Storage to a React App (Blockchain / DLT)</li></ul><p><em>“soft” topics / how to improve your coder’s life</em></p><ul><li>Egoless Programming</li><li>How to promote the culture of learning</li><li>Do you have a minute? Why a CPU does not bother you but you maybe should</li></ul><p>You can find the complete talk agenda including all the speakers’ profiles <a href="https://devday.io/talks">on our agenda page</a>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*N55c0Barbp5ntSZBs257ag.jpeg" /><figcaption>Ryan went home with the Best Speaker Award in Berlin 2018</figcaption></figure><p>And did we say that we printed extraordinarily rememberable name tags exclusively for our speakers?</p><h3>Stefan Judis on Twitter</h3><p>Just received my badge for @turbinekreuzbrg&#39;s devday in a few weeks and it&#39;s a save icon. 👌👌👌 Now, I only have to remember to bring it with me. 🙈</p><h3>6. Nonsense, recruiters and bad manners stay outside</h3><p>Some talks you might have attended at other conferences have been solely given to promote a certain kind of product. While every speaker will have her own catch on the decision between “advertisement” and “show an amazing piece of technology”, we told all our speakers to concentrate on the <strong>practical parts</strong>. So every (tech related) talk will come either with at least 1 line of code or dedicated demos that illustrate what has been said.</p><p>That also holds true for what our sponsors will contribute to the whole thing: <a href="https://www.twilio.com">Twilio</a> (the company behind <a href="https://sendgrid.com/">Sendgrid</a>, if you know that one better) will demonstrate their cross-channel messaging stack that enables complex message driven usage scenarios. <a href="https://blockstack.org/">Blockstack</a> shows off their amazing decentralized application building toolchain, related services and its <a href="https://app.co/mining">app mining</a> program that allows you to earn money by writing useful apps. Finally, <a href="https://jolocom.io/">Jolocom</a> will be there to answer all questions on how you can use their implementation of the uprising <a href="https://jolocom.io/wp-content/uploads/2018/10/Self-sovereign-Identity-_-Blockchain-Bundesverband-2018.pdf">self sovereign identity technology</a> to identify and interact with user profiles without sharing all the users’ details — a game changing technology that might affect all our lives in the future.</p><p>Naturally, we’d like to encourage everybody to join us at DEV DAY, regardless of any diversity issues that might apply to them. We are committed to providing a friendly, safe and welcoming environment for all, regardless of gender, sexual orientation, ability, ethnicity, socioeconomic status and religion (or lack thereof). By attending DEV DAY every participant implicitly agrees to our <a href="https://devday.io/code-of-conduct"><strong>Code of Conduct</strong></a><strong> </strong>and everybody will be aware of the consequences when not obeying its rules. Nobody should have to be concerned about harassment or bad behaviour at any time. It’s very sad that these — actually obvious — rules of human interaction have to be mentioned in such a long paragraph, but we’re very well aware that this still might be an issue.</p><h3>5. Batteries included + a special childcare offering</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*6BLJ7xd4CswdrtbOqKJf5w.jpeg" /></figure><p>Thanks to all our sponsors we’ve got a little more financial freedom in terms of food options and amenities, so be prepared for healthy and tasty choices on the DEV DAY lunch menu! We’ll also serve pretzels, croissants and coffee as strong as Batman in the morning. And of course all (soft) drinks are on us as well.</p><p>In case your offspring holds you back from joining DEV DAY, we have negotiated <a href="https://devday.io/childcare">a special offer with a dedicated child care service in Berlin</a>. Since we’re not as large as e.g. <a href="https://2019.jsconf.eu/news/childcare/">jsconf.eu</a> (but we’re coming!!) we unfortunately cannot afford onsite child care yet, but feel free to checkout the private offer discount and all details for individual child care that day <a href="https://devday.io/childcare">here</a>.</p><h3>Daniel Fahlke on Twitter</h3><p>Childcare at conferences and events. Would you make use of it, when it is available?</p><h3>4. Our sponsors are 100% dedicated to software development and its community</h3><p><a href="https://www.twilio.com/">Twilio</a>, <a href="https://jolocom.io">Jolocom</a>, <a href="https://blockstack.org/">Blockstack</a> and <a href="https://platform.sh/">platform.sh </a>are all dedicated companies offering services and applications to make the life of developers easier and more delightful. They support local communities with event sponsoring, they contribute to open source projects and they support local meetup hosts as much as they can. We think they’re the perfect backup for a developer centric conference that DEV DAY always wanted to be.</p><p>As the main sponsor, initiator and company behind DEV DAY, we’re proud to announce <strong>Turbine Kreuzberg</strong> as our very special event partner. You might have guessed that most of the organizational effort we’re undertaking for DEV DAY has been paid by them. But DEV DAY is far more than a “Turbine” event: as a technical agency that builds b2b commerce solutions and enterprise marketplaces for a living, Turbine always strives to learn about new technologies and find inspiring people willing to push the boundaries of their tech stack.</p><p>Turbine Kreuzberg wants to establish a “playground”, a room for digital innovation to leverage the ideas of communities together with their members. Turbine therefore invests in technical events and local meetup groups (e.g. the newly founded “coding earth” association that currently powers meetups in Germany and Portugal).</p><h3>3. We’re supporting open source projects &amp; we mean it.</h3><p>Before putting them on our website, we asked many developers which open source projects they would love to have supported. And they really came up with many of them. After a voting session with around 30 people, we decided to support these three (+1) very well known initiatives officially with DEV DAY’19. If you want to join us in supporting them, you can do so by adding an arbitrary amount to your DEV DAY ticket.</p><h4><a href="https://my.fsf.org/donate"><strong>FreeSoftware Foundation</strong></a></h4><blockquote>Your support makes the Free Software Foundation’s work possible. Will you power up the free software movement with a donation today? We use these funds to help us defend the freedoms and rights of all computer users, to nurture the GNU Project, to certify freedom-respecting electronics, and to battle the practice of Digital Restrictions Management.</blockquote><h4><a href="https://donate.openstreetmap.org/">OpenStreetMap</a></h4><blockquote>OpenStreetMap is the largest open geographic database in the world, the data infrastructure for multitudes of mapping projects around the globe. <strong>Your donation to the OpenStreetMap Foundation will cover our core operational expenses in supporting the OpenStreetMap project</strong>: hardware costs, legal fees, administrative assistant and other expenses of our working groups and administration.</blockquote><h4><a href="https://numfocus.org/">NumFocus</a></h4><blockquote>NumFOCUS envisions an inclusive scientific and research community that utilizes actively supported open source software to make impactful discoveries for a better world. Your donation helps bring this vision to life!</blockquote><p>and, more likely known to our Faro attendees:</p><h4><a href="http://milage.ualg.pt/">Faro Open Source / Milage+</a></h4><blockquote>The University of Algarve developed the MILAGE LEARN+ app in the course of an ERASMUS + project to foster mobile learning and motivate students to innovative pedagogical learning models more appropriate to the needs of today’s students. Its pedagogical model includes gamification to motivate students, self-assessment and peer evaluation to promote autonomy and different learning styles and ensure that all students have access to a quality common knowledge.</blockquote><h3>2. An all day Coding Challenge: You asked for it, you get it!</h3><p>If you attended <a href="https://devday.io/2018">DEV DAY 2018</a>, you might have checked out the coding challenge that we ran during the day. It has been mainly built around some algorithmic puzzles we chose on <a href="https://www.hackerrank.com/dashboard">hackerrank</a> and we heard that some of you really liked the idea. For 2019 we came up with something even greater.</p><p>Thanks to our partnership with platform.sh we’re presenting you a unique chance to collaborate on something bigger: let’s build a website dedicated to developer news and interesting artifacts — together, using platform.sh’s unique language agnostic PaaS tooling.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*n2yYlr8zjUtFFahfpmx_rg.jpeg" /><figcaption>People scratching their heads on 2018’s coding challenge</figcaption></figure><p>Ahead of DEV DAY, we’re setting up the website’s scaffold and git repos and it’s up to you to fill the site with life. Choose from Go, Node.js, Python, Ruby or even PHP to write micro services which contribute to a collaboratively built website and run dedicated micro applications on the platform.sh monorepo stack. It’s totally up to you what kind of service widget you build, but here are some ideas for your inspiration:</p><ul><li>display all meetups within a certain radius</li><li>show an event calendar for developer events</li><li>seek “#php vs #golang”, “#react vs #vuejs”, “#blockchain vs #hashgraph“ on Twitter and display a dashboard of total tweet counts</li><li>parse news sites to show the latest developer related news</li><li>fetch images with hashtag #devday19 on Instagram / the daily xkcd and rotate them in your widget</li></ul><p>All participants of our coding challenge will take home some <strong>very</strong> memorable and living(!) item that stands out of all takeaway goodies you might get that day.</p><h3>1. You’ll leave the location with a smile on your face</h3><p>The feedback we received last year was really nice. Since DEV DAY is still quite a small conference for like minded people, the networking ratio and the amount of personal talks and get-togethers is so high that it feels more like a class reunion than a real conference. You’ll have the chance to get in touch with sponsors and speakers directly, you can contribute ideas during the event, find new friends or colleagues to (maybe!) found your next company — and of course you won’t go home with your <strong>very own DEV DAY’19 t-shirt</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*rNQsHzG2iGhzXEzFy1bZ6g.jpeg" /><figcaption>Everybody seemed to be super happy last year.</figcaption></figure><p>Here are some quotes we heard last year:</p><blockquote>It was one of the best conferences I’ve ever been to. The idea of the challenge was really great :+1:</blockquote><blockquote>Thank you guys for organizing this awesome event for the algarve community. You guys rock.</blockquote><blockquote>You guys are amazing! From what I see as a visitor of your event I was really impressed. This is a great event and gives this for free to the community makes me want to say thank you to each of one of you at Turbine and make me want to work with you guys! I think in this area creativity and people are the best asset you can have and you are the kind of company that validates that and I am happy to see that. I will send also an email just to say thank you and maybe in future, we can do something together.</blockquote><h3>Wrapup / tl;dr / pricing</h3><p>Considering the amount of content DEV DAY’19 has in charge for you, we think that €20 (reduced offering for students are €8) are a ridiculously low admission fee for a conference. If you still are unsure if you want to spend them, ask me for a special promotion code and give me a good creative reason to provide one for you (e.g. “<em>I’m freelancer on Wordpress and my customer doesn’t pay on time</em>” or “<em>I can’t find a job because everyone considers me overqualified</em>” or “<em>I invest all my money into a revolutionary new CO2 sucking device that’ll save planet earth</em>”).</p><p>Here are the perks in short. By attending DEV DAY’19 you get:</p><ul><li>12 talks</li><li>2 panel discussions</li><li>free breakfast, lunch &amp; beverages</li><li>a coding challenge you can use to prove your collaborative coding skills</li><li>a chance to meet up with up to 250 likeminded coders and make new friends</li><li>a super nice DEV DAY’19 t-shirt</li><li>a chance to meet me in person :)</li><li>a good time killer for your lazy Saturday with huge opportunities to learn something new for a ridiculously low price tag.</li></ul><p>That’s all, folks, now get your ticket for Berlin:</p><p><a href="https://www.eventbrite.de/e/dev-day-2019-berlin-tickets-55522555458">DEV DAY 2019 BERLIN</a></p><p>or Faro:</p><p><a href="https://www.eventbrite.de/e/dev-day-2019-faro-pt-tickets-57505152459">DEV DAY 2019 FARO (PT)</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=7864414116bc" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>