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