<?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: Vasileios Dionysopoulos</title>
    <description>The latest articles on DEV Community by Vasileios Dionysopoulos (@vdionisopoulos).</description>
    <link>https://dev.to/vdionisopoulos</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4210344%2F0bff08d4-5919-4ffd-b76e-ace4285956c8.png</url>
      <title>DEV Community: Vasileios Dionysopoulos</title>
      <link>https://dev.to/vdionisopoulos</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vdionisopoulos"/>
    <language>en</language>
    <item>
      <title>Do You Need a Blockchain? Ten Years of Banking Already Answered</title>
      <dc:creator>Vasileios Dionysopoulos</dc:creator>
      <pubDate>Tue, 27 Oct 2026 08:51:41 +0000</pubDate>
      <link>https://dev.to/vdionisopoulos/do-you-need-a-blockchain-ten-years-of-banking-already-answered-3h8p</link>
      <guid>https://dev.to/vdionisopoulos/do-you-need-a-blockchain-ten-years-of-banking-already-answered-3h8p</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://cloudtales.gr/blockchain-in-finance-reality-check/" rel="noopener noreferrer"&gt;CloudTales&lt;/a&gt;, where the article also has an audio version.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Every year or two, someone asks me whether a project should “go on the blockchain”. Sometimes it is a bank, sometimes a public body, and once it was a loyalty programme. The question always arrives with a lot of enthusiasm and very few requirements.&lt;/p&gt;

&lt;p&gt;In financial services we no longer have to guess the answer. Banks, exchanges and central banks ran the experiment at scale for ten years, with real budgets. This post turns those results into a short checklist. Then it shows what I build when the honest answer is “no”: a tamper-evident ledger table on Azure SQL that you can try for free in about fifteen minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The checklist
&lt;/h2&gt;

&lt;p&gt;These are the questions I ask, in this order:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkd69ehurktr4vs058e08.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkd69ehurktr4vs058e08.png" alt="Do you need a distributed ledger? Decision flow" width="799" height="671"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most requests stop at the first or second box. The rest usually end at the last one: the client does not need a shared ledger at all. They need to show an auditor that nobody, including their own DBAs, quietly changed a record.&lt;/p&gt;

&lt;h2&gt;
  
  
  What ten years of banking says
&lt;/h2&gt;

&lt;p&gt;In 2016 the World Economic Forum said blockchain would become the “beating heart” of the global financial system. &lt;a href="https://www.weforum.org/press/2016/08/blockchain-will-become-beating-heart-of-the-global-financial-system/" rel="noopener noreferrer"&gt;[1]&lt;/a&gt; Here is how the big bets turned out.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Bet&lt;/th&gt;
&lt;th&gt;Outcome&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Rebuild an exchange's settlement on DLT&lt;/td&gt;
&lt;td&gt;ASX cancelled its CHESS replacement in 2022 and wrote off A$245–255m before tax. &lt;a href="https://www.theblock.co/post/187809/asx-cancels-years-long-blockchain-settlement-and-clearing-system-project" rel="noopener noreferrer"&gt;[2]&lt;/a&gt; The replacement it chose in 2023 is a conventional platform. &lt;a href="https://www.marketsmedia.com/asx-chooses-chess-replacement" rel="noopener noreferrer"&gt;[3]&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bank consortia for trade finance&lt;/td&gt;
&lt;td&gt;we.trade became insolvent in 2022, Marco Polo in 2023. Contour closed the same year; it was reportedly processing 60–70 transactions a month. &lt;a href="https://www.ledgerinsights.com/contour-blockchain-trade-finance-network-shutter/" rel="noopener noreferrer"&gt;[4]&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Faster securities settlement&lt;/td&gt;
&lt;td&gt;The US moved to T+1 in May 2024 &lt;a href="https://www.sec.gov/news/press-release/2024-62" rel="noopener noreferrer"&gt;[5]&lt;/a&gt; and the EU follows in October 2027. &lt;a href="https://finreg.aoshearman.com/regulation-to-shorten-settlement-cycle-to-t1-publ" rel="noopener noreferrer"&gt;[6]&lt;/a&gt; Neither uses a blockchain.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-border payments in seconds, not days&lt;/td&gt;
&lt;td&gt;89% of Swift payments already reach the recipient's bank within an hour. &lt;a href="https://www.swift.com/news-events/press-releases/swifts-cross-border-payments-processing-speed-surpasses-g20-target" rel="noopener noreferrer"&gt;[7]&lt;/a&gt; Swift is now adding its own ledger for 24/7 settlement. &lt;a href="https://www.treasury-management.com/news/swift-to-add-blockchain-based-ledger-to-its-infrastructure-stack-in-groundbreaking-move" rel="noopener noreferrer"&gt;[8]&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A bank's own payment network&lt;/td&gt;
&lt;td&gt;JPMorgan's Kinexys handled over $2 billion a day in late 2024, next to about $10 trillion a day through conventional rails. &lt;a href="https://www.ledgerinsights.com/jp-morgan-rebrands-blockchain-unit-to-kinexys/" rel="noopener noreferrer"&gt;[9]&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tokenised funds&lt;/td&gt;
&lt;td&gt;BlackRock's BUIDL holds about $2.8 billion, in a tokenised Treasury market of about $15 billion. &lt;a href="https://news.bitcoin.com/blackrock-buidl-2-8-billion-tokenized-treasury-crown/" rel="noopener noreferrer"&gt;[10]&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tokenised money between central banks&lt;/td&gt;
&lt;td&gt;Seven central banks and over 40 firms delivered a working &lt;em&gt;prototype&lt;/em&gt; in Project Agorá. &lt;a href="https://www.bis.org/publ/othp110.htm" rel="noopener noreferrer"&gt;[11]&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three patterns stand out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The winners are intermediaries.&lt;/strong&gt; The original pitch was that a ledger would remove middlemen. The networks that actually carry volume are run by a global bank, by Swift and by central banks. Even R3, the bank consortium founded in 2015, now builds bridges to a public chain. &lt;a href="https://r3.com/r3-signals-strategic-shift-to-lead-the-convergence-of-public-and-private-blockchains-to-deliver-internet-capital-markets-through-collaboration-with-solana-foundation" rel="noopener noreferrer"&gt;[12]&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Speed came from process, not ledgers.&lt;/strong&gt; T+1 came from rule changes and automation. Payments are slow in the last mile, at sanctions screening, local clearing and cut-off times, and a new ledger fixes none of that. Swift's own data shows the gap: only 60% of wholesale payments reach the end customer within that hour. &lt;a href="https://www.swift.com/news-events/press-releases/swifts-cross-border-payments-processing-speed-surpasses-g20-target" rel="noopener noreferrer"&gt;[7]&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Consortia die of governance.&lt;/strong&gt; The trade finance networks worked technically. They failed because every bank had to join at once, keep its own back office anyway, and pay for something the paper process already did well enough.&lt;/p&gt;

&lt;p&gt;Where distributed ledgers &lt;em&gt;did&lt;/em&gt; stick, an asset and its payment have to move together, around the clock, between parties that already share an operator. That is a narrow and real use case, and it is not the one most projects describe.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three myths I still hear in meetings
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;“The network votes unanimously on every block.”&lt;/strong&gt; It does not. Bitcoin follows the chain with the most proof of work, and permissioned ledgers need a quorum of validators. The design goal is to keep working when &lt;em&gt;some&lt;/em&gt; members are faulty or dishonest.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;“Blockchain encrypts the data.”&lt;/strong&gt; It does not by default. Hashes and signatures make tampering &lt;em&gt;visible&lt;/em&gt;; a public chain is readable by anyone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;“Put the KYC data on chain.”&lt;/strong&gt; The EDPB's guidelines, finalised in 2026, say personal data should generally stay off chain. Store hashes or references instead, and choose another technology if you cannot honour the right to erasure. &lt;a href="https://thelens.slaughterandmay.com/post/102ndb2/edpb-finalises-guidelines-on-gdpr-and-blockchain" rel="noopener noreferrer"&gt;[13]&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I build instead: a ledger table on Azure SQL
&lt;/h2&gt;

&lt;p&gt;Azure once had a managed blockchain service. Microsoft retired Azure Blockchain Service in September 2021. &lt;a href="https://redmondmag.com/Articles/2021/05/13/Azure-Blockchain-Ending-September.aspx" rel="noopener noreferrer"&gt;[14]&lt;/a&gt; What remained, and what I actually use, is &lt;strong&gt;ledger&lt;/strong&gt; in Azure SQL Database, Azure SQL Managed Instance and SQL Server 2022 and later. Every transaction is hashed with SHA-256 into a Merkle tree, and each block of transactions is chained to the previous one. The latest hash, the &lt;em&gt;digest&lt;/em&gt;, belongs outside the database, where a DBA cannot reach it. &lt;a href="https://learn.microsoft.com/en-us/sql/relational-databases/security/ledger/ledger-overview" rel="noopener noreferrer"&gt;[15]&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can try it at no cost. The Azure SQL Database free offer gives each subscription up to ten serverless databases with 100,000 vCore seconds and 32 GB of data each per month. Set the database to auto-pause when the allowance runs out, and it never bills. &lt;a href="https://learn.microsoft.com/en-us/azure/azure-sql/database/free-offer" rel="noopener noreferrer"&gt;[16]&lt;/a&gt; I created one with Microsoft Entra-only authentication and ran everything in the portal's Query editor.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;az&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sql&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;create&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-g&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;rg-ledger-lab&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ledgerlab&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;-e&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;GeneralPurpose&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-f&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Gen5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-c&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--compute-model&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Serverless&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;--use-free-limit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--free-limit-exhaustion-behavior&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;AutoPause&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;--backup-storage-redundancy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Local&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Two things that cost me twenty minutes&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
On a subscription that has never used Azure SQL, &lt;code&gt;az sql server create&lt;/code&gt; fails with &lt;code&gt;MissingSubscriptionRegistration&lt;/code&gt; in every region, which looks a lot like a capacity problem. Run &lt;code&gt;az provider register -n Microsoft.Sql --wait&lt;/code&gt; first. After that, West Europe and North Europe still refused a new server (“not accepting new customers”); Sweden Central accepted it. Remember that all free-offer databases in a subscription share the region of the first one.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  1. A table that remembers
&lt;/h3&gt;

&lt;p&gt;An &lt;em&gt;updatable&lt;/em&gt; ledger table is an ordinary table with two options:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Account&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;AccountId&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt;            &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="n"&gt;CLUSTERED&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;Owner&lt;/span&gt;     &lt;span class="n"&gt;NVARCHAR&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Balance&lt;/span&gt;   &lt;span class="nb"&gt;DECIMAL&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;WITH&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;SYSTEM_VERSIONING&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HISTORY_TABLE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AccountHistory&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;LEDGER&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Account&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="s1"&gt;'Alpha Ltd'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="s1"&gt;'Beta SA'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Before touching anything, I took a digest, the fingerprint of the database at that moment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;EXECUTE&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sp_generate_database_ledger_digest&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is a small JSON document. This one covers block 0, the block that holds my two inserts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"database_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"ledgerlab"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"block_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"hash"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"0xA4E6F87689936B87EF74738E65C3F851546B653BE1FA244EA93AF0BD80428014"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"last_transaction_commit_time"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"2026-10-26T19:48:03.3433333"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"digest_time"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"2026-10-26T19:48:44.0689525"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In production you would not copy this by hand. The database writes digests automatically to immutable storage, which I come back to below.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. A quiet correction, and who made it
&lt;/h3&gt;

&lt;p&gt;Then I made the kind of change that ends up in fraud investigations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Account&lt;/span&gt; &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;Balance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;9000&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;AccountId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The application sees only the new balance. The ledger view, generated automatically, shows the whole story:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;commit_time&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;CommitTime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;principal_name&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;ChangedBy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AccountId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;Owner&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Balance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ledger_operation_type_desc&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="k"&gt;Operation&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Account_Ledger&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;
&lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;database_ledger_transactions&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transaction_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ledger_transaction_id&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;commit_time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ledger_sequence_number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6gsgz3j6w7ri6i7yp55q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6gsgz3j6w7ri6i7yp55q.png" alt="Ledger view: two inserts, then the update recorded as a DELETE of 250.00 and an INSERT of 9000.00 by the same user" width="799" height="117"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The update is not stored as an overwrite. It appears as a &lt;strong&gt;DELETE&lt;/strong&gt; of the old row (250.00) and an &lt;strong&gt;INSERT&lt;/strong&gt; of the new one (9000.00), in the same transaction, with the exact commit time and the Entra identity that made it. I blurred my address here; in your database it is the real user principal name.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Trying to cover the tracks
&lt;/h3&gt;

&lt;p&gt;A DBA's first instinct would be to clean up the history table, or to switch versioning off as you can on a normal temporal table:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;DELETE&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AccountHistory&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Account&lt;/span&gt; &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SYSTEM_VERSIONING&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;OFF&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neither works:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cannot update ledger history table 'ledgerlab.dbo.AccountHistory'.
System Versioning cannot be altered for Ledger Tables.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that was with the server admin account. The history is not a convenience copy that someone with enough rights can tidy up.&lt;/p&gt;

&lt;p&gt;For data that should never change at all, such as audit events, an &lt;em&gt;append-only&lt;/em&gt; ledger table refuses updates outright:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AuditEvent&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;EventId&lt;/span&gt;   &lt;span class="nb"&gt;INT&lt;/span&gt;            &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Detail&lt;/span&gt;    &lt;span class="n"&gt;NVARCHAR&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;EventTime&lt;/span&gt; &lt;span class="n"&gt;DATETIME2&lt;/span&gt;      &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LEDGER&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;APPEND_ONLY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AuditEvent&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="s1"&gt;'Limit raised for account 2'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SYSUTCDATETIME&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AuditEvent&lt;/span&gt; &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;Detail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="s1"&gt;'Nothing happened'&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;EventId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The insert succeeds. The update does not:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Updates are not allowed for the append only Ledger table 'dbo.AuditEvent'.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Proving it to an auditor
&lt;/h3&gt;

&lt;p&gt;Verification recomputes the hashes from the data and compares them with a digest you kept. My first attempt used a placeholder hash by mistake, which turned out to be the most useful screenshot of the evening. This is what an auditor sees when the data and the digest disagree:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz66s1mptrl04304byhbv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz66s1mptrl04304byhbv.png" alt="Verification error: the hash of block 0 in the database ledger does not match the hash provided in the digest" width="799" height="130"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With the real digest from earlier, the same call succeeds:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;EXECUTE&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sp_verify_database_ledger&lt;/span&gt; &lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="s1"&gt;'[
  {"database_name":"ledgerlab","block_id":0,
   "hash":"0xA4E6F87689936B87EF74738E65C3F851546B653BE1FA244EA93AF0BD80428014",
   "last_transaction_commit_time":"2026-10-26T19:48:03.3433333",
   "digest_time":"2026-10-26T19:48:44.0689525"}
]'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;last_verified_block_id
0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result is the last block the digest vouches for: block 0, which holds the two inserts. The balance change and the audit event live in a later block, so proving those needs a later digest. To finish the lab, I generated a fresh digest and verified against it in one batch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;DECLARE&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;latest&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;latest_digest&lt;/span&gt; &lt;span class="n"&gt;NVARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;MAX&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;latest&lt;/span&gt; &lt;span class="k"&gt;EXECUTE&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sp_generate_database_ledger_digest&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;DECLARE&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;digests&lt;/span&gt; &lt;span class="n"&gt;NVARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;MAX&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="s1"&gt;'['&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;latest_digest&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;latest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="s1"&gt;']'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;EXECUTE&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sp_verify_database_ledger&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;digests&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;last_verified_block_id
1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every block up to and including the one with the 9000.00 update now checks out. In a real system, a digest you just generated proves little on its own: its value comes from being stored somewhere the DBA cannot reach &lt;em&gt;before&lt;/em&gt; anyone has a reason to tamper. That is why production setups write digests automatically to immutable storage instead of relying on someone to copy JSON.&lt;/p&gt;

&lt;p&gt;Keep the two tools apart. Verification proves that nobody has altered what the ledger recorded. Whether a recorded change was &lt;em&gt;legitimate&lt;/em&gt; is a different question, and the ledger view is where you answer it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tamper-evident, not tamper-proof&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Someone with access to the underlying files could still change data. Ledger cannot stop that, but verification will detect it. In production, store digests automatically in Azure Blob Storage with an immutability policy or in Azure confidential ledger, so that nobody with database access can reach them. &lt;a href="https://learn.microsoft.com/en-us/sql/relational-databases/security/ledger/ledger-overview" rel="noopener noreferrer"&gt;[15]&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is the property most “blockchain” projects I have reviewed were actually after: anyone can check the history, nobody can rewrite it unnoticed, and you need no consortium, tokens or new infrastructure. Your existing application, backups and SQL skills all still work.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;Use a distributed ledger only when several organisations must move an asset and its payment together, and no operator they already trust can do it for them. In 2026 that means joining networks the market already runs, not building your own. For everything else, start with a database, and if the requirement is proof, make it a ledger table.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;World Economic Forum (12 August 2016). &lt;em&gt;Blockchain Will Become ‘Beating Heart’ of the Global Financial System.&lt;/em&gt; Press release. &lt;a href="https://www.weforum.org/press/2016/08/blockchain-will-become-beating-heart-of-the-global-financial-system/" rel="noopener noreferrer"&gt;https://www.weforum.org/press/2016/08/blockchain-will-become-beating-heart-of-the-global-financial-system/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The Block (16 November 2022). &lt;em&gt;ASX cancels years-long blockchain settlement and clearing system project.&lt;/em&gt; &lt;a href="https://www.theblock.co/post/187809/asx-cancels-years-long-blockchain-settlement-and-clearing-system-project" rel="noopener noreferrer"&gt;https://www.theblock.co/post/187809/asx-cancels-years-long-blockchain-settlement-and-clearing-system-project&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Markets Media (20 November 2023). &lt;em&gt;ASX Chooses CHESS Replacement.&lt;/em&gt; &lt;a href="https://www.marketsmedia.com/asx-chooses-chess-replacement" rel="noopener noreferrer"&gt;https://www.marketsmedia.com/asx-chooses-chess-replacement&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Ledger Insights (1 November 2023). &lt;em&gt;Blockchain trade finance network Contour to shutter.&lt;/em&gt; &lt;a href="https://www.ledgerinsights.com/contour-blockchain-trade-finance-network-shutter/" rel="noopener noreferrer"&gt;https://www.ledgerinsights.com/contour-blockchain-trade-finance-network-shutter/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;U.S. Securities and Exchange Commission (21 May 2024). &lt;em&gt;Chair Gensler statement on the upcoming implementation of the T+1 settlement cycle.&lt;/em&gt; Press release 2024-62. &lt;a href="https://www.sec.gov/news/press-release/2024-62" rel="noopener noreferrer"&gt;https://www.sec.gov/news/press-release/2024-62&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;A&amp;amp;O Shearman FinReg (14 October 2025). &lt;em&gt;Regulation to shorten settlement cycle to T+1 published.&lt;/em&gt; Regulation (EU) 2025/2075 amending the CSDR. &lt;a href="https://finreg.aoshearman.com/regulation-to-shorten-settlement-cycle-to-t1-publ" rel="noopener noreferrer"&gt;https://finreg.aoshearman.com/regulation-to-shorten-settlement-cycle-to-t1-publ&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Swift (22 August 2023). &lt;em&gt;Swift’s cross-border payments processing speed surpasses G20 target.&lt;/em&gt; Press release. &lt;a href="https://www.swift.com/news-events/press-releases/swifts-cross-border-payments-processing-speed-surpasses-g20-target" rel="noopener noreferrer"&gt;https://www.swift.com/news-events/press-releases/swifts-cross-border-payments-processing-speed-surpasses-g20-target&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Treasury Management International (29 September 2025). &lt;em&gt;Swift to Add Blockchain-Based Ledger to Its Infrastructure Stack in Groundbreaking Move.&lt;/em&gt; &lt;a href="https://www.treasury-management.com/news/swift-to-add-blockchain-based-ledger-to-its-infrastructure-stack-in-groundbreaking-move" rel="noopener noreferrer"&gt;https://www.treasury-management.com/news/swift-to-add-blockchain-based-ledger-to-its-infrastructure-stack-in-groundbreaking-move&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Ledger Insights (6 November 2024). &lt;em&gt;JP Morgan rebrands blockchain unit to Kinexys.&lt;/em&gt; &lt;a href="https://www.ledgerinsights.com/jp-morgan-rebrands-blockchain-unit-to-kinexys/" rel="noopener noreferrer"&gt;https://www.ledgerinsights.com/jp-morgan-rebrands-blockchain-unit-to-kinexys/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bitcoin.com News (31 August 2026). &lt;em&gt;Blackrock’s BUIDL Hits $2.8B, Reclaims Treasury Crown.&lt;/em&gt; &lt;a href="https://news.bitcoin.com/blackrock-buidl-2-8-billion-tokenized-treasury-crown/" rel="noopener noreferrer"&gt;https://news.bitcoin.com/blackrock-buidl-2-8-billion-tokenized-treasury-crown/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bank for International Settlements (27 May 2026). &lt;em&gt;Project Agorá: a shared programmable platform for wholesale cross-border payments.&lt;/em&gt; &lt;a href="https://www.bis.org/publ/othp110.htm" rel="noopener noreferrer"&gt;https://www.bis.org/publ/othp110.htm&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;R3 (22 May 2025). &lt;em&gt;R3 signals strategic shift to lead the convergence of public and private blockchains, through collaboration with Solana Foundation.&lt;/em&gt; &lt;a href="https://r3.com/r3-signals-strategic-shift-to-lead-the-convergence-of-public-and-private-blockchains-to-deliver-internet-capital-markets-through-collaboration-with-solana-foundation" rel="noopener noreferrer"&gt;https://r3.com/r3-signals-strategic-shift-to-lead-the-convergence-of-public-and-private-blockchains-to-deliver-internet-capital-markets-through-collaboration-with-solana-foundation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Slaughter and May, The Lens (21 July 2026). &lt;em&gt;EDPB finalises guidelines on GDPR and blockchain.&lt;/em&gt; On EDPB Guidelines 02/2025 on processing of personal data through blockchain technologies. &lt;a href="https://thelens.slaughterandmay.com/post/102ndb2/edpb-finalises-guidelines-on-gdpr-and-blockchain" rel="noopener noreferrer"&gt;https://thelens.slaughterandmay.com/post/102ndb2/edpb-finalises-guidelines-on-gdpr-and-blockchain&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Redmond Magazine (13 May 2021). &lt;em&gt;Azure Blockchain Service Ending in September.&lt;/em&gt; &lt;a href="https://redmondmag.com/Articles/2021/05/13/Azure-Blockchain-Ending-September.aspx" rel="noopener noreferrer"&gt;https://redmondmag.com/Articles/2021/05/13/Azure-Blockchain-Ending-September.aspx&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Microsoft Learn. &lt;em&gt;Ledger overview&lt;/em&gt; (SQL Server 2022 and later, Azure SQL Database, Azure SQL Managed Instance). &lt;a href="https://learn.microsoft.com/en-us/sql/relational-databases/security/ledger/ledger-overview" rel="noopener noreferrer"&gt;https://learn.microsoft.com/en-us/sql/relational-databases/security/ledger/ledger-overview&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Microsoft Learn. &lt;em&gt;Deploy Azure SQL Database for free.&lt;/em&gt; &lt;a href="https://learn.microsoft.com/en-us/azure/azure-sql/database/free-offer" rel="noopener noreferrer"&gt;https://learn.microsoft.com/en-us/azure/azure-sql/database/free-offer&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Further reading
&lt;/h3&gt;

&lt;p&gt;The sources below shaped the 2015–2019 view of blockchain in finance discussed in this post.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Natarajan, H., Krause, S. and Gradstein, H. (2017). &lt;em&gt;Distributed Ledger Technology (DLT) and Blockchain.&lt;/em&gt; FinTech Note No. 1, World Bank Group. &lt;a href="https://openknowledge.worldbank.org/entities/publication/563eb421-4449-5319-953b-2ace8da058c0" rel="noopener noreferrer"&gt;openknowledge.worldbank.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Casey, M., Crane, J., Gensler, G., Johnson, S. and Narula, N. (2018). &lt;em&gt;The Impact of Blockchain Technology on Finance: A Catalyst for Change.&lt;/em&gt; Geneva Reports on the World Economy 21, ICMB and CEPR Press. &lt;a href="https://cepr.org/publications/books-and-reports/geneva-21-impact-blockchain-technology-finance-catalyst-change" rel="noopener noreferrer"&gt;cepr.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Guo, Y. and Chen, L. (2016). Blockchain application and outlook in the banking industry. &lt;em&gt;Financial Innovation&lt;/em&gt;, 2, 24. &lt;a href="https://doi.org/10.1186/s40854-016-0034-9" rel="noopener noreferrer"&gt;doi.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Tasca, P., Aste, T., Pelizzon, L. and Perony, N. (eds.) (2016). &lt;em&gt;Banking Beyond Banks and Money.&lt;/em&gt; Springer. &lt;a href="https://doi.org/10.1007/978-3-319-42448-4" rel="noopener noreferrer"&gt;doi.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Peters, G. W. and Panayi, E. (2015). &lt;em&gt;Understanding Modern Banking Ledgers through Blockchain Technologies.&lt;/em&gt; Chapter 13 of Tasca et al. (2016). &lt;a href="https://arxiv.org/abs/1511.05740" rel="noopener noreferrer"&gt;arxiv.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;FINRA (2017). &lt;em&gt;Distributed Ledger Technology: Implications of Blockchain for the Securities Industry.&lt;/em&gt; &lt;a href="https://www.finra.org/industry/report-distributed-ledger-technology-implications-blockchain-securities-industry" rel="noopener noreferrer"&gt;finra.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;He, D. et al. (2016). &lt;em&gt;Virtual Currencies and Beyond: Initial Considerations.&lt;/em&gt; IMF Staff Discussion Note SDN/16/03. &lt;a href="https://www.imf.org/en/publications/staff-discussion-notes/issues/2016/12/31/virtual-currencies-and-beyond-initial-considerations-43618" rel="noopener noreferrer"&gt;imf.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;World Economic Forum and Deloitte (2016). &lt;em&gt;The Future of Financial Infrastructure.&lt;/em&gt; &lt;a href="https://www.weforum.org/reports/the-future-of-financial-infrastructure-an-ambitious-look-at-how-blockchain-can-reshape-financial-services" rel="noopener noreferrer"&gt;weforum.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Contri, B. and Galaski, R. (2016). &lt;em&gt;Over the Horizon: Blockchain and the Future of Financial Infrastructure.&lt;/em&gt; Deloitte. &lt;a href="https://www.deloitte.com/in/en/Industries/financial-services/solutions/over-the-horizon-blockchain-and-the-future.html" rel="noopener noreferrer"&gt;deloitte.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dalton, D. and Gianturco, P. (2016). &lt;em&gt;Out of Blocks: Blockchain – From Hype to Prototype.&lt;/em&gt; Deloitte and Efma.&lt;/li&gt;
&lt;li&gt;Santander InnoVentures, Oliver Wyman and Anthemis (2015). &lt;em&gt;The Fintech 2.0 Paper: Rebooting Financial Services.&lt;/em&gt; &lt;a href="https://www.nasdaq.com/articles/fintech-20-rebooting-financial-services-2016-11-30" rel="noopener noreferrer"&gt;nasdaq.com (summary)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bedford, A. (2018). &lt;em&gt;How Blockchain Technology Is Changing the Financial Industry – 10 Theses.&lt;/em&gt; Deutsche Bank.&lt;/li&gt;
&lt;li&gt;Davradakis, E. and Santos, R. (2019). &lt;em&gt;Blockchain, FinTechs and Their Relevance for International Financial Institutions.&lt;/em&gt; EIB Working Paper 2019/01. &lt;a href="https://library.oapen.org/handle/20.500.12657/43413" rel="noopener noreferrer"&gt;library.oapen.org&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>azure</category>
      <category>sql</category>
      <category>blockchain</category>
      <category>security</category>
    </item>
  </channel>
</rss>
