小试牛刀-Solana合约账户详解

简介: 开发语言上,Solana合约使用Rust为主要开发语言,其次是Solana合约并不像其它链那样将数据直接存到合约里,而是使用了更加独立的账户来代币转移和存储数据。按功能可以分为以下账户

 目录

一.Solana

三.账户详解

3.1 程序账户

3.2 系统所有账户

3.3 程序派生账户(PDA)

3.4 Token账户

四、相关学习文档

五、在线编辑器


Welcome to Code Block's blog

本篇文章主要介绍了

[Solana合约账户详解]

❤博主广交技术好友,喜欢文章的可以关注一下❤

注:该篇文章在测试环境下进行,使用测试账户进行。

一.合约账户类型

       开发语言上,Solana合约使用Rust为主要开发语言,其次是Solana合约并不像其它链那样将数据直接存到合约里,而是使用了更加独立的账户来代币转移和存储数据。按功能可以分为以下账户:

  •        程序账户
  •        系统所有账户
  •        程序派生账户(PDA)
  •        Token账户

二.账户详解

2.1 程序账户

       程序账户即为合约部署后生成的账户,这个账户用于存储和执行智能合约代码,即合约部署后生成的地址。这里部署地址是:Fckx9Sxf17hyauwe1nfxL9GtvruESb5kTrU2LCPLJpzm

测试截图:

image.gif 编辑

2.2 系统所有账户

      用户通过调用程序账户生成用于存储状态的数据的账户为系统所有账户,这个账户的所有者为当前合约。同时用户可以获得当前账户的公钥和私钥信息。使用TS创建的代码如下:

const greetingAccountKp = new web3.Keypair();
    const lamports = await pg.connection.getMinimumBalanceForRentExemption(
      GREETING_SIZE
    );
    console.log(GREETING_SIZE);
    const createGreetingAccountIx = web3.SystemProgram.createAccount({
      fromPubkey: pg.wallet.publicKey,
      lamports,
      newAccountPubkey: greetingAccountKp.publicKey,
      programId: pg.PROGRAM_ID,
      space: GREETING_SIZE,
    });
    const tx = new web3.Transaction();
    tx.add(createGreetingAccountIx);
    const txHash = await web3.sendAndConfirmTransaction(pg.connection, tx, [
      pg.wallet.keypair,
      greetingAccountKp,
    ]);
    console.log(`Use 'solana confirm -v ${txHash}' to see the logs`);

image.gif

执行上述代码并成功后,这里的greetingAccountKp内的公钥和私钥即为创建账户的公钥和私钥。可以通过以下方式进行打印:

console.log("publicKey:" + greetingAccountKp.publicKey.toBase58());
    console.log("secretKey:" + greetingAccountKp.secretKey);

image.gif

这个账户与普通账户的不同之处在于其用于存储数据,账户owner为当前程序账户,在合约内可以使用以下方式在合约内进行打印:

// 账户列表
    let accounts_iter = &mut accounts.iter();
    // 下一个账户
    let account = next_account_info(accounts_iter)?;
    // 打印账户拥有者
    msg!("account:{}", account.owner);

image.gif

log截图:

image.gif 编辑

测试截图:

image.gif 编辑

2.3 程序派生账户(PDA)

       在实际应用中,用户在创建账户后即需要存储账户信息,这显然是不符合实际需求的,首先这会生成大量账户浪费资源,并且不利于账户管理和维护。如实现用户锁仓功能:用户创建一个账户后,服务程序即需要存储这个钱包创建的对应账户地址。PDA账户很好的解决了这个问题。PDA的原理为让程序通过利用种子(方法名或其它)+用户钱包公钥+程序账户(合约地址),三者进行加密运算生成一个钱包地址,这个地址是唯一的,在后续运算中仍然会生成这个地址,这样即解决了账户存储和管理问题。TS代码PDA账户生成方式如下:

async function getPda(programId, userPubkey) {
  const [pda, bump] = await web3.PublicKey.findProgramAddressSync(
    [Buffer.from("lock"), userPubkey.toBuffer()],
    programId
  );
  console.log("PDA:", pda.toBase58());
  return pda;
}

image.gif

这里的lock为种子(种子是可变的,可使用对应合约方法名,便于管理),userPubkey为用户地址,programId为程序账户账户地址.使用如下方式进行调用(会发现每次生成地址结果为同一地址):

const pda = getPda(pg.PROGRAM_ID, greetingAccountKp.publicKey);
    console.log(pda);

image.gif

测试截图:

image.gif 编辑

通过截图可以看到运行多次生成的地址为相同的.

2.4 Token账户

       SPL账户即为存储某个特定的代币创建的账户,该账户用于存储某个特定类型的代币,创建方式如下:

async function createSPLAccount() {
    const mint = new web3.PublicKey('代币合约地址'); 
    const owner = payerAccount.publicKey; // 付款账户
    // 创建 SPL 账户
    const tokenAccount = await splToken.Token.createAccount(connection, {
        mint,
        owner,
    });
    console.log('SPL 账户创建成功:', tokenAccount.toBase58());
}

image.gif

三、相关学习文档

1.Solana官方文档

2.Solana GitHub 仓库

四、在线编辑器

1.Solana IDE

声明:该文章只作为学习和使用相关,不涉及投资等其它建议.

image.gif 编辑


目录
相关文章
|
机器学习/深度学习 SQL 分布式计算
Spark核心原理与应用场景解析:面试经验与必备知识点解析
本文深入探讨Spark核心原理(RDD、DAG、内存计算、容错机制)和生态系统(Spark SQL、MLlib、Streaming),并分析其在大规模数据处理、机器学习及实时流处理中的应用。通过代码示例展示DataFrame操作,帮助读者准备面试,同时强调结合个人经验、行业趋势和技术发展以展现全面的技术实力。
1800 0
|
区块链
小试牛刀-区块链Solana多签账户
在 Solana 区块链中,多签账户(Multisig Account)是一种智能合约账户,允许多个签名者共同管理和控制账户上的资产或操作。这种机制增强了账户的安全性和灵活性,特别适用于需要多个权限共同批准的操作场景,如资产管理、资金转移、或项目治理。
775 2
|
9月前
|
存储 人工智能 前端开发
Web3 系统开发的方案
Web3开发迈向实用化,构建涵盖DID、L2/L3与AI的复杂生态。基于五层架构,融合高性能链、去中心化存储、预言机与AI代理,聚焦RWA与DePIN落地,强调安全审计、Gas优化与去中心化治理,推动区块链真实价值释放。#区块链开发 #web3开发
|
11月前
攻略丨1688新手上路,快速掌握店铺运营技巧!
当然,1688运营的重要环节还有很多,不仅仅局限于老范所陈列的4个方面,更多的需要1688新手关注基础指标的变化,关注商品运营,关注流量承接,关注客户留存,数据化的运营,要有具体的指标跟进,很多1688运营日常无事可干,不会操作,越做越差,刚开始做店,希望得到一个新店执行方案,自己也不知道问题在哪里,找出路而不知道路在何方,那么,改变,就从这里开始吧,加油。
攻略丨1688新手上路,快速掌握店铺运营技巧!
|
缓存 固态存储 Java
Elasticsearch 的扩展性和性能调优
【9月更文第2天】Elasticsearch 是一个分布式的搜索和分析引擎,适用于各种大规模数据处理场景。随着数据量的增长和查询复杂度的增加,Elasticsearch 的性能优化变得尤为重要。本文将详细介绍如何通过硬件配置、集群规模调整以及查询优化策略来提升 Elasticsearch 的性能。
825 6
|
监控 安全 生物认证
网络安全中的身份认证与访问控制技术详解
【6月更文挑战第30天】网络安全聚焦身份认证与访问控制,确保合法用户身份并限制资源访问。身份认证涉及生物和非生物特征,如密码、指纹。访问控制通过DAC、MAC、RBAC策略管理权限。最佳实践包括多因素认证、定期更新凭证、最小权限、职责分离和审计监控。这些措施旨在增强系统安全,防范未授权访问。
2693 2
|
JSON 数据挖掘 API
1688商品列表API秘籍!轻松获取商品列表数据
1688商品列表API(alibaba.product.list.get)可批量获取商品信息,支持分页、筛选与排序,适用于商品管理与数据分析。本文提供Python调用示例,助您快速接入接口,实现商品数据高效处理。
|
前端开发 Java API
如何开发一套物业管理(园区式)系统?(附架构图+流程图+代码参考)
现代物业管理系统通过数字化手段提升管理效率,优化资源配置,助力小区、写字楼等场所实现高效、规范管理。本文详解系统功能设计、技术选型、开发流程及代码实现(Java + Spring Boot),并附常见问题解答,助你快速构建稳定、可扩展的物业管理平台。
|
人工智能 算法 安全
AI时代:不可替代的“人类+”职业技能
在生成式人工智能快速发展的背景下,关于“人类工作者是否会被算法取代”的焦虑日益增加。本文探讨了AI对职业的重塑作用,指出真正的挑战在于如何通过职业技能培训重新定义人类的不可替代性。文章分析了替代与创造的辩证关系,强调人机协作时代的核心能力,如架构设计力、情感智慧和伦理决策力,并提出职业技能培训应从岗位技能导向转向能力生态构建。最终,通过系统性培训发展“人类+”特质,使AI成为解放人类潜能的工具,而非竞争对手。
|
弹性计算 Oracle 固态存储
阿里云ESSD云盘性能级别PL0、PL1、PL2和PL3怎么选?
阿里云服务器ESSD云盘性能级别PL0、PL1、PL2和PL3怎么选择?不同性能级别对应的单盘IOPS性能上限、IO和吞吐量都不同,ESSD云盘容量越大可选择的PL级别越高,性能级别PL越高价格也越贵,阿里云百科来详细说下阿里云ESSD云盘不同性能级别区别以及选择方法:
6364 0
阿里云ESSD云盘性能级别PL0、PL1、PL2和PL3怎么选?