如何在Solana中使用Anchor创建智能合约

919 阅读5分钟

image

区块链是一个不可变的公共账本,它安全地存储数据或信息,使其不容易被黑客攻击或修改。它是一个去中心化/分布式的数字交易账本,没有中央治理或第三方。它通过将数据分布在其生态系统的所有节点上来保护数据。

当区块链在2008年进入人们的视野时,它开始是一个去中心化的P2P公共交易数据库;这种最早的区块链形式被称为区块链1.0。随着开发者不断探索区块链技术的更多用例,并拥有强大的框架和更多的实用工具,他们成功开发了另一个版本的区块链,即区块链2.0。

区块链2.0结合了最早的区块链版本,并增加了更多的功能,如透明度、改进的安全性和智能合约。区块链技术中智能合约的出现在所有这些功能中是真正的。

什么是智能合约?

智能合约是一种嵌入在代码串中的自我执行的数字协议条款,在满足指定条件时执行。它是两个匿名方之间的可信工具,使他们能够毫无顾虑地相互交易。它是准确、高效、安全和透明的。

支持智能合约的区块链比那些不支持的区块链有优势。这是因为智能合约扩大了区块链技术的使用案例。例如,智能合约允许在一个区块链上开发多个加密代币,即一个区块链可以成为多个代币的宿主,包括这种区块链的本地加密货币。

区块链技术中智能合约的另一个用例是,它能够铸造不可伪造的代币-NFTs。这些用例以及更多的用例是带有智能合约的区块链背后的驱动力,以至于非智能合约的区块链正在寻求将其纳入其区块链网络的方法。这样的例子是最近的比特币软分叉,主题为 "Taproot"。支持智能合约的区块链网络之一是Solana。

什么是Solana?

Solana是一个公共区块链,在以BFT-Byzantine Fault Tolerance为主题的Tower Consensus上运行。塔式共识利用了历史证明的共识机制。作为最快的区块链网络之一,Solana可以处理大约710,000TPS。

Solana是由高通公司的前高管Anatoly Yakovenko在2017年创建的。它支持与DeFi平台和NFT市场一起创建智能合约和Dapps。Solana网络的原生加密货币是SOL,用于抵消网络上的交易费用,也可以在加密货币市场上进行交易。Solana网络的所有应用或解决方案都是因为它所支持的智能合约而成为可能。

如何使用Anchor软件在SOLana中编写智能合约

Anchor是Solana的Sealevel运行时的一个软件工具,提供方便的开发工具,如。

  • 接口定义语言-IDL-规格化
  • Rust crates和eDSL-嵌入式特定领域语言,用于编写Solana程序
  • TypeScript包,用于从IDL生成客户端
  • CLI和工作区管理来开发完整的应用程序。

一般来说,Anchor令人难以置信地使在Solana网络上创建智能合约变得容易。在深入研究这个问题的细枝末节之前,让我们先熟悉一下一些术语

  1. Rust。Rust是一种卓越的多用途编程语言,将被用于开发这个智能合约。
  2. Solana工具套件。这包括命令行界面-CLI。

现在,让我们继续。

首先,我们需要创建一个新的锚点项目。

anchor init counterapp

你应该在项目结构中看到以下文件和文件夹。

program:这是智能合约的目录或位置

test:在这里可以找到javascript测试代码

migrations:启动脚本

app:前台将在这里建立

现在,让我们从程序目录中找到lib.rs 文件


declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");

#[program]
pub mod counterapp {
    use super::*;
    pub fn initialize(ctx: Context) -> ProgramResult {       
        Ok(())
    }
}
#[derive(Accounts)]
pub struct Initialize {}

这是最直接的CLI程序。它有一个函数initialize,被调用后成功执行。initialize结构 "定义了 "initialize "函数的上下文。

设置好我们的项目后,接下来就是创建我们的计数器应用程序。为了实现这一目标,我们必须首先设置一个账户来保存我们的数据。如果你想知道账户的用途是什么,账户是Solana Sealevel用户存储和检索数据的手段。

回顾一下,我们已经定义了两个结构:CounterAccount 结构是我们的Account ,其中包括将存储我们的计数的变量。


#[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) -> 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;    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

l o a d i n g
. ..评论及更多!