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

news2024/11/17 3:44:53

目录

一.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
测试截图:

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`);

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

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

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

    // 账户列表
    let accounts_iter = &mut accounts.iter();

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

log截图:

测试截图:

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;
}

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

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

测试截图:

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

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());
}

三、相关学习文档

1.Solana官方文档

2.Solana GitHub 仓库

四、在线编辑器

1.Solana IDE

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1892095.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ai的快速发展会是下一个风口嘛?

人工智能的快速发展确实是当前和未来科技领域的一个重要趋势,可以说是一个“风口”。以下是几个支持这一观点的理由: 1. **技术进步和应用广泛性**:人工智能技术在各个领域的应用越来越广泛,涵盖了医疗、金融、制造、交通、媒体等…

在TkinterGUI界面显示WIFI网络摄像头(ESP32s3)视频画面

本实验结合了之前写过的两篇文章Python调用摄像头,实时显示视频在Tkinter界面以及ESP32 S3搭载OV2640摄像头释放热点(AP)工作模式–Arduino程序,当然如果手头有其他可以获得网络摄像头的URL即用于访问摄像头视频流的网络地址&…

MySQL关于日志15个讲解

​​​​​​ 1. redo log是什么? 为什么需要redo log? redo log 是什么呢? redo log 是重做日志。 它记录了数据页上的改动。 它指事务中修改了的数据,将会备份存储。 发生数据库服务器宕机、或者脏页未写入磁盘,可以通过redo log恢复…

昇思25天学习打卡营第7天|深度学习流程全解析:从模型训练到评估

目录 构建数据集 定义神经网络模型 定义超参、损失函数和优化器 超参 损失函数 优化器 训练与评估 构建数据集 首先从数据集 Dataset加载代码,构建数据集。 代码如下: #引入了必要的库和模块,像 mindspore 以及相关的数据处理模块等等。…

初识Spark

一、简介 官网:Apache Spark™ - Unified Engine for large-scale data analytics Apache的顶级项目,用于大规模数据处理的统一分析引擎。 支持语言:Java、Scala、Python和R (源码为Scala) 高级工具: 1、SparkSQL用于SQL和结构…

IDEA开发必备的插件,实测非常好用

1、Lombok -- 简化Java代码开发 推荐指数: ★★★★★ Lombok:首当其冲的非常推荐的当然是Lombok Lombok能以简单的注解形式来简化Java代码,提高开发人员的开发效率。例如开发中经常需要写的JavaBean,都需要花时间去添加相应的ge…

如何在忘记密码的情况下删除华为ID激活锁

当您手中拥有最新的华为手机时,您会忍不住探索新的可能性,以从您的设备中获得最大价值。您可以下载新的应用程序、Android 启动器等,但这些应用程序中的大多数都会给您的手机带来错误和安全威胁,如果不恢复出厂设置,可…

对标 GPT-4o 的开源实时语音多模态模型:Moshi

是由法国的 AI 实验室 Kyutai 推出的实时语音多模态模型,支持听、说、看,最关键的是你现在就可以在浏览器中使用,如果这个链接延迟高,可以试试这个, 无需输入邮箱,点击 Join queue 即可。 简单体验了下,比…

自学新标日第十七课(已完结)

第十七课 单词 单词假名声调词义洋服ようふく0西服セーター1毛衣ノートバソコン4笔记本电脑バイク1摩托车お汁粉おしるこ2年糕小豆汤天ぷらてんぷら0天麩羅初詣はつもうで3新年后首次参拜健康けんこう0健康恋愛れんあい0恋爱相手…

springboot 整合 mybatis-plus

一.前言 1. mybatis-plus是什么 mybatis-plus是一个对mybati框架的拓展框架,它在mybatis框架基础上做了许多的增强,帮助我们快速的进行代码开发。目前企业开发中,使用mybati的项目基本会选择使用mybatis-plus来提升开发效率。 2.官网地址&…

机器学习:预测评估8类指标

机器学习:8类预测评估指标 R方值、平均值绝对误差值MAE、均方误差MSE、均方误差根EMSE、中位数绝对误差MAD、平均绝对百分误差MAPE、可解释方差分EVS、均方根对数误差MLSE。 一、R方值 1、说明: R方值,也称为确定系数或拟合优度&#xff…

3099.力扣每日一题7/3 Java(击败100%)

博客主页:音符犹如代码系列专栏:算法练习关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 目录 思路 解题方法 时间复杂度 空间复杂度 Code 思路 首先要解决如何…

MobileVitv1替换yolov8主干网络

一、原理介绍 MobileViT模型是为移动设备设计的轻量级、通用目的视觉变换器。它融合了卷积神经网络(CNN)和视觉变换器(ViT)的优势,旨在在保持高效性能的同时减少模型参数和降低延迟。以下是关于MobileViT模型的主要原理…

2024企业数据资产化及数据资产入表方案梳理

01 数据资产入表:是一个将组织的各类数据资产进行登记、分类、评估和管理的流程。 数据资产包括:客户信息、交易记录、产品数据、财务数据等。 做个比喻吧:数据资产入表就像是给公司的数据资产做“人口普查”—— ①找出公司有哪些数据找…

在uni-app使用vue3使用vuex

在uni-app使用vue3使用vuex 1.在项目目录中新建一个store目录,并且新建一个index.js文件 import { createStore } from vuex;export default createStore({//数据,相当于datastate: {count:1,list: [{name: 测试1, value: test1},{name: 测试2, value: …

【DataSophon】DataSophon1.2.1服务组件开启 kerberos

目录 一、DataSophon是什么 1.1 DataSophon概述 1.2 架构概览 1.3 设计思想 二、集成组件 三、环境准备 四、安装kerberos服务 4.1 Zookeeper 4.2 HDFS 4.3 HBase 4.4 YARN 4.5 hive 【DataSophon】大数据管理平台DataSophon-1.2.1安装部署详细流程-CSDN博客 【Da…

Qt中udp指令,大小端,帧头帧尾实际示例

前言 虽然QT中,udp发送和接收,其实非常简单,但是实际工作中,其实涉及到帧头帧尾,字节对齐,以及大小端序的问题。比如网络中,正规的一般都是大端序,而不是小端序,大多数的…

2024鲲鹏昇腾创新大赛集训营Ascend C算子学习笔记

异构计算架构(CANN) 对标英伟达的CUDA CuDNN的核心软件层,向上支持多种AI框架,向下服务AI处理器,发挥承上启下的关键作用,是提升昇腾AI处理器计算效率的关键平台。主要包括有各种引擎、编译器、执行器、算…

mac磁盘工具如何合并分区 macos 磁盘工具 无法抹除 磁盘管理软件哪个使用率最高

一、什么是NTFS格式分区 NTFS格式分区是微软公司开发的诸多文件系统中的一种。NTFS格式分区是一种文件系统,磁盘只有在安装了文件系统后才能被正常使用,文件系统的格式有非常多,常见的有FAT 32和NTFS。 作为常见文件系统,NTFS格式…

Conmi的正确答案——ESP32-C3开启安全下载模式

IDF版本:4.4.7 注意事项:一旦烧录“安全下载模式”,模组将无法被读取或清理,只能通过eclipse原项目烧录程序进行重新烧录,无法再烧录其他固件。 20240703110201——追加解法,暂时无法解安全下载模式 &…