主頁 > 區塊鏈 > Solana light client

Solana light client

2021-11-12 13:12:28 區塊鏈

1. 引言

Solana已接收提案——Simple Payment and State Verification 中指出:
資源有限的客戶端可運行light client來參與Solana網路,可在無需信任第三方的情況下,確認其提交的交易已提交到賬本,

Solana中的Validators會將最近確認交易的簽名在本地存盤一段時間,已確保這些交易不會被重復處理,

客戶端可:

  • 通過Validator提供的JSON RPC埠來查詢其提交的交易是否已被處理,
  • 通過注冊監聽Validator提供的PubSub通知,可獲知某簽名是否已被Validator注意到,

以上兩種方式,客戶端都可驗證一筆支付,但是,這不是a proof,需完全信任某單一Validator,

為了進一步減少客戶端對某單一Validator的信任,可改為:

  • 使用Merkle Proofs來錨定 該Validator在賬本中的response,允許客戶端通過驗證 其選擇的足夠多數量的Validators是否已確認該交易,通過多個Validators的attestations可進一步減少對某單一Validator的信任,

2. Solana的light client

light client:是指不運行validator的參與者,
light client 可在無需增加資源投入的情況下驗證賬本,其提供的安全性要高于信任某一遠程Validator,

Validator并不會將交易簽名提交給light client,而是生成:

  • a Merkle Proof from the transaction of interest to the root of a Merkle Tree of all transactions in the including block,

該Merkle Root存在ledger entry中,并經由Validators投票來提供共識合法性,

light client的安全性還取決于其初始收錄的validators set,隨著網路中Validators變化,light client也需要使用receipts來更新其內部的validators set,

考慮到性能,Validators本身可能也會想用light client API,如,在初始啟動a validator的程序中,該validator可使用a receipt來驗證一個由cluster提供的checkpoint of the state,

3. Receipts

A receipt為a minimal proof,用于證明:

  • 1)某一交易被包含在某一區塊——Transaction Inclusion Proof;
  • 2)該區塊已經由light client所選擇的validators set 投票——;
  • 3)投票達到了要求的確認深度(desired confirmation depth)——Chain of Entries,

3.1 Transaction Inclusion Proof

Transaction Inclusion Proof為一種資料結構,包含了:

  • 某筆交易經由Entry-Merkle到達Block-Merkle的Merkle Path,

Block-Merkle會與the required set of validator votes一起,被包含在a Bank-Hash中,
包含后續validator投票的PoH entry chain(源自Bank-Hash)即為proof of confirmation,

3.1.1 Transaction Merkle

An Entry-Merkle即為a Merkle Root,包含了某個entry中的所有交易,按簽名排序,

entry中的每筆交易均通過如下方式被merkled:【由此可證明某交易T被包含在某entryE中,】

poh.record(hash_transactions(transactions)).unwrap().hash
pub fn hash_transactions(transactions: &[VersionedTransaction]) -> Hash {
    // a hash of a slice of transactions only needs to hash the signatures
    let signatures: Vec<_> = transactions
        .iter()
        .flat_map(|tx| tx.signatures.iter())
        .collect();
    let merkle_tree = MerkleTree::new(&signatures);
    if let Some(root_hash) = merkle_tree.get_root() {
        *root_hash
    } else {
        Hash::default()
    }
}

pub struct VersionedTransaction {
    /// List of signatures
    #[serde(with = "short_vec")]
    pub signatures: Vec<Signature>,
    /// Message to sign.
    pub message: VersionedMessage,
}
pub enum VersionedMessage {
    Legacy(Message),
    V0(v0::Message),
}

A Block-Merkle為the Merkle Root of all the Entry-Merkles sequenced in the block,

在這里插入圖片描述

將以上2個merkle proof一起,即可證明a transaction T被包含在bank hash為B的某block中,

Accounts-Hash為the hash of th econcatentation of the state hashes of each account modified during the current slot,即:
A c c o u n t s H a s h = H a s h ( H a s h ( a c c o u n t 1 s t a t e ) ∣ ∣ H a s h ( a c c o u n t 2 s t a t e ) ∣ ∣ . . . ∣ ∣ H a s h ( a c c o u n t n s t a t e ) ∣ ) AccountsHash=Hash(Hash(account1_{state})||Hash(account2_{state})||...||Hash(accountn_{state})|) AccountsHash=Hash(Hash(account1state?)Hash(account2state?)...Hash(accountnstate?))

receipt需要transaction status,因為需要為block構建state receipt,同一區塊中可能有具有相同state的2筆交易,僅根據state無法區分一筆交易是否提交成功,盡管可能沒必要encode the full status code,但是需要一個status bit來標記交易是否成功,

當前Solana中并未實作Block-Merkle,因此,為了驗證entry E在 bank hash為B 的block中,需提供該block中的所有entry hashes,這樣的實作效率很低,未來Solana應該會實作Block-Merkele,

3.1.2 Block Headers

為了驗證Transaction inclusion proofs,light client應能推斷出網路中的拓撲結構,

light client應能跟蹤新生成的block headers,如新來的2個bank hash為A,B的區塊,light client應能判斷出AB的ancestor(具體見下面提到的 Optimistic Confirmation Proof),header中的內容將用于計算bank hash,

Bank-Hash=Hash(Accounts-Hash || Block-Merkle)

在這里插入圖片描述
具體代碼實作為:

		let mut hash = hashv(&[
            self.parent_hash.as_ref(),
            accounts_delta_hash.hash.as_ref(),
            &signature_count_buf,
            self.last_blockhash().as_ref(),
        ]);

可跟現有的Validator replay logic中的streaming logic來實作該邏輯:

			if let Some(sender) = bank_notification_sender {
                sender
                    .send(BankNotification::Root(root_bank))
                    .unwrap_or_else(|err| warn!("bank_notification_sender failed: {:?}", err));
            }

3.1.3 Optimistic Confirmation Proof

當前可通過a listener that monitors gossip and the replay pipeline for votes來獲得optimistic confirmation資訊,具體為:

				if is_confirmed {
                    new_optimistic_confirmed_slots.push((*slot, last_vote_hash));
                    // Notify subscribers about new optimistic confirmation
                    if let Some(sender) = bank_notification_sender {
                        sender
                            .send(BankNotification::OptimisticallyConfirmed(*slot))
                            .unwrap_or_else(|err| {
                                warn!("bank_notification_sender failed: {:?}", err)
                            });
                    }
                }

對bank hash為B的區塊的每一個投票都是a signed transaction,一旦投票數達到了某閾值T,即可認為該區塊是optimistially confirmed,參與投票的這T個validators需要show that the block with bank hash B was optimistically confirmed,

但是,當前signed votes本身并不存盤,未來可能需要維護在Rocksdb資料庫中,以key (Slot, Hash, Pubkey)索引,來表示the slot of the vote, bank hash of the vote 以及 vote account pubkey responsible for the vote,

可擴展現有的signature subscription logic,將transaction merkle proof和optimistic confirmation proof通過RPC提供給訂閱者,
當探測到optimistic confirmation,即會通知訂閱者“Confirmed” confirmation,同時,需要提供一個flag來標記應回傳transaction merkle proof和optimistic confirmation proof,

It is important to note that optimistcally confirming B also implies that all ancestor blocks of B are also optimistically confirmed, and also that not all blocks will be optimistically confirmed.

B -> B'

So in the example above if a block B' is optimisically confirmed, then so is B. Thus if a transaction was in block B, the transaction merkle in the proof will be for block B, but the votes presented in the proof will be for block B'. This is why the headers in the Block headers section above are important, the client will need to verify that B is indeed an ancestor of B'.

3.1.4 Proof of Stake Distributioin

當收到transaction merkle proof 和optimistic confirmation proof時,客戶端需驗證交易T確實optimistially confirmed在bank hash為B的block中,
最后,需要驗證,在optimistic proof中的投票確實超過了T%的質押,以保證“optimistic confirmation”的安全性,

對于每個epoch,當stake set變化時,將所有的stakes寫到a system account,然后validators可訂閱該system account,然后全節點提供a merkle proving that the system account state was updated in some block B,再show that the block B was optimistically confirmed/rooted,

3.2 Account State Verification

可通過向cluster提交包含某TBD指令的交易來驗證某account的state(如balance或其它資料),然后client可使用Transaction Inclusion Proof來驗證該cluster是否同意 that the account has reached the expected state,

3.3 Validator Votes

Leaders可將股權與權重合并到一個entry中,這將減少創建receipt所需的entry數量,

3.4 Chain of Entries

A receipt has a PoH link from the payment or state Merkle Path root to a list of consecutive validation votes.

receipt中包含:

  • Transaction -> Entry-Merkle -> Block-Merkle -> Bank-Hash

receipt中還包含一組PoH entries:

  • Validator vote entries
  • Ticks
  • Light entries
/// This Entry definition skips over the transactions and only contains the
/// hash of the transactions used to modify PoH.
LightEntry {
    /// The number of hashes since the previous Entry ID.
    pub num_hashes: u64,
    /// The SHA-256 hash `num_hashes` after the previous Entry ID.
    hash: Hash,
    /// The Merkle Root of the transactions encoded into the Entry.
    entry_hash: Hash,
}

The light entries are reconstructed from Entries and simply show the entry Merkle Root that was mixed in to the PoH hash, instead of the full transaction set.

Clients do not need the starting vote state. The fork selection algorithm is defined such that only votes that appear after the transaction provide finality for the transaction, and finality is independent of the starting state.

3.5 Verification

A light client that is aware of the supermajority set validators can verify a receipt by following the Merkle Path to the PoH chain. The Block-Merkle is the Merkle Root and will appear in votes included in an Entry. The light client can simulate fork selection for the consecutive votes and verify that the receipt is confirmed at the desired lockout threshold.

3.6 Synthetic State

Synthetic state should be computed into the Bank-Hash along with the bank generated state.

For example:

  • Epoch validator accounts and their stakes and weights.
  • Computed fee rates

These values should have an entry in the Bank-Hash. They should live under known accounts, and therefore have an index into the hash concatenation.

參考資料

[1] Solana已接收提案——Simple Payment and State Verification
[2] 用于Solana-Ethereum的zk-bridge方案——=nil; Foundation’s In-EVM Solana Light-Client State Verification

轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/356165.html

標籤:區塊鏈

上一篇:NFT游戲開發元宇宙游戲開發游戲原始碼+搭建

下一篇:智能合約模糊測驗編譯部署腳本

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • JAVA使用 web3j 進行token轉賬

    最近新學習了下區塊鏈這方面的知識,所學不多,給大家分享下。 # 1. 關于web3j web3j是一個高度模塊化,反應性,型別安全的Java和Android庫,用于與智能合約配合并與以太坊網路上的客戶端(節點)集成。 # 2. 準備作業 jdk版本1.8 引入maven <dependency> < ......

    uj5u.com 2020-09-10 03:03:06 more
  • 以太坊智能合約開發框架Truffle

    前言 部署智能合約有多種方式,命令列的瀏覽器的渠道都有,但往往跟我們程式員的風格不太相符,因為我們習慣了在IDE里寫了代碼然后打包運行看效果。 雖然現在IDE中已經存在了Solidity插件,可以撰寫智能合約,但是部署智能合約卻要另走他路,沒辦法進行一個快捷的部署與測驗。 如果團隊管理的區塊節點多、 ......

    uj5u.com 2020-09-10 03:03:12 more
  • 谷歌二次驗證碼成為區塊鏈專用安全碼,你怎么看?

    前言 谷歌身份驗證器,前些年大家都比較陌生,但隨著國內互聯網安全的加強,它越來越多地出現在大家的視野中。 比較廣泛接觸的人群是國際3A游戲愛好者,游戲盜號現象嚴重+國外賬號安全應用廣泛,這類游戲一般都會要求用戶系結名為“兩步驗證”、“雙重驗證”等,平臺一般都推薦用谷歌身份驗證器。 后來區塊鏈業務風靡 ......

    uj5u.com 2020-09-10 03:03:17 more
  • 密碼學DAY1

    目錄 ##1.1 密碼學基本概念 密碼在我們的生活中有著重要的作用,那么密碼究竟來自何方,為何會產生呢? 密碼學是網路安全、資訊安全、區塊鏈等產品的基礎,常見的非對稱加密、對稱加密、散列函式等,都屬于密碼學范疇。 密碼學有數千年的歷史,從最開始的替換法到如今的非對稱加密演算法,經歷了古典密碼學,近代密 ......

    uj5u.com 2020-09-10 03:03:50 more
  • 密碼學DAY1_02

    目錄 ##1.1 ASCII編碼 ASCII(American Standard Code for Information Interchange,美國資訊交換標準代碼)是基于拉丁字母的一套電腦編碼系統,主要用于顯示現代英語和其他西歐語言。它是現今最通用的單位元組編碼系統,并等同于國際標準ISO/IE ......

    uj5u.com 2020-09-10 03:04:50 more
  • 密碼學DAY2

    ##1.1 加密模式 加密模式:https://docs.oracle.com/javase/8/docs/api/javax/crypto/Cipher.html ECB ECB : Electronic codebook, 電子密碼本. 需要加密的訊息按照塊密碼的塊大小被分為數個塊,并對每個塊進 ......

    uj5u.com 2020-09-10 03:05:42 more
  • NTP時鐘服務器的特點(京準電子)

    NTP時鐘服務器的特點(京準電子) NTP時鐘服務器的特點(京準電子) 京準電子官V——ahjzsz 首先對時間同步進行了背景介紹,然后討論了不同的時間同步網路技術,最后指出了建立全球或區域時間同步網存在的問題。 一、概 述 在通信領域,“同步”概念是指頻率的同步,即網路各個節點的時鐘頻率和相位同步 ......

    uj5u.com 2020-09-10 03:05:47 more
  • 標準化考場時鐘同步系統推進智能化校園建設

    標準化考場時鐘同步系統推進智能化校園建設 標準化考場時鐘同步系統推進智能化校園建設 安徽京準電子科技官微——ahjzsz 一、背景概述隨著教育事業的快速發展,學校建設如雨后春筍,隨之而來的學校教育、管理、安全方面的問題成了學校管理人員面臨的最大的挑戰,這些問題同時也是學生家長所擔心的。為了讓學生有更 ......

    uj5u.com 2020-09-10 03:05:51 more
  • 位元幣入門

    引言 位元幣基本結構 位元幣基礎知識 1)哈希演算法 2)非對稱加密技術 3)數字簽名 4)MerkleTree 5)哪有位元幣,有的是UTXO 6)位元幣挖礦與共識 7)區塊驗證(共識) 總結 引言 上一篇我們已經知道了什么是區塊鏈,此篇說一下區塊鏈的第一個應用——位元幣。其實先有位元幣,后有的區塊 ......

    uj5u.com 2020-09-10 03:06:15 more
  • 北斗對時服務器(北斗對時設備)電力系統應用

    北斗對時服務器(北斗對時設備)電力系統應用 北斗對時服務器(北斗對時設備)電力系統應用 京準電子科技官微(ahjzsz) 中國北斗衛星導航系統(英文名稱:BeiDou Navigation Satellite System,簡稱BDS),因為是目前世界范圍內唯一可以大面積提供免費定位服務的系統,所以 ......

    uj5u.com 2020-09-10 03:06:20 more
最新发布
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:46:47 more
  • Hyperledger Fabric 使用 CouchDB 和復雜智能合約開發

    在上個實驗中,我們已經實作了簡單智能合約實作及客戶端開發,但該實驗中智能合約只有基礎的增刪改查功能,且其中的資料管理功能與傳統 MySQL 比相差甚遠。本文將在前面實驗的基礎上,將 Hyperledger Fabric 的默認資料庫支持 LevelDB 改為 CouchDB 模式,以實作更復雜的資料... ......

    uj5u.com 2023-04-16 07:28:31 more
  • .NET Core 波場鏈離線簽名、廣播交易(發送 TRX和USDT)筆記

    Get Started NuGet You can run the following command to install the Tron.Wallet.Net in your project. PM> Install-Package Tron.Wallet.Net 配置 public reco ......

    uj5u.com 2023-04-14 08:08:00 more
  • DKP 黑客分析——不正確的代幣對比率計算

    概述: 2023 年 2 月 8 日,針對 DKP 協議的閃電貸攻擊導致該協議的用戶損失了 8 萬美元,因為 execute() 函式取決于 USDT-DKP 對中兩種代幣的余額比率。 智能合約黑客概述: 攻擊者的交易:0x0c850f,0x2d31 攻擊者地址:0xF38 利用合同:0xf34ad ......

    uj5u.com 2023-04-07 07:46:09 more
  • Defi開發簡介

    Defi開發簡介 介紹 Defi是去中心化金融的縮寫, 是一項旨在利用區塊鏈技術和智能合約創建更加開放,可訪問和透明的金融體系的運動. 這與傳統金融形成鮮明對比,傳統金融通常由少數大型銀行和金融機構控制 在Defi的世界里,用戶可以直接從他們的電腦或移動設備上訪問廣泛的金融服務,而不需要像銀行或者信 ......

    uj5u.com 2023-04-05 08:01:34 more
  • solidity簡單的ERC20代幣實作

    // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.0 <0.9.0; import "hardhat/console.sol"; //ERC20 同質化代幣,每個代幣的本質或性質都是相同 //ETH 是原生代幣,它不是ERC20代幣, ......

    uj5u.com 2023-03-21 07:56:29 more
  • solidity 參考型別修飾符memory、calldata與storage 常量修飾符C

    在solidity語言中 參考型別修飾符(參考型別為存盤空間不固定的數值型別) memory、calldata與storage,它們只能修飾參考型別變數,比如字串、陣列、位元組等... memory 適用于方法傳參、返參或在方法體內使用,使用完就會清除掉,釋放記憶體 calldata 僅適用于方法傳參 ......

    uj5u.com 2023-03-08 07:57:54 more
  • solidity注解標簽

    在solidity語言中 注釋符為// 注解符為/* 內容*/ 或者 是 ///內容 注解中含有這幾個標簽給予我們使用 @title 一個應該描述合約/介面的標題 contract, library, interface @author 作者的名字 contract, library, interf ......

    uj5u.com 2023-03-08 07:57:49 more
  • 評價指標:相似度、GAS消耗

    【代碼注釋自動生成方法綜述】 這些評測指標主要來自機器翻譯和文本總結等研究領域,可以評估候選文本(即基于代碼注釋自動方法而生成)和參考文本(即基于手工方式而生成)的相似度. BLEU指標^[^?88^^?^]^:其全稱是bilingual evaluation understudy.該指標是最早用于 ......

    uj5u.com 2023-02-23 07:27:39 more
  • 基于NOSTR協議的“公有制”版本的Twitter,去中心化社交軟體Damus

    最近,一個幽靈,Web3的幽靈,在網路游蕩,它叫Damus,這玩意詮釋了什么叫做病毒式營銷,滑稽的是,一個Web3產品卻在Web2的產品鏈上瘋狂傳銷,各方大佬紛紛為其背書,到底發生了什么?Damus的葫蘆里,賣的是什么藥? 注冊和簡單實用 很少有什么產品在用戶注冊環節會有什么噱頭,但Damus確實出 ......

    uj5u.com 2023-02-05 06:48:39 more