閱讀時間 5 分鐘
概覽
Solana 的帳戶模型是 Solana 生態系統中至關重要的一部分,對於開發者而言——尤其是從其他區塊鏈轉移過來的開發者——這可能是最難理解的概念之一。若要高效地在 Solana 區塊鏈上進行開發,深入理解帳戶模型至關重要。讓我們先定義何謂帳戶,並探討不同類型的帳戶,以及如何建立帳戶並與其互動。
什麼是帳戶?
帳戶是指在 Solana 區塊鏈上儲存資料的任何位置。相較於以太坊等其他區塊鏈,Solana 區塊鏈的獨特之處在於資料的儲存與管理方式。以下是各種帳戶類別:
-程式帳戶- 這些帳戶用於儲存可執行程式碼以及相當於以太坊智慧合約的內容。
-儲存帳戶- 這些帳戶用於儲存與程式相關的資料。
-代幣帳戶- 這些帳戶用於追蹤代幣的帳戶餘額,並允許在帳戶之間轉移或接收代幣。
在 Solana 區塊鏈中,程式與程式的資料/狀態是分離的。兩者雖各自被分配到不同的帳戶,但彼此之間仍存在關聯。相較之下,在以太坊中,智慧合約及其資料皆位於區塊鏈上的同一個位置。若要建立一個用來統計程式執行之代幣轉帳次數的程式,您不僅需要建立負責執行轉帳的程式,還需建立另一個帳戶來儲存轉帳次數的統計資料。

以傳統金融領域為例,你可以將程式視為一張借記卡,銀行視為儲存帳戶,而帳戶餘額則視為代幣帳戶。雖然這些元素彼此相連,但它們位於不同的位置。如果你遺失了借記卡,並不會因此失去銀行帳戶(但帳戶內的資金可能會遺失)。 你的卡片也是唯一能透過購物來改變帳戶餘額的卡片。同樣地,與儲存帳戶相關聯的程式,也是唯一能改變資料狀態的程式。
帳戶類型
Solana 區塊鏈上有兩種類型的帳戶:可執行帳戶與不可執行帳戶。程式即為可執行帳戶,並儲存程式的不可變程式碼。程式的程式碼首先以 Rust 或 C/C++ 編寫,然後透過LLVM 編譯器基礎架構編譯成位元組碼。
資料儲存與代幣餘額皆儲存於非可執行帳戶中,因為這些資料可能被變更。為了控制誰能變更這些資料,非可執行帳戶會被指派一個擁有者程式位址。其他程式可以讀取其他帳戶的資料,但若試圖修改該資料,交易將會失敗。
租金
遺憾的是,將所有這些資料儲存於獨立的帳戶中並非免費,而是會產生一些成本。對開發者而言,值得慶幸的是,這些成本——稱為 租金,是以「拉姆波特」(lamports)支付的。拉姆波特是 Solana 代幣 SOL 的分數單位,用於在 Solana 區塊鏈上進行微支付。租金費用是根據帳戶的儲存容量來計算的。儲存的資料量越大,租金費用就越高。
Solana 區塊鏈的租金費用是在每個時代結束時收取的。所謂「時代」,是指領先驗證者仍具備生成交易區塊資格的期間。您可在此處的 Solana 區塊鏈瀏覽器中查看當前及過往時代的相關資料。
在撰寫本文之際,一個時代大約持續 2 天。就像現實生活一樣,如果某個帳戶餘額為零且無法支付租金,該帳戶就會從區塊鏈中移除。
若帳戶的代幣餘額中持有至少相當於 2 年租金的金額,即可獲得租金豁免。估算租金成本的簡易方法,是透過 Solana CLI 使用 `solana rent` 指令。只要輸入帳戶的大小(以位元組為單位),即可查看每位元組的租金、每個紀元的租金,以及帳戶獲得租金豁免所需的最低金額:

如何建立帳號
要在 Solana 上建立帳戶,客戶端必須先產生一組金鑰對(公鑰與私鑰)。 接著,客戶端會透過SystemProgram::CreateAccount呼叫來註冊公鑰,並為該帳戶分配所需的数据儲存空間。目前,此儲存空間大小日後無法變更,且上限為 10 MB。若需要更大的儲存空間,程式可將數據從一個帳戶複製到另一個容量較大的帳戶中。
建立帳戶時,必須為該帳戶指派一位擁有者。只有帳戶的擁有者才能修改帳戶內儲存的資料。帳戶建立後的預設擁有者稱為「系統程式」。 「系統程式」是 Solana上的原生程式,負責建立帳戶、在帳戶中分配資料,以及將帳戶所有權指派給已連線的程式。原生程式是指必須由 Solana 上所有驗證者執行的程式。
系統程式亦負責處理其被指定為擁有者的帳戶所進行的拉姆波特轉帳。若使用者建立一個帳戶用來儲存代幣餘額,該代幣的轉帳將由系統程式處理。使用者會使用其私鑰簽署轉帳指令,而系統程式則負責從寄件人帳戶扣除代幣,並將代幣存入收件人帳戶。
與帳戶互動
由於程式碼與程式所儲存的資料屬於不同的帳戶,因此任何程式都能讀取其他帳戶的資料。此外,任何程式都能向帳戶中增加 lamports,但只有帳戶擁有者才能從中扣除 lamports。這在開發可能需要與非自身擁有的帳戶進行互動的程式時,非常有用。
讀取帳戶時,您會看到系統回傳以下資料:

以下是該數據的詳細說明:
-公鑰- 分配給此帳戶的公鑰
-餘額- 此帳戶持有的 SOL 數量
-所有者- 擁有此帳戶所有權的程式地址
-可執行帳戶- 此帳戶是否為可執行帳戶
-rent_epoch- 此帳戶將於下一個何時支付租金
-長度- 帳戶的大小
結論
在 Solana 上,一切操作皆透過建立帳戶及與帳戶互動來完成。將程式與其所使用的資料分離,是 Solana 在程式碼與狀態管理方面的一種獨特做法。要成功在 Solana 上進行開發,理解所有權規則以及程式如何在這些規則下運作至關重要。若要將這些概念付諸實踐,請參閱我們其他關於 Solana 的教學指南。
訂閱我們的電子報,獲取更多文章和指南。如有任何意見回饋,歡迎透過Twitter聯絡我們。您隨時都可以在我們的Discord社群伺服器上與我們聊天,那裡聚集了您這輩子見過最酷的開發者們 :)