Solana Program & Account



Sealevel

在官方文件中,對 Sealevel 的介紹為: Parallel smart contracts run-time

以太坊的 EVM 與改良後的 EOS WASM 為單執行緒,一次只能有一份合約修改狀態機。然而 Solana 的Sealevel 一次可以處理千萬份合約交易,這是因為 Sealevel 雖然與 EVM 一樣同為 VM,卻不負責執行交易,此外,Solana 使用 BPF 的技術來讓交易在 Validator 的本地硬體執行,而非虛擬機內,加速了處理的效能。

此外,Solana 將合約(指令)與資料存儲分離,以下會針對這部分進行介紹。

Program

主打快速便宜的Solana有著和以太坊截然不同的Programming model,Solana 使用 Rust 作為編程語言,並將智能合約稱為 Program

Solana Program 與 以太坊智能合約不同之處在於:Solana Program 是 stateless

以太坊的 world state 包含了所有以太坊帳戶、他們的 balance 、智能合約、智能合約使用到的資料等。這個機制的缺點在於:當用戶一直增加、新的智能合約被部署, world state 儲存的東西就越來越多,也就是說,如果想要成為一個 full node , 電腦會需要更多的儲存空間。

而在 stateless 的區塊鏈,Program 不需要儲存數據,就只是簡單的指令,數據需要另外儲存在帳戶內。當調用一個Program 內的函數,需要將儲存這個函數所使用到的數據的帳戶地址也傳遞進去。

下列介紹一些 Solana 中的 Native Program。Native Program 類似於 Fabric 中的系統合約或是以太坊的預編譯合約,是作為 validator 的一部分運行,且可能隨著版本升級進行升級

目前支持的 Native Program 有:

  • System Program
    • 創建新帳號
    • 指派 account 給它所屬的 program
    • 轉帳
    • program id :11111111111111111111111111111111
  • Stake Program
    • 管理質押者質押與存放獎勵的帳號
  • Vote Program
    • 管理質押者投票相關資料
  • BPF Loader
    • 部署合約到鏈上
    • 升級鏈上合約
    • 執行鏈上合約
  • Secp256k1 Program
    • 幫助從簽名中還原出公鑰與地址,如同以太坊中的 ecrecover 函數

等等….

Account

下面介紹三種 Solana Account :

Native Account

Solana 原生的帳戶,例如 System、Stake、Vote。

Program Account

用以儲存 executable code。當客戶端和 Solana program 互動,它們會呼叫儲存在 program account 內的代碼。一個 program 可以用一到多個 data account 來儲存 state 。

Data Account

用以儲存 state data 。又分為兩種:

  1. System owned accounts
  2. PDA (Program Derived Address) accounts

account

上圖是與帳戶相關的欄位。每個帳戶都有自己的地址(公鑰)與擁有者。除了擁有者,其他人都沒辦法更改 Data account 儲存的資料,也沒辦法提款(但是可以存錢進去)。

現在假設我們要寫一隻計數器程序。我們需要建立兩個帳戶,一個用來儲存代碼,一個用來儲存計數的變數。如下圖: account

PDA (Program Derived Address) 是什麼?

Solana 將代碼與數據分離讓升級 Program 變得簡單。在Solana 可以在重用數據帳戶的同時,部署新版本的 Program 到相同地址,升級後數據並不會丟失。

然而,Solana也有一個令人尷尬的缺點。當每次要調用程序(Program),想要修改狀態時,都要傳入Data account 地址,且需要相對應的私鑰才能進行修改,增加了開發上的麻煩,這個私鑰應該要存在哪裡呢?直接存在web2 作為環境變數好像有點奇怪,將私鑰存在程序本身、把data附加到程序上,變得類似以太坊是更好的辦法。PDA 由此而生。

PDA ,也就是程序派生帳戶,由一組種子與程序id 透過 findProgramAddres function 生成,如果找到的地址位於 ed2559 曲線上,便透過一個叫做 bump 方法進行跳躍,直到找到一個不位於 ed2559 的地址。這個方法生成的結果具有唯一性。

pda-curve

有了 PDA ,程序可以直接對需要 PDA 的指令進行簽名。

account-matrix


圖片來源

Rent

另外,值得一提的是,在 Solana 建立 accounts 存放資料是要花錢的,這個行為被稱作 Rent。

使用下列指令可以查看存放 15000 bytes 的資料需要多少資金。

solana rent 15000

截圖 2022-11-21 下午7.23.37.png

第三行有一個詞叫做 Rent-exempt,這是什麼意思呢?其實就是:如果該帳號持有超過兩年份的租金,就可以免收費。以上圖為例,建立帳號時存入 0.10529088 SOL,若想廢棄該帳號的使用,將這些錢全部轉出來,該帳號就會自動被銷毀

目前,在 Solana 上建立帳號強制 Rent-exempt。

Take a deep look at Solana

Solana wiki

Solana cookbook