<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Radix</title>
    <description>The latest articles on DEV Community by Radix (@radixdlt).</description>
    <link>https://dev.to/radixdlt</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F110286%2F04788f8a-05f6-4fb6-a942-2dc83f7b1e68.png</url>
      <title>DEV Community: Radix</title>
      <link>https://dev.to/radixdlt</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/radixdlt"/>
    <language>en</language>
    <item>
      <title>Java Client Library - General Use Code Examples</title>
      <dc:creator>Radix</dc:creator>
      <pubDate>Mon, 23 Sep 2019 12:47:20 +0000</pubDate>
      <link>https://dev.to/radixdlt/java-client-library-general-use-code-examples-1986</link>
      <guid>https://dev.to/radixdlt/java-client-library-general-use-code-examples-1986</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;Let's review some code examples on how to handle generic tasks:&lt;/p&gt;

&lt;p&gt;-&lt;a href="https://docs.radixdlt.com/radixdlt-java/examples/code-examples/general-use#initializing-a-universe"&gt;Initializing a Universe&lt;/a&gt;&lt;br&gt;
-&lt;a href="https://docs.radixdlt.com/radixdlt-java/examples/code-examples/general-use#initializing-the-dapp-api"&gt;Initializing the Application API&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Tip: if you're new to our Java library, we suggest you begin with our Get &lt;a href="https://docs.radixdlt.com/radixdlt-java/guides/getting-started"&gt;Started guide&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Initializing a Universe
&lt;/h1&gt;

&lt;p&gt;A Universe is an instance of a Radix Distributed Ledger which is defined by a genesis atom and a dynamic set of unpermissioned nodes forming a network.&lt;/p&gt;

&lt;h2&gt;
  
  
  Available networks
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Network&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LOCALHOST_SINGLENODE&lt;/td&gt;
&lt;td&gt;A locally hosted single node connection.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A single node Betanet connection.&lt;/td&gt;
&lt;td&gt;A single node Betanet connection.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A predefined configuration to bootstrap into the LOCALHOST_SINGLENODE network is available:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;BootstrapConfig config = Bootstrap.LOCALHOST_SINGLENODE;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Initializing the Application API
&lt;/h1&gt;

&lt;p&gt;The Radix Application API is a client-side API exposing high-level abstractions to make DApp creation easier.&lt;/p&gt;

&lt;p&gt;To initialize the API:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;RadixApplicationAPI api = RadixApplicationAPI.create(Bootstrap.BETANET, identity);&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To continually sync and pull from the network ledger on your account:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Disposable d = api.pull();&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To stop syncing:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;d.dispose();&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Join The Radix Community
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://t.me/radix_dlt"&gt;Telegram&lt;/a&gt; for general chat&lt;br&gt;
&lt;a href="https://discord.gg/7Q7HSZZ"&gt;​Discord&lt;/a&gt; for developers chat&lt;br&gt;
&lt;a href="https://reddit.com/r/radix"&gt;​Reddit&lt;/a&gt; for general discussion&lt;br&gt;
&lt;a href="https://forum.radixdlt.com/"&gt;Forum&lt;/a&gt; for technical discussion&lt;br&gt;
​&lt;a href="https://twitter.com/radixdlt"&gt;Twitter&lt;/a&gt; for announcements&lt;br&gt;
&lt;a href="https://radixdlt.typeform.com/to/nyKvMV"&gt;​Email&lt;/a&gt; newsletter for weekly updates&lt;br&gt;
Mail to &lt;a href="//hello@radixdlt.com"&gt;hello@radixdlt.com&lt;/a&gt; for general enquiries&lt;/p&gt;

</description>
      <category>java</category>
      <category>blockchain</category>
      <category>tutorial</category>
      <category>dlt</category>
    </item>
    <item>
      <title>Java Client Library - introduction</title>
      <dc:creator>Radix</dc:creator>
      <pubDate>Wed, 04 Sep 2019 12:22:57 +0000</pubDate>
      <link>https://dev.to/radixdlt/java-client-library-introduction-3i4b</link>
      <guid>https://dev.to/radixdlt/java-client-library-introduction-3i4b</guid>
      <description>&lt;h1&gt;
  
  
  Java client library
&lt;/h1&gt;

&lt;p&gt;The developers guide to building on the Radix Network with the Java client library&lt;/p&gt;

&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;A Java client library for interacting with a &lt;a href="https://www.radixdlt.com/"&gt;Radix&lt;/a&gt; Distributed Ledger.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: this library and the network itself are currently in Beta development phase. Please report any issues in the &lt;a href="https://github.com/radixdlt/radixdlt-java/issues"&gt;GitHub issue tracker&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Features
&lt;/h1&gt;

&lt;p&gt;-Connect to the Betanet test network&lt;br&gt;
-Fee-less transactions for test networks&lt;br&gt;
-Public Key Identity Creation&lt;br&gt;
-Token Creation (ERC-777 style)&lt;br&gt;
-Message sending&lt;br&gt;
-RXJava 2 based&lt;br&gt;
-Utilizes JSON-RPC over WebSockets&lt;/p&gt;
&lt;h1&gt;
  
  
  Gradle
&lt;/h1&gt;

&lt;p&gt;Include the following Gradle dependency:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;repositories {
    maven { url 'https://jitpack.io' }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dependencies {
    implementation 'com.radixdlt:radixdlt-java:dbfd5064e5'
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  Join The Radix Community
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://t.me/radix_dlt"&gt;Telegram&lt;/a&gt; for general chat&lt;br&gt;
&lt;a href="https://discord.gg/7Q7HSZZ"&gt;​Discord&lt;/a&gt; for developers chat&lt;br&gt;
&lt;a href="https://reddit.com/r/radix"&gt;​Reddit&lt;/a&gt; for general discussion&lt;br&gt;
&lt;a href="https://forum.radixdlt.com/"&gt;Forum&lt;/a&gt; for technical discussion&lt;br&gt;
​&lt;a href="https://twitter.com/radixdlt"&gt;Twitter&lt;/a&gt; for announcements&lt;br&gt;
&lt;a href="https://radixdlt.typeform.com/to/nyKvMV"&gt;​Email&lt;/a&gt; newsletter for weekly updates&lt;br&gt;
Mail to &lt;a href="//hello@radixdlt.com"&gt;hello@radixdlt.com&lt;/a&gt; for general enquiries&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>java</category>
      <category>beta</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Scaling DLT to over 1M TPS on Google Cloud</title>
      <dc:creator>Radix</dc:creator>
      <pubDate>Fri, 30 Aug 2019 14:07:32 +0000</pubDate>
      <link>https://dev.to/radixdlt/scaling-dlt-to-over-1m-tps-on-google-cloud-11d8</link>
      <guid>https://dev.to/radixdlt/scaling-dlt-to-over-1m-tps-on-google-cloud-11d8</guid>
      <description>&lt;p&gt;Radix achieves a record-breaking 1.4 million financial transactions per second using just $700 of Google Cloud infrastructure. The test, which replayed 10 years of Bitcoin transactions history in less than an hour, was done on 1,187 Google servers, spread across 17 countries.&lt;/p&gt;

&lt;p&gt;To put this result into context, it’s almost 17x greater than the maximum transactional throughput of the entire &lt;a href="https://www.visa.gr/dam/VCOM/download/corporate/media/visanet-technology/aboutvisafactsheet.pdf"&gt;Visa network&lt;/a&gt;, over 4x greater than &lt;a href="https://twitter.com/alipay/status/929123909970153472?lang=en-gb"&gt;Alipay’s highest throughput ever&lt;/a&gt;, and more than 2x WhatsApp’s &lt;a href="https://www.weforum.org/agenda/2018/03/internet-minute-whatsapp-facebook-emails/"&gt;average number of messages sent per second&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This post outlines how we achieved this result, a description of Radix’s underlying technology, how we conducted the test, and how we used Google Cloud Platform (GCP).&lt;/p&gt;

&lt;p&gt;If you would like to re-create the test or use any of the tooling, all the relevant code is available here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/radixdlt/mtps"&gt;https://github.com/radixdlt/mtps&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What was the purpose of this test?
&lt;/h2&gt;

&lt;p&gt;The birth of the internet required creating a set of protocols (TCP, UDP, etc.) that allowed computers to be networked together to make a public, permissionless commons for businesses and individuals to connect from anywhere in the world.&lt;/p&gt;

&lt;p&gt;The recent explosion of public, permissionless Decentralised Ledger Technologies (e.g. Bitcoin and Facebook Libra) represent the next phase of digitising the global economy: a public infrastructure that can hold, transfer and program money, assets and rights.&lt;/p&gt;

&lt;p&gt;However, the internet’s protocols only carry information; they do not store the information once transmitted. Additionally, the protocol doesn’t care if that information is duplicated and sent to thousands, millions or billions of people. &lt;/p&gt;

&lt;p&gt;To create digital money however, you must be able to guarantee that the funds cannot be copied — e.g. you’re prohibited from sending the same digital dollar to two different people. To prevent this from happening, the system must have a constantly updated record of who owns what. &lt;/p&gt;

&lt;p&gt;Using a centralised service to host such a record is not too tricky. However, making public, permissionless money without using a central server is considerably more challenging. And making this money simultaneously usable for the entire world is an even greater challenge.&lt;/p&gt;

&lt;p&gt;The biggest problem that Radix set out to solve: how do you build a protocol for the creation of digital money that could work for over 7.5 billion people and 500 billion devices simultaneously? This test was the first step on the journey to validating that our technology can scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is DLT (Distributed Ledger Technology)?
&lt;/h2&gt;

&lt;p&gt;DLT is a general term that covers blockchain technologies including &lt;a href="https://bitcoin.org/"&gt;Bitcoin&lt;/a&gt; and &lt;a href="https://www.ethereum.org/"&gt;Ethereum&lt;/a&gt;, DAG (directed acyclic graph) technologies including &lt;a href="https://www.iota.org/"&gt;IOTA&lt;/a&gt; and &lt;a href="https://www.hedera.com/"&gt;Hashgraph&lt;/a&gt;, and new architectures such as Tempo. Tempo is the architecture that Radix developed specifically to achieve the massive scalability and throughput needed for a DLT to be used for mainstream applications.&lt;/p&gt;

&lt;p&gt;A DLT network is characterised by a shared record system that can be updated by all the computers in the network without causing conflicting entries in a shared ledger. This is often used for transactional systems, since it’s well-suited for stopping the same funds from being spent twice and it can also enforce more complex systems of rules, often referred to as “smart contracts.”&lt;/p&gt;

&lt;h2&gt;
  
  
  How is the Radix DLT architecture different?
&lt;/h2&gt;

&lt;p&gt;To build a linearly scalable transactional system, it was first necessary to think carefully about how to shard the Radix ledger. It is often not a good idea to dynamically shard data in distributed, decentralised systems due to the coordination overhead.A neater solution is to create a static shard range and then have a deterministic map of the data to the available shards.&lt;/p&gt;

&lt;p&gt;On Radix, your wallet address deterministically maps you to the shard that your funds and transaction information lives on. As a result, there is no need for a global state —just shard level state.&lt;/p&gt;

&lt;p&gt;Any computer may join the network and become a “Node.” These Nodes may service as many or as few shards as their local resources (CPU/RAM/Storage) allow. While a Node may vary the number of shards that it serves, the total number of shards in a Radix network is always 18.4 quintillion shards (2^64).&lt;/p&gt;

&lt;p&gt;Nodes operating the same shards are redundant to each other, meaning that they validate the same set of transactions and are in consensus with each other. A transaction is typically validated in at least two different shards: the shard of the source address (a.k.a. Sending wallet) and the shard range of the destination address (e.g. receiving wallet). &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hP5XbhL3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.radixdlt.com/wp-content/uploads/2019/08/pasted-image-0-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hP5XbhL3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.radixdlt.com/wp-content/uploads/2019/08/pasted-image-0-1.png" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This illustration above exemplifies the shard range configuration on Radix, with the green vertical lines indicating the static shard space, and the horizontal lines representing the Nodes and the amount of the shard space each is servicing.&lt;/p&gt;

&lt;p&gt;To learn more about how this works in practice, please see this short video &lt;a href="https://youtu.be/u0GyEYvK7EI"&gt;on sharding on Radix.&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How was Radix DLT deployed on Google Cloud?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Test Scenario
&lt;/h3&gt;

&lt;p&gt;1187 Nodes (VMs running the Radix ledger) are split up over 17 Google Cloud zones (data centers).&lt;/p&gt;

&lt;p&gt;During the test, each Node was configured to have a low amount of shard overlap with each other. We did this by cutting the available shards (2^64) into chunks of 2^44 shards. We then allocated Nodes evenly across these chunks. Shards serviced by a Node are called the Node’s “Shard Range.” During the test, each Node Shard Range had approximately 10% overlap with the Node Shard Range of its neighbouring Nodes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YrmWpFEH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.radixdlt.com/wp-content/uploads/2019/08/unnamed-24.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YrmWpFEH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.radixdlt.com/wp-content/uploads/2019/08/unnamed-24.png" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This test scenario was tailored to achieve maximum network throughput as cost-effectively as possible. In a production network, we would expect each shard to be covered by at least 100 different nodes. This would make little difference to the throughput, but would substantially increase testing costs.&lt;/p&gt;

&lt;p&gt;During the test, the Nodes ‘gossip’ with each other to exchange transactional information and metadata (over UDP). In a Radix network, each Node is Gossiping (on average) to eight random peers; the dissemination complexity is thus O(8n) as explained &lt;a href="https://youtu.be/9kPyyOIn6Bo"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Notes on Network Conditions
&lt;/h3&gt;

&lt;p&gt;Where feasible, we wanted to create a test scenario that models a public network. This includes:&lt;/p&gt;

&lt;p&gt;-Using only public IP addresses&lt;br&gt;
-Having a geographically distribution of Nodes&lt;/p&gt;

&lt;p&gt;The fundamental bottleneck between continents is still the speed-of-light, making packet latencies moderately representative. However, it should also be noted that during the test, the Gossipped transactions never left Google’s high-performance network, and this reduces packet latencies between Nodes.&lt;/p&gt;

&lt;p&gt;Under normal operations there is no packet loss within Google’s networks. It is estimated that normal packet loss on the internet is below 3%; which will reduce the efficiency of the Radix main network by about the same amount compared to these tests.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Explorer Node
&lt;/h3&gt;

&lt;p&gt;The Explorer Node scrapes and aggregates metrics and data from all other Nodes. The most significant service hosted on the Explorer Node is the &lt;a href="https://github.com/radixdlt/mtps/tree/master/explorer"&gt;Explorer Service&lt;/a&gt;, which &lt;a href="https://www.radixdlt.com/test/"&gt;serves the UI&lt;/a&gt; and provides a metrics API. Radix maintains a public version of Explorer at: &lt;a href="https://test.radixdlt.com/"&gt;https://test.radixdlt.com/&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Dataset Preparator Node
&lt;/h3&gt;

&lt;p&gt;The Dataset Preparator Node converts Bitcoin’s transactional data into Radix compatible transactional data so that it can be replayed across the Radix network. The process is very CPU and I/O intensive which is why we chose to host it separately.&lt;/p&gt;

&lt;p&gt;This function is made up of two services we built for this purpose:&lt;/p&gt;

&lt;p&gt;-&lt;a href="https://en.bitcoin.it/wiki/Bitcoind"&gt;bitcoind&lt;/a&gt;&lt;br&gt;
-&lt;a href="https://github.com/radixdlt/mtps/tree/e324f7f302a7950d30b49009e5d8350f40140662/millionaire-dataset-preparator"&gt;millionaire-dataset-preparator&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Tooling
&lt;/h3&gt;

&lt;p&gt;Each optimised test run costs around $700. In order to cut down the run-time of the VMs, we decided to create a custom &lt;a href="https://github.com/radixdlt/mtps/blob/master/tools/packer/core-image-template.json"&gt;Ubuntu 16.04 image&lt;/a&gt;, with the Radix Core dependencies installed (Docker). We used &lt;a href="https://packer.io/"&gt;packer&lt;/a&gt; for this, which worked well in GCE.&lt;/p&gt;

&lt;p&gt;The remaining provisioning of the Core VMs was done during initial boot through &lt;a href="https://cloudinit.readthedocs.io/en/latest/"&gt;cloudinit&lt;/a&gt;. This tool may be less well known to the everyday (Google) Cloud user, but we love it because it enables us to use the same provisioning script for any cloud provider that supports it (which they almost all do). &lt;/p&gt;

&lt;p&gt;We used the configuration management tool  &lt;a href="https://libcloud.apache.org/"&gt;libcloud&lt;/a&gt; in this project. It provides python APIs and is a direct alternative to the &lt;a href="https://cloud.google.com/sdk/"&gt;Google Cloud SDK&lt;/a&gt; (aka “gcloud”). We switched to libcloud when our shell-scripts (using gcloud) became too complex for us to maintain. An additional advantage of using libcloud over gcloud is that we could opt-in the python &lt;a href="http://www.paramiko.org/"&gt;paramiko&lt;/a&gt; SSH client, which —unlike gcloud — supports (&lt;a href="https://ttmm.io/tech/yubikey/"&gt;indirectly&lt;/a&gt;) SSH keys authentication using Yubikeys. &lt;/p&gt;
&lt;h2&gt;
  
  
  How Google Cloud helped Radix DLT to reach 1M TPS?
&lt;/h2&gt;

&lt;p&gt;To make things simple, we built a custom &lt;a href="https://github.com/radixdlt/mtps/blob/master/tools/libcloud/mtps.py"&gt;mtps.py&lt;/a&gt; python script that does all the node setup in a single invocation. This is the flowchart of the mtps.py tool. This script is idempotent, meaning that it will skip through the already created components. &lt;/p&gt;

&lt;p&gt;The “Boot Node” is an ordinary Core Node. It’s started first, so that it can provide a concrete IP address for the other Nodes to connect to.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kOCWWFm_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.radixdlt.com/wp-content/uploads/2019/08/unnamed-25.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kOCWWFm_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.radixdlt.com/wp-content/uploads/2019/08/unnamed-25.png" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Pre-requisites
&lt;/h3&gt;

&lt;p&gt;1.You need to have a &lt;a href="https://cloud.google.com/"&gt;Google Cloud&lt;/a&gt; account&lt;br&gt;
2.&lt;a href="https://libcloud.readthedocs.io/en/latest/compute/drivers/gce.html"&gt;Configure libcloud&lt;/a&gt; to use your Google Cloud account&lt;br&gt;
3.Install libcloud and paramiko with:&lt;br&gt;
pip3 install —user apache-libcloud paramiko cryptography &lt;br&gt;
4.Start an interactive python terminal: &lt;br&gt;
python3&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; gce = ComputeEngine(
"libcloud@m-tps-test.iam.gserviceaccount.com",
"~/m-tps-test.json",
project="m-tps-test"
)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;The Explorer Node and Core Nodes need to be reachable from the internet, which is why we need to punch through the firewall:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; explorer_ports = [
{"IPProtocol": "tcp", "ports": ["22", "443"]},
{"IPProtocol": "udp", "ports": ["20000"]}
]
&amp;gt;&amp;gt;&amp;gt; core_ports = [
{"IPProtocol": "tcp", "ports": ["22", "443", "20000"]},
{"IPProtocol": "udp", "ports": ["20000"]}
]
&amp;gt;&amp;gt;&amp;gt; gce.ex_create_firewall(
name='explorer-ingress-rules',
allowed=explorer_ports,
description='explorer-ingress-rules')
&amp;gt;&amp;gt;&amp;gt; gce.ex_create_firewall(
name='core-ingress-rules',
allowed=core_ports,
description='core-ingress-rules')
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;[ &lt;a href="https://libcloud.readthedocs.io/en/latest/compute/drivers/gce.html#libcloud.compute.drivers.gce.GCENodeDriver.ex_create_firewall"&gt;doc&lt;/a&gt; ] [ &lt;a href="https://github.com/radixdlt/mtps/blob/912da377bfa751ea2adac40ecc7c31b61c0acd97/tools/libcloud/gcp.py#L23-L49"&gt;source&lt;/a&gt; ]&lt;/p&gt;

&lt;h3&gt;
  
  
  Create Explorer Node
&lt;/h3&gt;

&lt;p&gt;The next step is to create the Explorer node, which hosts the &lt;a href="https://test.radixdlt.com/"&gt;Explorer Service&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;NOTE: This command needs a valid explorer_cloud_init configuration (string), which is based on &lt;a href="https://github.com/radixdlt/mtps/blob/912da377bfa751ea2adac40ecc7c31b61c0acd97/tools/cloudinit/explorer"&gt;this template&lt;/a&gt;. It’s quite hard to generate this template by hand, hence the following code block is not executable as is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; node = gce.create_node(
name = "explorer",
image = "https://www.googleapis.com/compute/v1/projects/ubuntu-os-cloud/global/images/ubuntu-1604-xenial-v20190530c",
size = "n1-standard-8",
location = "europe-west3-a",
ex_metadata = {"user-data": explorer_cloud_init},
ex_disks_gce_struct = [
{
'autoDelete': True,
'boot': True,
'type': 'PERSISTENT',
'mode': 'READ_WRITE',
'deviceName': "explorer",
'initializeParams': {
'diskName': "explorer",
'sourceImage': "https://www.googleapis.com/compute/v1/projects/ubuntu-os-cloud/global/images/ubuntu-1604-xenial-v20190530c"
}
},
]
)

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;[ &lt;a href="https://libcloud.readthedocs.io/en/latest/compute/drivers/gce.html#libcloud.compute.drivers.gce.GCENodeDriver.create_node"&gt;doc&lt;/a&gt; ] [ &lt;a href="https://github.com/radixdlt/mtps/blob/912da377bfa751ea2adac40ecc7c31b61c0acd97/tools/libcloud/gcp.py#L203-L224"&gt;source&lt;/a&gt; ]&lt;/p&gt;

&lt;h3&gt;
  
  
  Create Boot Node / Create Core Nodes
&lt;/h3&gt;

&lt;p&gt;Now this is where things get really complicated as we used &lt;a href="https://cloud.google.com/compute/docs/regions-zones/"&gt;17 different Google Cloud Engine (GCE) Regions&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The Boot node is launched first and the remaining core nodes do not get created until the Boot node is serving on HTTPS port 443 and listening on Gossip (UDP) port 20000.&lt;/p&gt;

&lt;p&gt;Creating 1187 Core nodes one-by-one with gce.create_node (as we did with the Explorer node above) is theoretically possible, but very inefficient. That’s why we instead created &lt;a href="https://cloud.google.com/compute/docs/instance-groups/"&gt;Instance groups&lt;/a&gt; — one in each GCE Region.&lt;/p&gt;

&lt;p&gt;NOTE: Similarly to creating the Explorer node, a concrete cloudinit config needs to be generated for the Core nodes (same config used for the Boot node) from &lt;a href="https://github.com/radixdlt/mtps/blob/912da377bfa751ea2adac40ecc7c31b61c0acd97/tools/cloudinit/core"&gt;this template&lt;/a&gt;, which is out-of-scope for this blog. &lt;/p&gt;

&lt;p&gt;A Google Cloud Region is a geographical location (City) with multiple data centers (Zones). Typically Google has three Zones in every region. In the &lt;a href="https://console.cloud.google.com/"&gt;Google Cloud Console&lt;/a&gt;, it’s possible to create an Instance group in a Region without limiting it to a particular Zone. However, libcloud 2.5.0 only supports the creation of instance groups per Zone. The solution is the following monkey patch, whichwill work until libcloud catches up:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def create_core_group(gce, region, size, template, prefix="cores"):
try:
region = region or gce.region
if not hasattr(region, 'name'):
region = gce.ex_get_region(region)
request = '/regions/%s/instanceGroupManagers' % (region.name)
manager_data = {}

#If the user gave us a name, we fetch the GCEInstanceTemplate for it.
if not hasattr(template, 'name'):
template = gce.ex_get_instancetemplate(template)
manager_data['instanceTemplate'] = template.extra['selfLink']

# If base_instance_name is not set, we use name.
manager_data['name'] = manager_data['baseInstanceName'] = "{0}-{1}".format(prefix, region.name)
manager_data['distributionPolicy'] = dict(
zones = [{"zone": "zones/" + z.name} for z in gce.ex_list_zones() if z.status == "UP" and z.name.startswith(region.name)]
)
manager_data['targetSize'] = size
manager_data['description'] = None

gce.connection.request(request, method='POST', data=manager_data)
except ResourceExistsError:
pass
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;[ &lt;a href="https://github.com/radixdlt/mtps/blob/912da377bfa751ea2adac40ecc7c31b61c0acd97/tools/libcloud/gcp.py#L66-L88"&gt;source&lt;/a&gt; ]&lt;/p&gt;

&lt;h1&gt;
  
  
  Final Words
&lt;/h1&gt;

&lt;p&gt;It took our team of five people approximately two months to develop a stable solution for instantiating and running 1M TPS tests in GCE. Overall, our experience with the platform is very positive. However, some features stand out and are worth mentioning in more detail (below).&lt;/p&gt;

&lt;h2&gt;
  
  
  What we loved about the Google Cloud Platform
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Reliability and Performance Consistency
&lt;/h3&gt;

&lt;p&gt;It’s hard to develop, debug and productify a traditional web service. It is even harder for Highly-Available Applications, where a global state needs to be synchronised between a quorum (typically 3 or 5) Nodes. The challenge grows even bigger if you decide to host each Node on the opposite side of the world, as then latency also becomes a significant issue. Our test scenario with 1187 Nodes spread over the majority of the Google Cloud Regions made this even more complex.&lt;/p&gt;

&lt;p&gt;Despite this complexity and global spread, the Google Cloud Platform has been rock-solid for us and was one of the few components we did not have problems with. In particular, when analysing performance changes between test runs, GCE was very consistent, allowing us to focus on tweaking RadixCore. To demonstrate this, please see the following two graphs of transactions per second performance over time. Notice it’s the same software, same config, same number of GCE Regions, same amount of nodes/Region (1187); the only difference is that one was run 13.5 hours later than the other:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JtrO33rg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.radixdlt.com/wp-content/uploads/2019/08/unnamed-26.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JtrO33rg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.radixdlt.com/wp-content/uploads/2019/08/unnamed-26.png" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Stable API and Tooling
&lt;/h3&gt;

&lt;p&gt;Initially we used &lt;a href="https://cloud.google.com/sdk/install"&gt;gcloud&lt;/a&gt;. We decided to punt it only at the end of the project when our shell script (using the gcloud CLI) became too big and too complex for us to maintain. Overall we found gcloud to be mature and stable with no timing issues. The only missing feature is the ability to bind it to our YubiKey (SSH Key).&lt;/p&gt;

&lt;h3&gt;
  
  
  Project based Security
&lt;/h3&gt;

&lt;p&gt;We like how the GCPsecurity boundaries are organised: on the top level you have your Organisation, and within your Organisation you create Projects. In our case, we have business critical services running in one project and the 1M TPS tests running in another. This allowed us to have different levels of access control for our business critical services compared to the 1M TPS tests. &lt;/p&gt;

&lt;p&gt;The Google Identity Access Management (IAM) solution is also pretty intuitive. We managed to figure out what occasional permissions we were missing by quick trial and error in the Cloud Console application. Most of the time the tooling actually tells you what permission is missing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Support is Good and Responsive
&lt;/h3&gt;

&lt;p&gt;We did not need Google Cloud support for anything other than getting quotas raised, but for that we used it a lot. &lt;/p&gt;

&lt;p&gt;We got confirmation and response within 24 hours at all times, except the time the &lt;a href="https://www.wired.com/story/google-cloud-outage-catch-22/"&gt;Google Cloud Platform went down&lt;/a&gt;. The help was substantial, although getting quotas was a very painful and time consuming process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Areas for Improvement
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Quota Process
&lt;/h3&gt;

&lt;p&gt;The wonderful world of GCP quotas! When you are using multiple data centre locations and all of them have different sets of quotas, this process can become frustrating — especially if it’s blocking you from getting what you want: more VMs!&lt;/p&gt;

&lt;p&gt;Once you figure out the first quota you need, you can easily request it to be increased through a form in Google Cloud Console. In fact, it’s so easy that it is tempting to fire off individual quota requests as soon as you realise you are missing something. It was later explained to us that some quotas take time, especially when you want to go from eight CPUs to 800 CPUs in one Zone. Google keeps some spare capacity, but a substantial increase is typically a carefully planned process that needs to be approved on many levels of their organisation. &lt;/p&gt;

&lt;p&gt;Unfortunately, quotas requests cannot be tracked in the Console – you can only respond to an e-mail if you want to follow up on it. This meant we could not see what quota request our colleagues had already created, which ended up with multiple people creating the same quota request at slightly different times.&lt;/p&gt;

&lt;h3&gt;
  
  
  Higher Level Quotas
&lt;/h3&gt;

&lt;p&gt;We increase quotas in order to instantiate more VMs. Depending on the VM configuration, we typically need to request more than one quota all at once. For example, the following set of quotas need to be increased together in our test scenario:&lt;/p&gt;

&lt;p&gt;-CPUs&lt;br&gt;
-In-use IP Addresses&lt;br&gt;
-Persistent Disk SSD (GB)&lt;/p&gt;

&lt;p&gt;As a suggested improvement, instead of exposing each quota to the user, a better UX would allow the user to request quotas from the options menu of a running VM. — e.g. a new quota form would ideally be started from this menu:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QMGaEYku--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.radixdlt.com/wp-content/uploads/2019/08/unnamed-27.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QMGaEYku--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.radixdlt.com/wp-content/uploads/2019/08/unnamed-27.png" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the new quota form the user would have high-level options to:&lt;/p&gt;

&lt;p&gt;-Get x more like this in current Zone&lt;br&gt;
-Get x more like this in current Region&lt;br&gt;
-Get x more like this in any Region&lt;br&gt;
-Custom (would take you to the legacy quota form)&lt;/p&gt;

&lt;p&gt;This would result in more accurate and complete quota requests, which would both decrease the load on Google Cloud Support and get the end-user unblocked faster.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;We are very proud to have gone from an immature idea to a stable product in eight weeks. Without going into detail, there are lots of small decision points during the project that have made these eight weeks very stressful for the team involved, which we could have done better. &lt;/p&gt;

&lt;p&gt;One of the bigger decisions we made early in the project was to build our project on Google Cloud Platform. This decision was based on our previous experience with GCP; in fact we had (and still have) substantial amounts of our production infrastructure on GCP at the time this project was kicked off.  I’m happy to say that partnering with Google Cloud was the right call for this project as well. Google’s infrastructure is solid, and its support organization can handle unconventional use-cases (1187 ephemeral nodes) like ours and respond within a reasonable amount of time.&lt;/p&gt;

&lt;h1&gt;
  
  
  Join The Radix Community
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://t.me/radix_dlt"&gt;Telegram&lt;/a&gt; for general chat&lt;br&gt;
&lt;a href="https://discord.gg/7Q7HSZZ"&gt;​Discord&lt;/a&gt; for developers chat&lt;br&gt;
&lt;a href="https://reddit.com/r/radix"&gt;​Reddit&lt;/a&gt; for general discussion&lt;br&gt;
&lt;a href="https://forum.radixdlt.com/"&gt;Forum&lt;/a&gt; for technical discussion&lt;br&gt;
​&lt;a href="https://twitter.com/radixdlt"&gt;Twitter&lt;/a&gt; for announcements&lt;br&gt;
&lt;a href="https://radixdlt.typeform.com/to/nyKvMV"&gt;​Email&lt;/a&gt; newsletter for weekly updates&lt;br&gt;
Mail to &lt;a href="//hello@radixdlt.com"&gt;hello@radixdlt.com&lt;/a&gt; for general enquiries&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>blockchain</category>
      <category>testing</category>
      <category>api</category>
    </item>
    <item>
      <title>The Radix Betanet Emulator - how to start?</title>
      <dc:creator>Radix</dc:creator>
      <pubDate>Tue, 27 Aug 2019 09:46:01 +0000</pubDate>
      <link>https://dev.to/radixdlt/the-radix-betanet-emulator-how-to-start-jge</link>
      <guid>https://dev.to/radixdlt/the-radix-betanet-emulator-how-to-start-jge</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;This is a quick start guide aimed for non-technical users, to run a Radix DLT Betanet Emulator on your computer. The following steps are covered:&lt;/p&gt;

&lt;p&gt;-&lt;a href="https://docs.radixdlt.com/kb/#installing-docker"&gt;Installing Docker&lt;/a&gt;&lt;br&gt;
-&lt;a href="https://docs.radixdlt.com/kb/#creating-a-docker-composeyml-configuration-file"&gt;Creating a configuration file&lt;/a&gt;&lt;br&gt;
-&lt;a href="https://docs.radixdlt.com/kb/#launching-emulator"&gt;Launching the Radix DLT Betanet Emulator&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  Emulator limitations
&lt;/h1&gt;

&lt;p&gt;-The betanet emulator works in a stand-alone mode.&lt;br&gt;
-There is no network or connection between nodes.&lt;br&gt;
-Throughput is limited, as all workload is concentrated on a single node.&lt;br&gt;
-Network API endpoints always return an empty set.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;
  
  
  Pre-requisites
&lt;/h1&gt;
&lt;h2&gt;
  
  
  Hardware
&lt;/h2&gt;

&lt;p&gt;Your host computer should have &lt;strong&gt;at least&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;2 CPU cores&lt;br&gt;
8 GB memory&lt;br&gt;
20 GB disk&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: the actual disk size requirement will grow over time as the ledger grows.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;
  
  
  Software
&lt;/h1&gt;

&lt;p&gt;You can run the Radix DLT Betanet Emulator on any operating system that supports Docker and Docker Compose, including:&lt;/p&gt;

&lt;p&gt;-Linux&lt;br&gt;
-MacOS X&lt;br&gt;
-Windows 10&lt;/p&gt;
&lt;h1&gt;
  
  
  Installing Docker
&lt;/h1&gt;

&lt;p&gt;You can download the right Docker Engine (Community Edition) for your system here: &lt;a href="https://hub.docker.com/search/?type=edition&amp;amp;offering=community"&gt;https://hub.docker.com/search/?type=edition&amp;amp;offering=community&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For a detailed Docker setup guide, please refer to the &lt;a href="https://docs.docker.com/install/"&gt;official installation&lt;/a&gt; documentation for &lt;a href="https://www.docker.com/products/docker-engine"&gt;Docker CE&lt;/a&gt;.&lt;/p&gt;
&lt;h1&gt;
  
  
  Installing Docker Compose (Linux only)
&lt;/h1&gt;

&lt;p&gt;If you are running Linux, after you completed the Docker setup you need to install &lt;a href="https://docs.docker.com/compose/install/"&gt;Docker Compose&lt;/a&gt;. See the official Docker Composite &lt;a href="https://docs.docker.com/compose/install/"&gt;installation guide&lt;/a&gt; for download links and additional information.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;: Docker Compose is bundled with Docker CE for the Mac and Windows versions.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;
  
  
  Creating a configuration file
&lt;/h1&gt;

&lt;p&gt;The Radix DLT software stack is composed of a single docker image,  &lt;code&gt;radixdlt/radixdlt-core-emulator:1.0.0-beta.&lt;/code&gt;&lt;br&gt;
Your &lt;code&gt;betanet-emulator.yml&lt;/code&gt; determines the software components you will run. In particular, the following settings are specified:&lt;/p&gt;

&lt;p&gt;-The Docker image to download and start&lt;br&gt;
-Persistent data volumes - that survive restarts and upgrades.&lt;/p&gt;

&lt;p&gt;Start with this docker compose file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;version: '2.2'
services:
  core:
    image: radixdlt/radixdlt-core-emulator:1.0.0-beta
    init: true
    ports:
      - "8080:8080"
    environment:
      CORE_NETWORK_SEEDS: core
      CORE_SECURE_RANDOM_SOURCE: /dev/urandom
      CORE_UNIVERSE: v2djcmVhdG9yWCIBA3hanCWf3pmR5E+i+wtWWfKleBrDOQduLb/vcFKOSt9oa2Rlc2NyaXB0aW9ueB5UaGUgUmFkaXggZGV2ZWxvcG1lbnQgVW5pdmVyc2VnZ2VuZXNpc4G/aG1ldGFEYXRhv2l0aW1lc3RhbXBtMTU1MTIyNTYwMDAwMP9ucGFydGljbGVHcm91cHODv2lwYXJ0aWNsZXOBv2hwYXJ0aWNsZb9lYnl0ZXNXAVJhZGl4Li4uIGp1c3QgaW1hZ2luZSFsZGVzdGluYXRpb25zgVECVqurOHBYXwTQFdVa32ALx2Rmcm9tWCcEAgN4Wpwln96ZkeRPovsLVlnypXgawzkHbi2/73BSjkrfaIh5wbllbm9uY2UbAAQdARdF7ABqc2VyaWFsaXplcndyYWRpeC5wYXJ0aWNsZXMubWVzc2FnZWJ0b1gnBAIDeFqcJZ/emZHkT6L7C1ZZ8qV4GsM5B24tv+9wUo5K32iIecG5Z3ZlcnNpb24YZP9qc2VyaWFsaXplcnNyYWRpeC5zcHVuX3BhcnRpY2xlZHNwaW4BZ3ZlcnNpb24YZP9qc2VyaWFsaXplcnRyYWRpeC5wYXJ0aWNsZV9ncm91cGd2ZXJzaW9uGGT/v2lwYXJ0aWNsZXODv2hwYXJ0aWNsZb9sZGVzdGluYXRpb25zgVECVqurOHBYXwTQFdVa32ALx2Vub25jZQBjcnJpWDkGL0pIMVA4ZjN6bmJ5ckRqOEY0UldwaXg3aFJrZ3hxSGpkVzJmTm5LcFIzdjZ1Zlhua25vci9YUkRqc2VyaWFsaXplcnNyYWRpeC5wYXJ0aWNsZXMucnJpZ3ZlcnNpb24YZP9qc2VyaWFsaXplcnNyYWRpeC5zcHVuX3BhcnRpY2xlZHNwaW4gZ3ZlcnNpb24YZP+/aHBhcnRpY2xlv2dhZGRyZXNzWCcEAgN4Wpwln96ZkeRPovsLVlnypXgawzkHbi2/73BSjkrfaIh5wblrZGVzY3JpcHRpb25zUmFkaXggTmF0aXZlIFRva2Vuc2xkZXN0aW5hdGlvbnOBUQJWq6s4cFhfBNAV1VrfYAvHa2dyYW51bGFyaXR5WCEFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFnaWNvblVybHg0aHR0cHM6Ly9hc3NldHMucmFkaXhkbHQuY29tL2ljb25zL2ljb24teHJkLTMyeDMyLnBuZ2RuYW1lZFJhZHNrcGVybWlzc2lvbnO/ZGJ1cm5kbm9uZWRtaW50c3Rva2VuX2NyZWF0aW9uX29ubHn/anNlcmlhbGl6ZXJ4IHJhZGl4LnBhcnRpY2xlcy50b2tlbl9kZWZpbml0aW9uZnN5bWJvbGNYUkRndmVyc2lvbhhk/2pzZXJpYWxpemVyc3JhZGl4LnNwdW5fcGFydGljbGVkc3BpbgFndmVyc2lvbhhk/79ocGFydGljbGW/ZmFtb3VudFghBf//////////////////////////////////////////bGRlc3RpbmF0aW9uc4FRAlarqzhwWF8E0BXVWt9gC8drZ3JhbnVsYXJpdHlYIQUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWVub25jZRsABB0BF0ZbTmtwZXJtaXNzaW9uc79kYnVybmRub25lZG1pbnRzdG9rZW5fY3JlYXRpb25fb25sef9qc2VyaWFsaXplcngicmFkaXgucGFydGljbGVzLnVuYWxsb2NhdGVkX3Rva2Vuc3gYdG9rZW5EZWZpbml0aW9uUmVmZXJlbmNlWDkGL0pIMVA4ZjN6bmJ5ckRqOEY0UldwaXg3aFJrZ3hxSGpkVzJmTm5LcFIzdjZ1Zlhua25vci9YUkRndmVyc2lvbhhk/2pzZXJpYWxpemVyc3JhZGl4LnNwdW5fcGFydGljbGVkc3BpbgFndmVyc2lvbhhk/2pzZXJpYWxpemVydHJhZGl4LnBhcnRpY2xlX2dyb3VwZ3ZlcnNpb24YZP+/aXBhcnRpY2xlc4O/aHBhcnRpY2xlv2ZhbW91bnRYIQX//////////////////////////////////////////2xkZXN0aW5hdGlvbnOBUQJWq6s4cFhfBNAV1VrfYAvHa2dyYW51bGFyaXR5WCEFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFlbm9uY2UbAAQdARdGW05rcGVybWlzc2lvbnO/ZGJ1cm5kbm9uZWRtaW50c3Rva2VuX2NyZWF0aW9uX29ubHn/anNlcmlhbGl6ZXJ4InJhZGl4LnBhcnRpY2xlcy51bmFsbG9jYXRlZF90b2tlbnN4GHRva2VuRGVmaW5pdGlvblJlZmVyZW5jZVg5Bi9KSDFQOGYzem5ieXJEajhGNFJXcGl4N2hSa2d4cUhqZFcyZk5uS3BSM3Y2dWZYbmtub3IvWFJEZ3ZlcnNpb24YZP9qc2VyaWFsaXplcnNyYWRpeC5zcHVuX3BhcnRpY2xlZHNwaW4gZ3ZlcnNpb24YZP+/aHBhcnRpY2xlv2ZhbW91bnRYIQX///////////////////////////zE0cNgL3/DF////2xkZXN0aW5hdGlvbnOBUQJWq6s4cFhfBNAV1VrfYAvHa2dyYW51bGFyaXR5WCEFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFlbm9uY2UbAAQdARdG1htrcGVybWlzc2lvbnO/ZGJ1cm5kbm9uZWRtaW50c3Rva2VuX2NyZWF0aW9uX29ubHn/anNlcmlhbGl6ZXJ4InJhZGl4LnBhcnRpY2xlcy51bmFsbG9jYXRlZF90b2tlbnN4GHRva2VuRGVmaW5pdGlvblJlZmVyZW5jZVg5Bi9KSDFQOGYzem5ieXJEajhGNFJXcGl4N2hSa2d4cUhqZFcyZk5uS3BSM3Y2dWZYbmtub3IvWFJEZ3ZlcnNpb24YZP9qc2VyaWFsaXplcnNyYWRpeC5zcHVuX3BhcnRpY2xlZHNwaW4BZ3ZlcnNpb24YZP+/aHBhcnRpY2xlv2dhZGRyZXNzWCcEAgN4Wpwln96ZkeRPovsLVlnypXgawzkHbi2/73BSjkrfaIh5wblmYW1vdW50WCEFAAAAAAAAAAAAAAAAAAAAAAAAAAADOy48n9CAPOgAAABsZGVzdGluYXRpb25zgVECVqurOHBYXwTQFdVa32ALx2tncmFudWxhcml0eVghBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZW5vbmNlGwAEHQEXRsX0a3Blcm1pc3Npb25zv2RidXJuZG5vbmVkbWludHN0b2tlbl9jcmVhdGlvbl9vbmx5/2ZwbGFuY2saAYp/QGpzZXJpYWxpemVyeCRyYWRpeC5wYXJ0aWNsZXMudHJhbnNmZXJyYWJsZV90b2tlbnN4GHRva2VuRGVmaW5pdGlvblJlZmVyZW5jZVg5Bi9KSDFQOGYzem5ieXJEajhGNFJXcGl4N2hSa2d4cUhqZFcyZk5uS3BSM3Y2dWZYbmtub3IvWFJEZ3ZlcnNpb24YZP9qc2VyaWFsaXplcnNyYWRpeC5zcHVuX3BhcnRpY2xlZHNwaW4BZ3ZlcnNpb24YZP9qc2VyaWFsaXplcnRyYWRpeC5wYXJ0aWNsZV9ncm91cGd2ZXJzaW9uGGT/anNlcmlhbGl6ZXJqcmFkaXguYXRvbWpzaWduYXR1cmVzv3ggNTZhYmFiMzg3MDU4NWYwNGQwMTVkNTVhZGY2MDBiYze/YXJYIQGN+yS2lSWiWm+Qp+RE0XKZZlDCmsYEHqVOgwi5sumVH2FzWCEBUZbY2D5H9/zBPnDtU80qy4A1/EAJyrzw/bOCrHlNgoFqc2VyaWFsaXplcnZjcnlwdG8uZWNkc2Ffc2lnbmF0dXJlZ3ZlcnNpb24YZP//bXRlbXBvcmFsUHJvb2a/Y2FpZFghCEJOW9hqiqRdHgAFw1rMG1kA7xFc89evO1arqzhwWF8EanNlcmlhbGl6ZXJ0dGVtcG8udGVtcG9yYWxfcHJvb2ZndmVyc2lvbhhkaHZlcnRpY2Vzgb9lY2xvY2sBamNvbW1pdG1lbnRYIQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVvd25lclgiAQO5kZ9TtqJE8PAqMAkR3IZE413Vm/wmXBPBKjvYm8ddX2hwcmV2aW91c1ECAAAAAAAAAAAAAAAAAAAAAGZyY2xvY2sbAAABaSxAOABqc2VyaWFsaXplcnV0ZW1wby50ZW1wb3JhbF92ZXJ0ZXhpc2lnbmF0dXJlv2FyWCEBPkk2kYaH4ixggyRYaSAYGe80qCxej1B5I+Zi+x/jn4Fhc1ghASXlWsUP3WFDhORmhokZUIVw5sy27TBsZ/Rudr1ueAXkanNlcmlhbGl6ZXJ2Y3J5cHRvLmVjZHNhX3NpZ25hdHVyZWd2ZXJzaW9uGGT/anRpbWVzdGFtcHO/Z2RlZmF1bHQbAAABaSxAOAD/Z3ZlcnNpb24YZP//Z3ZlcnNpb24YZP9lbWFnaWM6T2h//WRuYW1lbFJhZGl4IERldm5ldGZwbGFuY2sZ6mBkcG9ydBl1MGpzZXJpYWxpemVybnJhZGl4LnVuaXZlcnNla3NpZ25hdHVyZS5yWCEBnNHHy2ZNs02RhJ2PaGE8TYjJ6a4JZbs5W5ICDG2FZ4prc2lnbmF0dXJlLnNYIQEzwSczZGOPPINsytlykDyITA51ICNl/GVmTSRwoD4Zeml0aW1lc3RhbXAbAAABaSxAOABkdHlwZQJndmVyc2lvbhhk/w==
      JAVA_OPTS: -server -Xms2g -Xmx2g
    volumes:
      - "core_ledger:/opt/radixdlt/RADIXDB"
      - "core_config:/opt/radixdlt/etc"
    logging:
      options:
        max-size: "10m"
        max-file: "30"
    networks:
      - single_node
  faucet:
    image: radixdlt/faucet:1.0.0-beta
    init: true
    environment:
      FAUCET_DELAY: 0
      FAUCET_TOKEN_RRI: /JH1P8f3znbyrDj8F4RWpix7hRkgxqHjdW2fNnKpR3v6ufXnknor/XRD
      RADIX_IDENTITY_UNENCRYPTED_KEY: JI41zTPZ+DW0JMUBlLciuyrSqT0/Gj9/Oz3+J9MhNL4=
      RADIX_BOOTSTRAP_TRUSTED_NODE: http://core:8080
      JAVA_OPTS: -server
    logging:
      options:
        max-size: "10m"
        max-file: "30"
    networks:
      - single_node
volumes:
  core_ledger:
  core_config:
networks:
  single_node:
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;1.Create a directory on your computer for storing docker compose files (e.g., &lt;code&gt;radixdlt&lt;/code&gt;).&lt;br&gt;
2.Use your favorite text editor to create the &lt;code&gt;betanet-emulator.yml.&lt;/code&gt;&lt;br&gt;
3.Copy and paste the content above.&lt;/p&gt;
&lt;h1&gt;
  
  
  Launching the Betanet Emulator
&lt;/h1&gt;

&lt;p&gt;Open up a Terminal (Mac/Linux) or a Command Prompt (on Windows). Navigate to the directory where you've placed your &lt;code&gt;betanet-emulator.yml&lt;/code&gt; file. Launch the Docker containers with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ~/radixdlt
docker-compose -p radixdlt -f betanet-emulator.yml up -d
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;If successful, it should pull down and look something like this when completed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Creating network "radixdlt_single_node" with the default driver
Creating volume "radixdlt_core_ledger" with default driver
Creating volume "radixdlt_core_config" with default driver
Pulling core (radixdlt/radixdlt-core-emulator:1.0.0-beta)...
emulator-1.0.0-beta: Pulling from radixdlt/radixdlt-core
c87736221ed0: Pull complete
a0d980c21713: Pull complete
7153696eb942: Pull complete
5a8ad49b35c2: Pull complete
6e8ff60c7fe2: Pull complete
e5bd13ba5d60: Pull complete
dc2a7e34f4b6: Pull complete
9520c49c4dca: Pull complete
Creating radixdlt_core_1 ... done
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Check that you have a &lt;code&gt;radixdlt_core_1&lt;/code&gt; Docker container with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker ps

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You can also check if the Betanet Emulator is up and running at &lt;a href="http://localhost:8080/api/system"&gt;http://localhost:8080/api/system&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If running correctly you should get a bunch of metrics - it should look something like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;{"ledger":{"processed":0,"storingPerShard":0,"storedPerShard":":str:0.0","stored":1,"storing.peak":0,"latency":{"path":0,"persist":0},"checksum":9155064537244249607,"processing":0,"faults":{"tears":0,"assists":0,"stitched":0,"failed":0},"storing":0},"agent":{"protocol":100,"name":":str:/Radix:/2700000","version":2700000},"hid":":uid:8c0976a9ed622c4c0657f57a81c38f85","memory":{"total":2058354688,"max":2058354688,"free":1863937832},"nid":":uid:8cf1ffca3da4bcb3490067ad8e9273e4","serializer":"api.local_system","commitment":":hsh:0100000000000000000000000000000000000000000000000000000000000000","global":{"stored":1,"processing":0,"storing":0},"processors":2,"clock":1,"version":100,"planck":25853760,"shards":{"anchor":-8290564194929689421,"serializer":"radix.shard.space","range":{"high":8796093022207,"low":-8796093022208,"serializer":"radix.shards.range"}},"port":30000,"messages":{"inbound":{"processed":1,"discarded":0,"pending":0,"received":10},"outbound":{"processed":10,"aborted":0,"pending":0,"sent":10}},"events":{"broadcast":75,"processed":{"synchronous":64,"asynchronous":36},"queued":36,"processing":0,"dequeued":36},"key":":byt:A6rybyzH6BO3gp6XVA8NJdqAnL1FQMeCuJ8veFgM2mqQ","timestamp":1551225600000}&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Congratulations, you are now successfully running the Betanet Emulator!&lt;/p&gt;

&lt;h1&gt;
  
  
  Managing the Betanet Emulator
&lt;/h1&gt;

&lt;p&gt;Once you've got the Betanet Emulator running, you can stop or refresh (upgrade) the software using the following commands:&lt;/p&gt;

&lt;h2&gt;
  
  
  Stop the Betanet Emulator
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;docker-compose -p radixdlt -f betanet-emulator.yml down&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Refresh the Betanet Emulator
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;docker-compose -p radixdlt -f betanet-emulator.yml pull&lt;/code&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Kitematic
&lt;/h1&gt;

&lt;p&gt;This is optional, but if you are running the Betanet Emulator on a Mac or Windows computer, you can download &lt;a href="https://kitematic.com/"&gt;Kitematic&lt;/a&gt; to add a UI to your Docker container. If you want access to nice buttons and a live log view this is definitely for you!&lt;/p&gt;

&lt;h1&gt;
  
  
  Development libraries
&lt;/h1&gt;

&lt;p&gt;Last, but not least, you can start your own DApp development using our &lt;a href="https://docs.radixdlt.com/radixdlt-java/"&gt;Java&lt;/a&gt; and &lt;a href="https://docs.radixdlt.com/radixdlt-js/"&gt;JavaScript&lt;/a&gt; client libraries.&lt;/p&gt;

&lt;h1&gt;
  
  
  Join The Radix Community
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://t.me/radix_dlt"&gt;Telegram&lt;/a&gt; for general chat&lt;br&gt;
&lt;a href="https://discord.gg/7Q7HSZZ"&gt;​Discord&lt;/a&gt; for developers chat&lt;br&gt;
&lt;a href="https://reddit.com/r/radix"&gt;​Reddit&lt;/a&gt; for general discussion&lt;br&gt;
&lt;a href="https://forum.radixdlt.com/"&gt;Forum&lt;/a&gt; for technical discussion&lt;br&gt;
​&lt;a href="https://twitter.com/radixdlt"&gt;Twitter&lt;/a&gt; for announcements&lt;br&gt;
&lt;a href="https://radixdlt.typeform.com/to/nyKvMV"&gt;​Email&lt;/a&gt; newsletter for weekly updates&lt;br&gt;
Mail to &lt;a href="//hello@radixdlt.com"&gt;hello@radixdlt.com&lt;/a&gt; for general enquiries&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>beta</category>
      <category>docker</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>Radix DLT - Betanet Emulator Live - Start Building Now!</title>
      <dc:creator>Radix</dc:creator>
      <pubDate>Fri, 02 Aug 2019 12:35:04 +0000</pubDate>
      <link>https://dev.to/radixdlt/radix-dlt-betanet-emulator-live-start-building-now-26f9</link>
      <guid>https://dev.to/radixdlt/radix-dlt-betanet-emulator-live-start-building-now-26f9</guid>
      <description>&lt;p&gt;Radix started as a project to not only be &lt;a href="http://radixdltltd.acemlna.com/lt.php?notrack=1&amp;amp;s=bd0f02a69a63dec8514bf73a241c890d&amp;amp;i=52A2514A0A1579"&gt;highly scalable&lt;/a&gt; but to also make it easy for any developer to build decentralized applications with.&lt;/p&gt;

&lt;p&gt;Staying true to this cause, we are releasing a series of developer tools starting with the single node emulator today; so you can start building now before the public betanet goes live.  &lt;/p&gt;

&lt;p&gt;The single-node emulator behaves like a fully functioning betanet, but on your local machine.&lt;/p&gt;

&lt;p&gt;With it you will be able to:&lt;/p&gt;

&lt;p&gt;-Create token types&lt;/p&gt;

&lt;p&gt;-Mint tokens for token types, subject to permissions&lt;/p&gt;

&lt;p&gt;-Burn tokens for token types, subject to permissions&lt;/p&gt;

&lt;p&gt;-Transfer tokens for token types, subject to ownership&lt;/p&gt;

&lt;p&gt;-Transfer encrypted and unencrypted messages&lt;/p&gt;

&lt;p&gt;In addition, there is the ability in the betanet-emulator package to request XRD tokens from a "faucet" to facilitate experiments with the native token.&lt;/p&gt;

&lt;p&gt;Follow this quick start guide to install it on your local machine:- &lt;a href="https://docs.radixdlt.com/kb/develop/betanet-emulator"&gt;https://docs.radixdlt.com/kb/develop/betanet-emulator&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then, use your choice of client library to start building your use-case:&lt;/p&gt;

&lt;p&gt;-&lt;a href="http://radixdltltd.acemlna.com/lt.php?notrack=1&amp;amp;s=bd0f02a69a63dec8514bf73a241c890d&amp;amp;i=52A2514A0A1581"&gt;Java Client Library&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;-&lt;a href="http://radixdltltd.acemlna.com/lt.php?notrack=1&amp;amp;s=bd0f02a69a63dec8514bf73a241c890d&amp;amp;i=52A2514A0A1582"&gt;JavaScript Client Library&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And, you can use this latest &lt;a href="http://radixdltltd.acemlna.com/lt.php?notrack=1&amp;amp;s=bd0f02a69a63dec8514bf73a241c890d&amp;amp;i=52A2514A0A1583"&gt;Android wallet&lt;/a&gt; release to connect and interact with the betanet emulator.&lt;/p&gt;

&lt;p&gt;If you have feedback/questions about the emulator, post them on our  &lt;a href="http://radixdltltd.acemlna.com/lt.php?notrack=1&amp;amp;s=bd0f02a69a63dec8514bf73a241c890d&amp;amp;i=52A2514A0A1584"&gt;Node Runners Forum&lt;/a&gt; where one of the team members will help you. If you have library-specific questions, please post them in the &lt;a href="http://radixdltltd.acemlna.com/lt.php?notrack=1&amp;amp;s=bd0f02a69a63dec8514bf73a241c890d&amp;amp;i=52A2514A0A1585"&gt;Technical Forum&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Lastly, join the conversation with our community on &lt;a href="http://radixdltltd.acemlna.com/lt.php?notrack=1&amp;amp;s=bd0f02a69a63dec8514bf73a241c890d&amp;amp;i=52A2514A0A1586"&gt;Telegram&lt;/a&gt; and tell us what you are building!&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>beta</category>
      <category>java</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Part 1: A Primer on The Scalability Test and Radix</title>
      <dc:creator>Radix</dc:creator>
      <pubDate>Fri, 14 Jun 2019 14:13:19 +0000</pubDate>
      <link>https://dev.to/radixdlt/part-1-a-primer-on-the-scalability-test-and-radix-4jjb</link>
      <guid>https://dev.to/radixdlt/part-1-a-primer-on-the-scalability-test-and-radix-4jjb</guid>
      <description>&lt;p&gt;This is the first part of a two-part series on how we built and deployed a test that pushed the entire transaction history of Bitcoin across the Radix ledger in less than 15 minutes.&lt;/p&gt;

&lt;h1&gt;
  
  
  What is this test?
&lt;/h1&gt;

&lt;p&gt;These tests replay the entire 10 years of Bitcoin’s transaction history on the Radix ledger, with full transaction and signature validation, on a network of over 1,000 Nodes distributed evenly throughout the world.&lt;/p&gt;

&lt;p&gt;For the first time since the creation of public, trustless networks, we have demonstrated a technology that can truly support even the world’s most demanding transactional applications.&lt;/p&gt;

&lt;h1&gt;
  
  
  What are these tests demonstrating?
&lt;/h1&gt;

&lt;p&gt;That technology for the transfer and ownership of value, without a central authority, can exist at the same scale as the protocol that the internet is based on.&lt;/p&gt;

&lt;p&gt;The mission of Radix is to &lt;a href="https://youtu.be/Hw90aMyvLbM"&gt;give anyone, anywhere friction free access to the digital economy&lt;/a&gt;. To do this, it must be able to service the world without crippling costs or technical bottlenecks.&lt;/p&gt;

&lt;p&gt;This essentially means a stateful protocol that can work for over 7.5 billion people and 500 billion devices simultaneously. We built Radix to do exactly this, and to prove it we are running a series of throughput tests starting this week. These tests are built to simulate real-world conditions, with full transaction validation and without cutting any corners.&lt;/p&gt;

&lt;p&gt;How does this compare to what has come before?&lt;br&gt;
With the advent of the internet came the advent of digital commerce. Since then the world has needed an increasingly larger transactional throughput just to keep up with the needs of global and increasingly connected citizens:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QcaGVoDP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/2wpn0m8w2jj3dqclrmzy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QcaGVoDP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/2wpn0m8w2jj3dqclrmzy.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Early blockchain protocols broke this progression towards platforms that could function for an increasingly interconnected world. Radix provides a platform on which the next generation of digital-first companies can be built, and that can scale to every single person in the world.&lt;/p&gt;

&lt;h1&gt;
  
  
  What sort of use case requires this kind of throughput?
&lt;/h1&gt;

&lt;p&gt;Few individual use cases require that level of throughput, but as the throughput of a public ledger is shared by every single application built on top of it; the &lt;a href="https://www.bbc.co.uk/news/technology-42237162"&gt;cumulative throughput capacity&lt;/a&gt; is key.&lt;/p&gt;

&lt;p&gt;The simplest single use case for something of this scale and scope would be the issuance and use (domestic + international, consumer + enterprise + government) of the money of a nation.&lt;/p&gt;

&lt;p&gt;Such a system would remove the need for services such as Paypal, Visa, and Mastercard, as well as much of the back end systems that banks use today.&lt;/p&gt;

&lt;p&gt;Although the use case of money is only the very simplest of financial applications that can be built on Radix, it also forms the foundation of both economies and financial products, all of which can also be built more easily once money itself is programmable.&lt;/p&gt;

&lt;p&gt;To learn more about fiat token/digital cash issuance on Radix, &lt;a href="https://docs.radixdlt.com/alpha/learn/use-cases/fiat-tokens"&gt;please see our knowledge base&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  What dataset are you using to simulate this?
&lt;/h1&gt;

&lt;p&gt;For the first runs, we are testing the throughput of the Radix network using a verifiable data source that we have a lot of love and respect for the Bitcoin ledger transaction history.&lt;/p&gt;

&lt;p&gt;We picked the Bitcoin dataset because it is, like Radix, based on the &lt;a href="https://medium.com/vitelabs/understanding-the-utxo-transaction-model-of-bitcoin-part-1-1c0b9977632e"&gt;UTXO transaction model&lt;/a&gt;, which we can convert to Radix transactional entities (Atoms). For the duration of the test, anyone can search for their accounts and confirm their transaction history matching the real BTC ledger.&lt;/p&gt;

&lt;p&gt;We also liked it because there are 460 million bitcoin addresses; which is equivalent in number to the population of a large nation.&lt;/p&gt;

&lt;p&gt;Is this the maximum TPS Radix is capable of?&lt;br&gt;
This is by no means the maximum throughput of our platform, but it is definitely stretching it much further than we ever have tried before.&lt;/p&gt;

&lt;p&gt;As our scalability is based on sharding, the more shards the higher the transaction throughput possible. As Radix has a [fixed shard space of 18.4 quintillion shards[(&lt;a href="https://www.radixdlt.com/post/sharding-in-radix/"&gt;https://www.radixdlt.com/post/sharding-in-radix/&lt;/a&gt;), the maximum theoretical throughput is way more than could ever be used; even by the entire world.&lt;/p&gt;

&lt;p&gt;What does this blog cover?&lt;br&gt;
This blog covers what we did to set up these tests; plus how we got the Radix ledger to do full signature and UTXO validation of the entire Bitcoin transaction history, in less than 30 minutes.&lt;/p&gt;

&lt;p&gt;How big is the network?&lt;br&gt;
The first run of these tests concentrates on speed, rather than fault tolerance. As a result, the network consists of approximately 1,000 nodes, with minimal overlap; with each node servicing approximately 1/1,000th of the total ledger.&lt;/p&gt;

&lt;p&gt;The Radix consensus does not rely on active global consensus (POW/POS) but a form of shard level passive consensus based on the &lt;a href="https://youtu.be/wfsZuN6NaJo"&gt;progression of logical time&lt;/a&gt;. The lack of overlap does not mean that transactions are not being correctly validated, but it does prevent the network from being able to deal with significant Node dropout in this configuration.&lt;/p&gt;

&lt;p&gt;Should anyone wish to test the fault tolerance of the system by increasing the overlap on our test network, you can spin up your own version of the ledger from our test code on Github. We will also be testing this in the future, but it requires us to continuously request Google to give us enough nodes to test it with!&lt;/p&gt;

&lt;p&gt;Radix throughput test code: &lt;a href="https://github.com/radixdlt/mtps"&gt;https://github.com/radixdlt/mtps&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On Radix, a node with 8GB of RAM and 4 cores can process approximately 2,000 transactions per second, including full validation and gossiping. For this test, we needed some extra RAM to be able to process and cache the Bitcoin dataset, which raised the RAM requirements to 30GB and 8 cores, but is not representative of main-net requirements.&lt;/p&gt;

&lt;p&gt;What are the limitations?&lt;br&gt;
Redundancy in this test is configured using “shard groups” – the network has a fixed shard space of 18.4 quintillion shards and a Node can operate as much or little of the shard space as it likes (assuming it has enough resources). We spread the Nodes out in the shard space using “shard groups” – the smaller the shard groups, the larger the amount of shard space the node is covering. E.g. 1 shard group = 18.4 quintillion shards/100% of the ledger. 2 shard groups = 50% of the ledger per group etc. The more nodes per group, the greater the redundancy – e.g. 100 nodes + 2 shard groups would mean 49 node redundancy per group.&lt;/p&gt;

&lt;p&gt;For this test, we are running the network at low redundancy to get the most bang for our buck on Google Cloud. This means approximately 1,000 shard groups for 1,000 nodes. These shard groups overlap a little, but not by a huge amount. Each transaction touches on average 4.2 shards, meaning each transaction is validated and checked for double spends by an average of 4.2 nodes.&lt;/p&gt;

&lt;p&gt;In future tests, we will reconfigure the network to have increased redundancy, which will, therefore, have a lower maximum throughput on the network for the same node count. The fundamental limitation is how much money we are willing to spend on running these tests.&lt;/p&gt;

&lt;p&gt;Do you detect bad blocks?&lt;br&gt;
There are no blocks or mining on Radix – all Atoms (transactions/on ledger operations) are submitted and checked individually and are determined to be either valid or invalid on a per transaction basis (UTXO double spend check, signature validation, etc.).&lt;/p&gt;

&lt;p&gt;Because Radix state sharding has similar properties to Bitcoin’s UTXO model system (with the addition of smart contract like functionality), applying the Bitcoin transaction history with transaction validation and checks for double spends is relatively simple for us to hack into Radix – with the exception of non-standard Bitcoin scripts; where we had to get a bit more inventive – see the &lt;a href="https://github.com/radixdlt/mtps/tree/master/millionaire-dataset-preparator"&gt;millionare-dataset-preparator tool&lt;/a&gt; for more details.&lt;/p&gt;

&lt;p&gt;How do you stop a double spend?&lt;br&gt;
Transactions are individually validated – this is done using a combination of the Radix &lt;a href="https://docs.radixdlt.com/alpha/learn/platform/tempo#how-does-it-work-simplified"&gt;consensus layer&lt;/a&gt; (Tempo) and the programmable system of constraints that we can add using the &lt;a href="https://docs.radixdlt.com/alpha/learn/architecture/atom-structure"&gt;Atom Structure&lt;/a&gt; and the &lt;a href="https://docs.radixdlt.com/alpha/learn/architecture/constraint-machine"&gt;Constraint Machine&lt;/a&gt;. Together these are able to strictly order related transactions (e.g. from the same private key) and drop double spends.&lt;/p&gt;

&lt;p&gt;To understand how this works in a bit more detail; please see our [explainer video series here[(&lt;a href="https://www.youtube.com/watch?v=sW8nWeUnkK0&amp;amp;list=PLBGHv3uedRNTBeJNq90p-Ph3Yuc7imH-r"&gt;https://www.youtube.com/watch?v=sW8nWeUnkK0&amp;amp;list=PLBGHv3uedRNTBeJNq90p-Ph3Yuc7imH-r&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;The natively sharded structure of the Radix ledger is essential. Because the shard space is fixed and will never change, even once there are a very large number of people using the network, then it can also be used to help partition transactions and load balance the network.&lt;/p&gt;

&lt;p&gt;The main way this is done is via the public key of a wallet. On Radix, the public key of any address also tells you which shard it lives on. This has the very desirable property of automatically grouping together related transactions (all spends from the same key must happen on the same shard) and ungrouping unrelated transactions (two keys have a 1/(2^64) chance of being on the same shard).&lt;/p&gt;

&lt;p&gt;This means a node does not need to know about the whole ledger to check the validity of a specific spend; just the shard the key lives on. This is why we can do massively asynchronous processing of everything from application messages to Bitcoin transactions on Radix.&lt;/p&gt;

&lt;p&gt;A note on the Bitcoin dataset&lt;br&gt;
The Bitcoin fee model incentivizes grouping together as many transactions as possible in the same block. The Radix fee model will dis-incentivize this (we don’t have blocks). In this regard – although we can achieve a high transaction per second throughput on this data, the bitcoin dataset is not optimized for the Radix data architecture.&lt;/p&gt;

&lt;p&gt;For future tests we will be using a more traditional 1-to-1 transactional datasets from financial institutions and crypto-exchanges. This data will produce a friendlier dataset more aligned with the Radix architecture and better represent the vast majority of transactions we will be seeing on the Radix network.&lt;/p&gt;

&lt;h1&gt;
  
  
  Join The Radix Community
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://t.me/radix_dlt"&gt;Telegram&lt;/a&gt; for general chat&lt;br&gt;
&lt;a href="https://discord.gg/7Q7HSZZ"&gt;​Discord&lt;/a&gt; for developers chat&lt;br&gt;
&lt;a href="https://reddit.com/r/radix"&gt;​Reddit&lt;/a&gt; for general discussion&lt;br&gt;
&lt;a href="https://forum.radixdlt.com/"&gt;Forum&lt;/a&gt; for technical discussion&lt;br&gt;
​&lt;a href="https://twitter.com/radixdlt"&gt;Twitter&lt;/a&gt; for announcements&lt;br&gt;
&lt;a href="https://radixdlt.typeform.com/to/nyKvMV"&gt;​Email&lt;/a&gt; newsletter for weekly updates&lt;br&gt;
Mail to &lt;a href="//hello@radixdlt.com"&gt;hello@radixdlt.com&lt;/a&gt; for general enquiries&lt;/p&gt;

</description>
      <category>btc</category>
      <category>blockchain</category>
      <category>node</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>10 years of Bitcoin history, replayed in under 30 minutes</title>
      <dc:creator>Radix</dc:creator>
      <pubDate>Wed, 12 Jun 2019 17:13:30 +0000</pubDate>
      <link>https://dev.to/radixdlt/10-years-of-bitcoin-history-replayed-in-under-30-minutes-3e70</link>
      <guid>https://dev.to/radixdlt/10-years-of-bitcoin-history-replayed-in-under-30-minutes-3e70</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5EkBOGt3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ngu1x70v7s0izh6dk77g.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5EkBOGt3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ngu1x70v7s0izh6dk77g.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Today we replayed the entire 10 years of Bitcoin’s transaction history on the Radix ledger, with full transaction and signature validation, on a network of over 1,000 Nodes distributed evenly throughout the world.&lt;/p&gt;

&lt;p&gt;For the first time since the creation of public, trustless networks, we have demonstrated a technology that can truly support even the world’s most demanding transactional applications using.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NdAQaU_n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.radixdlt.com/wp-content/uploads/2019/06/design-7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NdAQaU_n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.radixdlt.com/wp-content/uploads/2019/06/design-7.png" alt="alt text" title="Comparison"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  The Result?
&lt;/h1&gt;

&lt;p&gt;The Radix ledger peaked at over 1 million transactions per second, a record for decentralized ledgers. It is even faster than other centralized and established payment processors like Alipay, WeChat and PayPal to name a few. The whole dataset was processed in under 30 minutes. &lt;/p&gt;

&lt;p&gt;We were able to achieve this due to Radix’s unique design. Instead of using Blockchains or DAGs, we started from scratch, building a new database and consensus mechanism called Tempo that can scale to support 7.5 billion people and 500 billion devices, simultaneously. &lt;/p&gt;

&lt;p&gt;After 7 years of research and development, many dead ends and sleepless nights, today represents a significant milestone in the Radix journey. We can proudly say we’ve built a full state-sharded decentralized ledger that is massively scalable without compromising on security.&lt;/p&gt;

&lt;p&gt;To validate our engineering we have decided to run a series of public network throughput tests in an open, transparent manner, that anyone can verify and see happen live.&lt;/p&gt;

&lt;p&gt;We decided to use Bitcoin as our data source because it has processed a large number of transactions over the last decade (over 400 million transactions and 460 million addresses) and is an open, fair and transparent data set.&lt;/p&gt;

&lt;p&gt;As a comparison, you could run applications like VISA, PayPal, WhatsApp, WeChat and more, simultaneously on the Radix ledger, without breaking a sweat.&lt;/p&gt;

&lt;p&gt;The first public test happened today 14.30 London time.&lt;/p&gt;

&lt;p&gt;The time and date of our next live test can be seen on our explorer. Make sure you also have your bitcoin addresses ready, as when the test is running you will be able to add in your address and see your transaction history replayed in real time.&lt;/p&gt;

&lt;p&gt;These tests will run approximately every week from now!  Please sign up to the Radix newsletter and get notified before the next test starts: &lt;a href="https://radixdlt.typeform.com/to/x3yotG"&gt;https://radixdlt.typeform.com/to/x3yotG&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Interested in how we did it? &lt;/p&gt;

&lt;p&gt;The following technical blog posts explain our methodology and the step-by-step chronology of how we achieved this throughput.&lt;/p&gt;

&lt;p&gt;Part 1: &lt;a href="http://www.radixdlt.com/post/test-method-part1/"&gt;A primer on the scalability test and Radix (non-technical)&lt;/a&gt;&lt;br&gt;
Part 2: &lt;a href="http://www.radixdlt.com/post/test-method-part2/"&gt;How we actually built the scalability test (technical)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lastly, if you have any questions, or just want to follow us as we go towards the mainnet, please join the conversation with our community on &lt;a href="https://t.me/radix_dlt"&gt;Telegram&lt;/a&gt; or use the #1MTPS on &lt;a href="https://twitter.com/radixdlt"&gt;Twitter&lt;/a&gt; to share your opinions.&lt;/p&gt;

</description>
      <category>dlt</category>
      <category>blockchain</category>
      <category>node</category>
      <category>signatures</category>
    </item>
    <item>
      <title>Radix DLT - live scalability test</title>
      <dc:creator>Radix</dc:creator>
      <pubDate>Tue, 11 Jun 2019 18:01:14 +0000</pubDate>
      <link>https://dev.to/radixdlt/radix-dlt-live-scalability-test-5gjj</link>
      <guid>https://dev.to/radixdlt/radix-dlt-live-scalability-test-5gjj</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9q9Mxdzm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/1he53ttiox7ni1sqorr8.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9q9Mxdzm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/1he53ttiox7ni1sqorr8.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Hi everyone!
&lt;/h1&gt;

&lt;p&gt;In case you didn’t know, we are running a scalability test tomorrow, 14:30 #London time, replaying BTC history! Subscribe here to get notified tomorrow  - &lt;a href="https://radixdlt.typeform.com/to/x3yotG"&gt;https://radixdlt.typeform.com/to/x3yotG&lt;/a&gt; &lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>dlt</category>
      <category>node</category>
      <category>test</category>
    </item>
    <item>
      <title>Radix Universe Visualizer</title>
      <dc:creator>Radix</dc:creator>
      <pubDate>Fri, 07 Jun 2019 15:37:24 +0000</pubDate>
      <link>https://dev.to/radixdlt/radix-universe-visualizer-3kee</link>
      <guid>https://dev.to/radixdlt/radix-universe-visualizer-3kee</guid>
      <description>&lt;h1&gt;
  
  
  Radix Universe Visualizer
&lt;/h1&gt;

&lt;p&gt;At Radix we like to think big, a useful mindset when trying to create a fast and scalable ledger that can support billions of people. With that in mind, Edgars and I (Stephen Thornton) decided to try and build something that would let us view the entire universe. However, since we were limited to just one day, we instead built a Universe Visualizer that would let us view in real-time all of the network activity and atoms in the Radix universe. This had been something Edgar had been wanting to build on Radix for a long time and was something we both agreed would both be useful. Most importantly, we also thought it would be exceptionally cool.&lt;/p&gt;

&lt;h1&gt;
  
  
  What is it?
&lt;/h1&gt;

&lt;p&gt;The day started inauspiciously, with our hotel serving one of the worst cups of coffee either of us had ever had the misfortune of trying. However, a quick trip into town to get some decent real coffee gave us the time to further brainstorm our ideas. We agreed that we wanted to build something that showed how atoms were being stored across the network in real-time but were unsure of the best way to present it. Some of our initial ideas were quickly discarded due to lacking the physical devices necessary, including using a ‘Palantir’ style model in which we could project a multi-dimensional network view onto a spherical touch-screen display unit, as well as a virtual reality device.&lt;/p&gt;

&lt;p&gt;After running through a number of ambitious ideas, we eventually decided to build the visualizer to run on a normal browser, using JavaScript. We had something of an advantage in choosing this route since Edgar was the person who wrote the Radix JavaScript library. We divided the project into three parts:&lt;/p&gt;

&lt;p&gt;We used the JavaScript library to twang atoms into the ledger and observe them moving about&lt;br&gt;
Taking this information, we needed to form some graphical representations of what was happening with them&lt;br&gt;
In addition to graphics, we wanted to use sound effects to augment the experience&lt;br&gt;
Edgar took on the first section, while I took the lead on the second. Our inspiration was the idea of a giant pinball table, with atoms rattling madly around the nodes, ringing bells and leaving neon trails like a bad acid trip. Unfortunately for the world, our artists and graphics designers were otherwise engaged so we had to make do with my own talents. I quickly discovered that the two.js graphics library is versatile and easy to use JavaScript library. Using this, I cobbled together some basic graphics that depicted observed events.&lt;/p&gt;

&lt;p&gt;We then turned our attention to the sound, which we were both most excited for; supernova explosions when conflicts are detected, choirs of angels singing when a conflict is resolved. If we had more time (and weren’t subject to licensing restrictions) we would have included an R2-D2 voiceover to provide a running commentary.&lt;/p&gt;

&lt;p&gt;We were delighted to be awarded third place for our efforts. The only downside was that due to the limited test network we had to work with on the day, we weren’t able to showcase the full visual and audio experience that we had crafted. However, since the hackathon we have been able to trial the Visualizer using a much larger network:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AI9ymj1N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.radixdlt.com/wp-content/uploads/2019/06/Screenshot-2019-04-10-at-10.25.08.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AI9ymj1N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.radixdlt.com/wp-content/uploads/2019/06/Screenshot-2019-04-10-at-10.25.08.png" alt="alt text" title="Visualizer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---QxAQmKl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.radixdlt.com/wp-content/uploads/2019/06/Screenshot-2019-04-10-at-10.22.36.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---QxAQmKl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.radixdlt.com/wp-content/uploads/2019/06/Screenshot-2019-04-10-at-10.22.36.png" alt="alt text" title="Visualizer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  How does it work?
&lt;/h1&gt;

&lt;p&gt;The above describes what we built but for those keen to understand how it works, the basic idea is that:&lt;/p&gt;

&lt;p&gt;-The browser app generates a new Radix account for itself&lt;br&gt;
-It then connects to every node in the network using the radixdlt.js library&lt;br&gt;
-When you click on a node, it submits an atom to that node&lt;br&gt;
-Each node then lets the browser app know when it has received the atom, displaying the path it has taken based on the temporal proof in the atom sighting that has been reported&lt;br&gt;
-The path is different every time because the next hop in a temporal proof is determined randomly, eight nodes from the originator, binary branching from then on&lt;br&gt;
-If you click on other nodes, it submits conflicting atoms&lt;br&gt;
-When a node resolves the conflict, it also tells the app that an atom has been rejected due to the conflict&lt;br&gt;
-The aforementioned audio plays when appropriate events are triggered&lt;/p&gt;

&lt;p&gt;For the technically minded, we will be publishing the code and do a brief run through of how the code works when the betanet is made public.&lt;/p&gt;

&lt;p&gt;Have questions? Message me or Edgars on the Radix discord group (Discord), or you can ask them in our telegram channel (&lt;a href="https://t.me/radix_dlt"&gt;https://t.me/radix_dlt&lt;/a&gt;) as well.&lt;/p&gt;

&lt;p&gt;Subscribe to our mailing list to get notified when we hit major milestones – &lt;a href="https://radixdlt.typeform.com/to/nyKvMV?source=networkvisualizer"&gt;https://radixdlt.typeform.com/to/nyKvMV?source=networkvisualizer&lt;/a&gt; &lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>javascript</category>
      <category>hackathon</category>
      <category>dlt</category>
    </item>
    <item>
      <title>JSON-RPC vs REST for distributed platform APIs</title>
      <dc:creator>Radix</dc:creator>
      <pubDate>Thu, 06 Jun 2019 12:57:16 +0000</pubDate>
      <link>https://dev.to/radixdlt/json-rpc-vs-rest-for-distributed-platform-apis-3n0m</link>
      <guid>https://dev.to/radixdlt/json-rpc-vs-rest-for-distributed-platform-apis-3n0m</guid>
      <description>&lt;h1&gt;
  
  
  What is REST?
&lt;/h1&gt;

&lt;p&gt;You have probably read about REST a thousand times, but here we go once again:&lt;/p&gt;

&lt;p&gt;Let’s start by saying that REST stands for Representational State Transfer, and essentially refers to a style of web architecture that governs the behavior of both client and server.&lt;/p&gt;

&lt;p&gt;An API that adheres to the principles of REST doesn’t require the client to know anything about the structure of the API. Rather, the server needs to provide whatever information the client needs to interact with the service. A form in HTML is a clear example of this: the server specifies the location of the resource and the required fields. The browser doesn’t know in advance where to submit the information neither what information to submit. Both forms of information are entirely supplied by the server [1].&lt;/p&gt;

&lt;p&gt;REST APIs are everywhere, and distributed ledger technologies are no exception. This is a general example for getting the hash of the latest block added to the Bitcoin blockchain using the &lt;a href="https://blockchain.info/api"&gt;Bitcoin Rest API&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Request
curl -X GET https://blockchain.info/q/latesthash
// Result
0000000000000000002d9c2483cd87685ef41e7b8d1ca718206120e9b1bfee43
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  So, what about JSON-RPC?
&lt;/h1&gt;

&lt;p&gt;RPC stands for Remote Procedure Call and is a protocol that one program can use to request a service from a program located in another computer on a network without having to understand the network’s details. RPC uses the client-server model. The requesting program is a client and the service providing program is the server. Like a regular or local procedure call, an RPC is a synchronous operation requiring the requesting program to be suspended until the results of the remote procedure are returned. Nevertheless, the use of lightweight processes or threads that share the same address space allows multiple RPCs to be executed concurrently [2][3].&lt;/p&gt;

&lt;p&gt;The concept of RPC has been around the software development world for over half a century (yea, time flies), but despite that fact, it is still not as widely known as would be expected for something that enduring.&lt;/p&gt;

&lt;p&gt;That being said, it is actually not so surprising, taking into account that most of the current software is web-based, and REST was actually designed with the web-first mindset. When REST came out, RPC APIs were still using XML, and this was problematic. In XML, many attributes are just strings and it’s necessary to ensure the datatypes by adding a metadata layer describing things such as which fields are of which type.&lt;/p&gt;

&lt;p&gt;Nowadays, many known decentralised platforms use JSON-RPC based APIs: &lt;a href="https://github.com/ethereum/wiki/wiki/JSON-RPC"&gt;Ethereum&lt;/a&gt;, &lt;a href="https://ripple.com/build/rippled-apis/#websocket-and-json-rpc-apis"&gt;Ripple&lt;/a&gt; and &lt;a href="https://en.bitcoin.it/wiki/API_reference_(JSON-RPC)"&gt;Bitcoin&lt;/a&gt; among others.&lt;/p&gt;

&lt;p&gt;Here we can see an example of how to use Ethereum’s JSON-RPC API to get the balance of a given account:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Request
curl -X POST —data ‘{
  “jsonrpc”: “2.0”,
  “method”: “eth_getBalance”,
  “params”: [ "0x407d73d8a49eeb85d32cf465507dd71d507100c1" , "latest" ],
  "id": 1
}’
// Response
{
  "jsonrpc": "2.0",
  "result": "0x0234c8a3397aab58" // 158972490234375000,
  "id": 1
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  But why JSON-RPC for distributed ledger technologies APIs? [5][6]
&lt;/h1&gt;

&lt;h1&gt;
  
  
  Agnostic to the protocol
&lt;/h1&gt;

&lt;p&gt;It is hard to emphasise this point enough. If I had to select only one reason why I would choose JSON-RPC over REST is the fact that with JSON-RPC we can have APIs out-of-the-box with which the clients can communicate using any protocol. This has the extra benefit of allowing us to improve the performance of our API using pure TCP (or WebSockets) and removing the HTTP overhead.&lt;/p&gt;

&lt;h1&gt;
  
  
  REST verbs are limited
&lt;/h1&gt;

&lt;p&gt;In order to execute an operation using REST it’s necessary to define an HTTP method such as GET (default), PUT, POST, PATH or DELETE [4]. But as the name of this methods suggest, REST is CRUD operations oriented. So what happens if this doesn’t meet our needs? An example could be if we have to validate an entity before saving it. Although there’s always a workaround to solve this kind of issues in REST, the truth is that we don’t want to go down that path if we know there’s a better alternative: JSON-RPC.&lt;/p&gt;

&lt;p&gt;With the REST approach we will end up having something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Request
curl -X POST https://localhost:8080/api/entity/validate —data ‘{…}’
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;But this looks completely counter-intuitive since we are exposing an action as a false resource. On the other hand if we go with JSON-RPC the result will be much more self-explanatory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Request
curl -X POST --data '{
  "jsonrpc": "2.0",
  "method": “validateEntity”,
  "params": [ {…} ],
  "id": 1
}’ https://localhost:8080/api
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;We have a clear winner.&lt;/p&gt;

&lt;h1&gt;
  
  
  Passing parameters is complicated
&lt;/h1&gt;

&lt;p&gt;There’re four ways of passing arguments using REST: HTTP Headers, HTTP Body, URL path and URL query.&lt;/p&gt;

&lt;h1&gt;
  
  
  URL Query:
&lt;/h1&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Request
curl -X PUT https://localhost:8080/api/users?name=Piers
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  URL Path:
&lt;/h1&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Request
curl -X PUT https://localhost:8080/api/users/Stephen
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  HTTP Body:
&lt;/h1&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Request
curl -X PUT https://localhost:8080/api/users { “name”: “Josh” }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;This can be a bit overwhelming, and sometimes we’re not sure which one to use; but JSON-RPC is here to help us sort this out since it offers a simpler way:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Request
curl -X POST —data ‘[{
  "jsonrpc": "2.0",
  “method”: “addUser”,
  “params”: { “name”: “Angad” },
  “id”: 1
}]’ https://localhost:8080/api
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  Batch actions
&lt;/h1&gt;

&lt;p&gt;In REST there’s not a simple and nice way of making batch requests, but with JSON-RPC this is a piece of cake:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Request
curl -X POST—data ‘[{
  "jsonrpc": "2.0",
  “method”: “addUser”,
  “params”: { “name”: “Zalan” },
  “id”: 1
}, {
  "jsonrpc": "2.0",
  “method”: “addUser”,
  “params”: { “name”: “Dan” },
  “id”: 1
}, {
  "jsonrpc": "2.0",
  “method”: “addUser”,
  “params”: { “name”: “Edgars” }
}]’ https://localhost:8080/api

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  Other benefits of JSON-RPC
&lt;/h1&gt;

&lt;p&gt;In addition to the above, here are a few other benefits of RPC over REST:&lt;/p&gt;

&lt;p&gt;-Only one method to send a request – usually POST for HTTP or send for WebSockets.&lt;br&gt;
-The content of the request is completely separated to the transmission mechanism. All errors, warnings, and data are in the payload of the request.&lt;br&gt;
-Use only one response code to confirm the correct reception of a message – usually 200 OK for HTTP.&lt;br&gt;
-Can be easily ported or shared among different transmission channels such as HTTP/S, WebSockets, XMPP, telnet, SFTP, SCP, or SSH.&lt;/p&gt;

&lt;p&gt;The separation of message and transmission channel in a JSON-pure API results in an API that is usually faster, and almost always more reliable, easier to use, easier to port, and easier to debug [7].&lt;/p&gt;

&lt;h1&gt;
  
  
  Summary
&lt;/h1&gt;

&lt;p&gt;The debate of using JSON-RPC over REST is an interesting one, and the usual response is: “it depends”. Both of them are architectural styles for serving content remotely, using a client-server model. There is also no reason for not using RPC and REST at the same time, but you should have a good argument for doing so.&lt;/p&gt;

&lt;p&gt;At Radix we think that if you have to serve web content it may be more convenient to go for a REST API approach, since it has been built to work over HTTP, and there’re many available frameworks and libraries out there that will allow you have a minimum viable API set up in a few hours.&lt;/p&gt;

&lt;p&gt;But the truth is that if the API you’re building is more complex to model (HTTP verbs are not enough), it requires to work over other transmission channels and/or maintain a connection open (WebSockets), or the performance is critical, then is better to go with JSON-RPC. In the distributed ledger technologies universe the performance is a fundamental factor, and in Radix much more, since we are already needing to handling thousands of transactions per second on our test nets.&lt;/p&gt;

&lt;p&gt;[1] &lt;a href="https://stackoverflow.com/questions/671118/what-exactly-is-restful-programming"&gt;https://stackoverflow.com/questions/671118/what-exactly-is-restful-programming&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[2] &lt;a href="https://en.wikipedia.org/wiki/Remote_procedure_call"&gt;https://en.wikipedia.org/wiki/Remote_procedure_call&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[3] &lt;a href="https://searchmicroservices.techtarget.com/definition/Remote-Procedure-Call-RPC"&gt;https://searchmicroservices.techtarget.com/definition/Remote-Procedure-Call-RPC&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[4] &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods"&gt;https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[5] &lt;a href="http://wookieb.pl/why-you-should-consider-rpc-for-internal-api"&gt;http://wookieb.pl/why-you-should-consider-rpc-for-internal-api&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[6] &lt;a href="https://www.smashingmagazine.com/2016/09/understanding-rest-and-rpc-for-http-apis/"&gt;https://www.smashingmagazine.com/2016/09/understanding-rest-and-rpc-for-http-apis/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[7] &lt;a href="https://mmikowski.github.io/the_lie/"&gt;https://mmikowski.github.io/the_lie/&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Join The Radix Community
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://t.me/radix_dlt"&gt;Telegram&lt;/a&gt; for general chat&lt;br&gt;
&lt;a href="https://discord.gg/7Q7HSZZ"&gt;​Discord&lt;/a&gt; for developers chat&lt;br&gt;
&lt;a href="https://reddit.com/r/radix"&gt;​Reddit&lt;/a&gt; for general discussion&lt;br&gt;
&lt;a href="https://forum.radixdlt.com/"&gt;Forum&lt;/a&gt; for technical discussion&lt;br&gt;
​&lt;a href="https://twitter.com/radixdlt"&gt;Twitter&lt;/a&gt; for announcements&lt;br&gt;
&lt;a href="https://radixdlt.typeform.com/to/nyKvMV"&gt;​Email&lt;/a&gt; newsletter for weekly updates&lt;br&gt;
Mail to &lt;a href="//hello@radixdlt.com"&gt;hello@radixdlt.com&lt;/a&gt; for general enquiries&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>dlt</category>
      <category>json</category>
      <category>rest</category>
    </item>
    <item>
      <title>Radix DLT - Alpha desktop wallet API documentation</title>
      <dc:creator>Radix</dc:creator>
      <pubDate>Wed, 05 Jun 2019 13:30:03 +0000</pubDate>
      <link>https://dev.to/radixdlt/radix-dlt-alpha-desktop-wallet-api-documentation-277</link>
      <guid>https://dev.to/radixdlt/radix-dlt-alpha-desktop-wallet-api-documentation-277</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;The Radix Wallet provides a localhost websocket server which allows any application running either natively or in the browser to perform actions on the ledger through the user's wallet without the user exposing their private keys to the application.&lt;/p&gt;

&lt;p&gt;These actions include sending and receiving transactions, messages and custom application data.&lt;/p&gt;

&lt;p&gt;The user must explicitly approve any application that wants to do this.&lt;/p&gt;

&lt;h1&gt;
  
  
  Overview
&lt;/h1&gt;

&lt;p&gt;The server is running at ws://localhost:54345&lt;/p&gt;

&lt;p&gt;It is a JsonRPC 2.0 server.&lt;/p&gt;

&lt;p&gt;Before making any requests, an application must register it's permissions. This will prompt the user with a dialog to give your app permission to do certain things. If successful, this request will return a token used for authenticating any further request. The lifetime of the token is 30min and it is reset after every successful request.&lt;/p&gt;

&lt;p&gt;Afterwards, include the token as &lt;code&gt;token&lt;/code&gt; in the request parameters.&lt;/p&gt;

&lt;h1&gt;
  
  
  API
&lt;/h1&gt;

&lt;h1&gt;
  
  
  Register
&lt;/h1&gt;

&lt;p&gt;Register your application. The user will see a popup with your application details and can either approve or deny your access.&lt;/p&gt;

&lt;p&gt;method: &lt;code&gt;register&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;params:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
name: 'Cashgrab',
description: 'Takes all your money, I don't even know why you would accept this',
permissions: [
  'address',
  'balance',
  'send_transactions'
  ]
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Successful response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
result: { token: 'asdfg' }
...
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  Ping
&lt;/h1&gt;

&lt;p&gt;Check if the Radix Wallet is running and whether a token is still valid.&lt;/p&gt;

&lt;p&gt;method: &lt;code&gt;ping&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;params:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
token: 'asdfg'
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Successful response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
result: 'pong'
...
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  Send Transaction
&lt;/h1&gt;

&lt;p&gt;Returns the hid of the sent atom&lt;/p&gt;

&lt;p&gt;method: &lt;code&gt;send_transaction&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;permissions: &lt;code&gt;['send_transactions']&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;params:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
token: 'asdfgh',
recipient: '9i9hgAyBQuKvkw7Tg5FEbML59gDmtiwbJwAjBgq5mAU4iaA1ykM',
asset: 'TEST',
quantity: 123.45
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Successful response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
result: {hid: 123}
...
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  Send Message
&lt;/h1&gt;

&lt;p&gt;Send a chat message. Returns the hid of the sent atom.&lt;/p&gt;

&lt;p&gt;method: &lt;code&gt;send_message&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;permissions: &lt;code&gt;['send_messages']&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;params:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
token: 'asdfgh',
recipient: '9i9hgAyBQuKvkw7Tg5FEbML59gDmtiwbJwAjBgq5mAU4iaA1ykM',
message: 'Hi honey, I'm home'
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Successful response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
result: {hid: 123}
...
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  Send application message
&lt;/h1&gt;

&lt;p&gt;Send an application message. Application messages allow storing arbitrary data on the ledger. Returns the hid of the sent atom&lt;/p&gt;

&lt;p&gt;method: &lt;code&gt;address&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;permissions: &lt;code&gt;['address']&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;params:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
token: 'asdfgh',
application_id: 'custom-app',
recipients: [
  '9egJPK7zk2LhPok8VM4noAwVGGS7LKtvTYGJvtF41wrwZAMxjKj',
  '9hFccFfB3Y3A7gToBcD3b9y1ZRnoZfSdHTWVdRPCn3zpKSoVubf',
 ],
payload: {//anything}
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Successful response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
result: {
  result: {hid: 123}
  }
...
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  Get Balance
&lt;/h1&gt;

&lt;p&gt;This is a subscription that will send you an update every time the balance is updated&lt;/p&gt;

&lt;p&gt;method: &lt;code&gt;balance&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;permissions: &lt;code&gt;['balance']&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;params:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
token: 'asdfgh',
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Successful response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
result: 'OK'
...
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Update notification:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
jsonrpc: '2.0',
method: 'balance.update',
params: { balance: {TEST: 123.45} }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  Get Transactions
&lt;/h1&gt;

&lt;p&gt;This is a subscription that will send you an update every time a new transaction occurs&lt;/p&gt;

&lt;p&gt;method: &lt;code&gt;transactions&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;permissions: &lt;code&gt;['transactions']&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;params:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
token: 'asdfgh',
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Successful response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
result: 'OK'
...
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Update notification:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
jsonrpc: '2.0',
method: 'transaction.update',
params: { //transaction details }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  Get Messages
&lt;/h1&gt;

&lt;p&gt;This is a subscription that will send you an update every time a new message is sent or received&lt;/p&gt;

&lt;p&gt;method: &lt;code&gt;messages&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;permissions: &lt;code&gt;['messages']&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;params:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
token: 'asdfgh',
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Successful response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
result: 'OK'
...
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Update notification:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
jsonrpc: '2.0',
method: 'message.update',
params: { //message details }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  Get Application Messages
&lt;/h1&gt;

&lt;p&gt;This is a subscription that will send you an update every time a new message is sent or received&lt;/p&gt;

&lt;p&gt;method: &lt;code&gt;application_messages&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;permissions: &lt;code&gt;['application_messages']&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;params:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
token: 'asdfgh',
application_id: 'custom-app'
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Successful response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
result: 'OK'
...
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Update notification:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
jsonrpc: '2.0',
method: 'application_message.update',
params: { 
  applicationId: 'custom-app',
  payload: {//anything}
 }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  Join The Radix Community
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://t.me/radix_dlt"&gt;Telegram&lt;/a&gt; for general chat&lt;br&gt;
&lt;a href="https://discord.gg/7Q7HSZZ"&gt;​Discord&lt;/a&gt; for developers chat&lt;br&gt;
&lt;a href="https://reddit.com/r/radix"&gt;​Reddit&lt;/a&gt; for general discussion&lt;br&gt;
&lt;a href="https://forum.radixdlt.com/"&gt;Forum&lt;/a&gt; for technical discussion&lt;br&gt;
​&lt;a href="https://twitter.com/radixdlt"&gt;Twitter&lt;/a&gt; for announcements&lt;br&gt;
&lt;a href="https://radixdlt.typeform.com/to/nyKvMV"&gt;​Email&lt;/a&gt; newsletter for weekly updates&lt;br&gt;
Mail to &lt;a href="//hello@radixdlt.com"&gt;hello@radixdlt.com&lt;/a&gt; for general enquiries&lt;/p&gt;

</description>
      <category>dlt</category>
      <category>blockchain</category>
      <category>wallet</category>
      <category>api</category>
    </item>
    <item>
      <title>Radix DLT - Android wallet</title>
      <dc:creator>Radix</dc:creator>
      <pubDate>Tue, 04 Jun 2019 14:24:47 +0000</pubDate>
      <link>https://dev.to/radixdlt/radix-dlt-android-wallet-2b45</link>
      <guid>https://dev.to/radixdlt/radix-dlt-android-wallet-2b45</guid>
      <description>&lt;p&gt;The Radix DLT Android Wallet currently works with the live ALPHANET universe and interacts with it by making full use of the latest release of the &lt;a href="https://github.com/radixdlt/radixdlt-kotlin"&gt;radixdlt-kotlin library&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The App is a work in progress and will soon be migrated to use the new version of our network.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SmZxNqgP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/radixdlt/radixdlt-wallet-android/raw/master/art/unlock_wallet.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SmZxNqgP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/radixdlt/radixdlt-wallet-android/raw/master/art/unlock_wallet.jpg" alt="alt text" title="Wallet"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zBnt-Qpg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/radixdlt/radixdlt-wallet-android/raw/master/art/transactions_screen.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zBnt-Qpg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/radixdlt/radixdlt-wallet-android/raw/master/art/transactions_screen.jpg" alt="alt text" title="Wallet"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Wd4nDjNz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/radixdlt/radixdlt-wallet-android/raw/master/art/contacts_screen.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Wd4nDjNz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/radixdlt/radixdlt-wallet-android/raw/master/art/contacts_screen.jpg" alt="alt text" title="Wallet"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Android development
&lt;/h1&gt;

&lt;p&gt;-Mostly written in &lt;a href="https://kotlinlang.org/"&gt;Kotlin&lt;/a&gt; (A few classes are in Java but will be converted to keep it 100% Kotlin)&lt;br&gt;
-Uses &lt;a href="https://developer.android.com/topic/libraries/architecture/"&gt;Architecture Components&lt;/a&gt;: Room, LiveData and Lifecycle-components&lt;br&gt;
-Uses &lt;a href="https://google.github.io/dagger/android.html"&gt;dagger-android&lt;/a&gt; for dependency injection&lt;br&gt;
-Uses &lt;a href="https://github.com/ReactiveX/RxJava"&gt;RxJava 2&lt;/a&gt; (Included by default by the radixdlt libs)&lt;/p&gt;
&lt;h1&gt;
  
  
  Development setup
&lt;/h1&gt;

&lt;p&gt;Use Android Studio 3.2.1 (or newer) to be able to build the app.&lt;/p&gt;

&lt;p&gt;The app is currently using the latest release of the &lt;a href="https://github.com/radixdlt/radixdlt-kotlin"&gt;radixdlt-kotlin&lt;/a&gt; library. It is possible to replace it with the &lt;a href="https://github.com/radixdlt/radixdlt-java"&gt;radixdlt-java&lt;/a&gt; library but you will need to target newer android devices &amp;gt;= API 24. Also, a few simple changes in the code are required and the dependency to &lt;a href="https://github.com/ReactiveX/RxKotlin"&gt;rxkotlin&lt;/a&gt; must be included in your gradle file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;implementation(group: 'io.reactivex.rxjava2', name: 'rxkotlin', version: '2.2.0') {
    exclude group: 'io.reactivex.rxjava2', module: 'rxjava'
    exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib'
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  Code style
&lt;/h1&gt;

&lt;p&gt;This project uses &lt;a href="https://github.com/shyiko/ktlint"&gt;ktlint&lt;/a&gt; via &lt;a href="https://gradle.org/"&gt;Gradle&lt;/a&gt; dependency. To check code style - &lt;code&gt;gradle ktlint&lt;/code&gt; (it's also bound to &lt;code&gt;gradle check&lt;/code&gt;).&lt;/p&gt;

&lt;h1&gt;
  
  
  Contribute
&lt;/h1&gt;

&lt;p&gt;Contributions are welcome, we simply ask to:&lt;/p&gt;

&lt;p&gt;-Fork the codebase&lt;br&gt;
-Make changes&lt;br&gt;
-Submit a pull request for review&lt;br&gt;
When contributing to this repository, we recommend to discuss the change you wish to make via issue, email, or any other method with the owners of this repository before making a change.&lt;/p&gt;

&lt;p&gt;Please follow our &lt;a href="https://github.com/radixdlt/radixdlt-wallet-android/blob/master/CODE_OF_CONDUCT.md"&gt;Code of Conduct&lt;/a&gt; in all your interactions with the project.&lt;/p&gt;

&lt;p&gt;The code is available in our &lt;a href="https://github.com/radixdlt/radixdlt-wallet-android"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Join The Radix Community
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://t.me/radix_dlt"&gt;Telegram&lt;/a&gt; for general chat&lt;br&gt;
&lt;a href="https://discord.gg/7Q7HSZZ"&gt;​Discord&lt;/a&gt; for developers chat&lt;br&gt;
&lt;a href="https://reddit.com/r/radix"&gt;​Reddit&lt;/a&gt; for general discussion&lt;br&gt;
&lt;a href="https://forum.radixdlt.com/"&gt;Forum&lt;/a&gt; for technical discussion&lt;br&gt;
​&lt;a href="https://twitter.com/radixdlt"&gt;Twitter&lt;/a&gt; for announcements&lt;br&gt;
&lt;a href="https://radixdlt.typeform.com/to/nyKvMV"&gt;​Email&lt;/a&gt; newsletter for weekly updates&lt;br&gt;
Mail to &lt;a href="//hello@radixdlt.com"&gt;hello@radixdlt.com&lt;/a&gt; for general enquiries&lt;/p&gt;

</description>
      <category>dlt</category>
      <category>blockchain</category>
      <category>android</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
