譯者 | 張業貴
審校 | 孫淑娟
區塊鏈在2008年成為熱點,它最初是一個分散的P2P公共交易數據庫,這種最早的區塊鏈形式被稱為區塊鏈1.0。開發人員基于強大的框架和眾多的實用工具,不斷探索區塊鏈技術的更多應用,并成功開發了區塊鏈的新版本,區塊鏈2.0。
區塊鏈2.0集成了最早版本的區塊鏈,并添加了更多功能,如透明性、改進的安全性和智能合約。區塊鏈技術中智能合約的出現讓這些功能都得以實現。
什么是智能合約?
智能合約是包含在計算機代碼中,在滿足指定條件時自動執行的數字協議條款。它是兩個匿名方之間值得信賴的工具,使他們能夠毫無顧慮地進行交易。它準確、高效、安全和透明。
支持智能合約的區塊鏈比不支持智能合約的區塊鏈更具有優勢。這是因為智能合約拓寬了區塊鏈技術的應用場景。例如,智能合約允許在單個區塊鏈上開發多個加密令牌,即單個區塊鏈可以成為多個令牌的主機,包括此類區塊鏈的原生加密貨幣。
區塊鏈技術中智能合約的另一個案例是非同質化代幣——NFT。這些案例以及越來越多的案例,驅動了基于智能合約的區塊鏈的發展,因此不是基于智能合約的區塊鏈正在尋找將智能合約納入的方法。比如最近比特幣soft-fork采用了 “Taproot”技術。支持智能合約的區塊鏈網絡有一種是Solana。
什么是Solana?
Solana是一個公共區塊鏈,以BFT(拜占庭容錯)算法作為塔共識算法。塔共識利用了歷史證明共識機制。作為最快的區塊鏈網絡之一,Solana可以達到約710,000 TPS。
Solana由高通前高管Anatoly Yakovenko于2017年創建。它支持智能合約、Dapps、DeFi平臺和NFT市場的創建。Solana網絡的原生加密貨幣是SOL,用于支付網絡上的交易費用,并在加密市場上交易。由于Solana網絡支持智能合約,因此在Solana網絡創建這些應用程序或解決方案都是可能的。
如何使用Anchor軟件在Solana中編寫智能合約
Anchor是Solana的Sealevel運行時框架工具,提供方便的開發支持。例如:
- IDL(接口定義語言)規范
- Rust 工具箱和eDSL(嵌入式域特定語言)- 用于編寫Solana程序
- 從IDL生成客戶端的TypeScript包
- CLI和工作區管理幫助開發完整的應用程序。
總地來說,Anchor使得在Solana網絡上創建智能合約容易得令人難以置信。在深入研究這個主題的細節之前,讓我們熟悉一些術語:
- Rust:Rust是一種卓越的多用途編程語言,將用于開發這種智能合約。
- Solana工具套件:包括命令行界面CLI。
首先,我們需要創建一個新的 Anchor 項目:
anchor init counterapp
您應該會在項目結構中看到以下文件和文件夾:
- program:智能合約所在的目錄或位置
- test:Javascript測試代碼
- migrations:啟動腳本
- app:前端應用程序構建目錄
現在,讓我們從程序目錄中找到lib.rs文件。
declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");
#[program]
pub mod counterapp {
use super::*;
pub fn initialize(ctx: Context<Initialize>) -> ProgramResult {
Ok(())
}
}
#[derive(Accounts)]
pub struct Initialize {}
這是最簡單的CLI程序。它有一個初始化函數,當調用應用程序時,該函數會成功執行。“Initialize”結構體定義了“initialize”函數的上下文。
完成項目設置后,下一步是創建我們的計數器應用程序。為了實現這一目標,我們必須先建立一個帳戶來保存數據。帳戶用于在Solana Sealevel存儲和檢索數據。
回想一下,我們已經定義了兩個結構:CounterAccount結構體是我們的帳戶信息,它包含將存儲計數的變量。
#[derive(Accounts)]
pub struct Create<'info> {
#[account(init, payer=user, space = 16+16)]
pub counter_account: Account<'info, CounterAccount>,
#[account(mut)]
pub user: Signer<'info>,
pub system_program: Program<'info, System>,
}
#[account]
pub struct CounterAccount {
pub count: u64,
}
Create結構是定義創建帳戶上下文的指令結構。
# [account (…) ] 定義在構建上下文時Anchor 預處理的指令和約束。
接下來創建我們的函數:
pub fn create(ctx: Context<Create>) -> ProgramResult {
let counter_account = &mut ctx.accounts.counter_account;
counter_account.count = 0;
Ok(())
}
create函數是RPC請求處理程序,上下文是Create 結構體。
現在已經完成了功能實現,讓我們編寫測試函數并啟動我們的智能合約。
import * as anchor from '@project-serum/anchor';
import { Program } from '@project-serum/anchor';
import { Counterapp } from '../target/types/counterapp';
describe('counterapp', () => {
const provider = anchor.Provider.env()
anchor.setProvider(provider);
const program = anchor.workspace.Counterapp as Program<Counterapp>;
const counterAccount = anchor.web3.Keypair.generate();
it('Is initialized!', async () => {
await program.rpc.create({
accounts: {
counterAccount: counterAccount.publicKey,
user: provider.wallet.publicKey,
systemProgram: anchor.web3.SystemProgram.programId,
},
signers: [counterAccount]
} as any)
});
it("Increment counter", async () => {
await program.rpc.increment({
accounts: {
counterAccount: counterAccount.publicKey
}
} as any)
})
it("Fetch account", async () => {
const account: any = await
program.account.counterAccount.fetch(counterAccount.publicKey)
console.log(account.count)
})
});
現在,運行測試。
anchor test
測試通過后,我們可以部署并啟動程序。確保 solana-test-validator 正在運行。
anchor deploy
譯者介紹
張業貴,51CTO社區編輯,從事企業信息化建設多年,致力于信息集成、數據治理和人工智能應用等,主要關注服務標準化、軟件過程改進,助力中小企業進行效率提升和價值創新。
原文標題:??How to Create Smart Contracts in Solana Using Anchor??,作者:Abubakar Maruf