简介:通过 IDL 生成代码 调用 anchor 智能合约。 全网首发

        使用 anchor 可以快速开发 solana 上面的智能合约 , 在本案例中我们 先使用 anchor 创建一个只能合约( 多个函数方法)。 部署到 dev 链上。 通过 anchor 的 IDL 生成 代码, ( 我这边是go 框架代码这里别的语言也是可以的), 然后编写代码 调用 通过 IDL 生成的代码 来 调用 anchor 智能合约的函数

1.编写 anchor 只能合约 部署上链

1.1 anchor 智能合约的编写: 

◒:案例中使用 rust 编写 anchor 只能合约,一共四个方法,用户操作 pad 账户中的一个数值

  • initialize  初始化函数  只能调用一次

  • reset 重置为一个指定的值,可多次调用

  • increment 累加 可多次调用

  • subtract 累减 可多次调用

use anchor_lang::prelude::*;// This is your program's public key and it will update
// automatically when you build the project.
declare_id!("HKvWCsAhzhXRfj8zNhNrofjV3dDjSmm42EguMKK3X5n");#[program]
pub mod anchor_counter {use super::*;//初始化pub fn initialize(ctx: Context<Initialize>, init_data: u64) -> Result<()> {msg!("initialize from: {:?}", ctx.program_id);//直接给pad 账户复制ctx.accounts.counter.count = init_data;Ok(())}//重置 数据到指定 值pub fn reset(ctx: Context<UpdateCount>, init_data: u64) -> Result<()> {let counter = &mut ctx.accounts.counter;msg!("increment from: {:?}", ctx.program_id);msg!("previous counter: {:?}", counter.count);counter.count = init_data;//counter.count -= 2;msg!("after counter: {:?}", counter.count);Ok(())}//累加pub fn increment(ctx: Context<UpdateCount>) -> Result<()> {let counter = &mut ctx.accounts.counter;msg!("increment from: {:?}", ctx.program_id);msg!("previous counter: {:?}", counter.count);counter.count = counter.count.checked_add(1).unwrap();//counter.count -= 2;msg!("after counter: {:?}", counter.count);Ok(())}//累减pub fn subtract(ctx: Context<UpdateCount>, count: u64) -> Result<()> {let counter = &mut ctx.accounts.counter;msg!("increment from: {:?}", ctx.program_id);msg!("previous counter: {:?}", counter.count);//counter.count = counter.count.checked_add(1).unwrap();counter.count -= count;msg!("after counter: {:?}", counter.count);Ok(())}
}#[derive(Accounts)]
pub struct Initialize<'info> {#[account(mut)]// user 调用者 签名者, 是否 mut有权限修改信息pub user: Signer<'info>,// counter 数据账户  pda 派生#[account(init,seeds = [b"counter_seed"],bump,payer = user,space = 8 + 8)]pub counter: Account<'info, Counter>,// 程序账户pub system_program: Program<'info, System>,
}#[derive(Accounts)]
pub struct UpdateCount<'info> {// user 调用者 签名者pub user: Signer<'info>,#[account(mut)]pub counter: Account<'info, Counter>,
}#[account]
pub struct Counter {count: u64,
}
 1.2 部署智能合约。  导出 IDL 文件 

2.通过 anchor 智能合约 IDL 文件,生成代码

导出 anchor 智能合约的 IDL 文件我们可以 得到一个  idl.json 文件。因为我空间选取的是 go,所以我这边需要使用  anchor-go 库, 来把  idl.json 配置文件 生成一个 go 脚本。 

github.com/gagliardetto/anchor-go

 go run github.com/gagliardetto/anchor-go --src=idl.json

 运行上面命令。就会在当前项目中生成一个  generated 文件夹  以ancho 智能合约 项目名为 文件夹的目录。

3.使用 IDL 生成的代码,代用智能合约

这里直接值 使用生成的代码 构造合约,然后调用,调用完我们通过 区块链浏览器查看 发现数据已经变化了。 说明调用时成功的  

package mainimport ("anchor-go/generated/anchor_counter""fmt""github.com/gagliardetto/solana-go""github.com/gagliardetto/solana-go/rpc"confirm "github.com/gagliardetto/solana-go/rpc/sendAndConfirmTransaction""github.com/gagliardetto/solana-go/rpc/ws""golang.org/x/net/context"
)//TIP <p>To run your code, right-click the code and select <b>Run</b>.</p> <p>Alternatively, click
// the <icon src="AllIcons.Actions.Execute"/> icon in the gutter and select the <b>Run</b> menu item from here.</p>func main() {// 创建 RPC 客户端rpcClient := rpc.New(rpc.DevNet_RPC)wsClient, err := ws.Connect(context.Background(), rpc.DevNet_WS)if err != nil {panic(err)}response, err := rpcClient.GetVersion(context.TODO())if err != nil {panic(err)}fmt.Println("version", response.SolanaCore)// 交易签名账户 密钥对fromPrivateKey, err := solana.PrivateKeyFromBase58("你 anchor 所属 钱包 私钥") // 私钥if err != nil {panic(err)}fromPublicKey := fromPrivateKey.PublicKey()// 获取最新的区块哈希recent, err := rpcClient.GetLatestBlockhash(context.TODO(), rpc.CommitmentFinalized)if err != nil {panic(err)}//anchor 只能合约 地址anchorID := solana.MustPublicKeyFromBase58("HKvWCsAhzhXRfj8zNhNrofjV3dDjSmm42EguMKK3X5n")anchor_counter.SetProgramID(anchorID)// 通过随机因子 获取 PDA 账号padPublicKey, _, _ := solana.FindProgramAddress([][]byte{[]byte("counter_seed")}, anchorID)//调用 anchor 智能合约的  累加方法transferInstruction := anchor_counter.NewIncrementInstruction(fromPublicKey, padPublicKey)//调用 anchor 智能合约的  重置方法//transferInstruction := anchor_counter.NewResetInstruction(2025, fromPublicKey, padPublicKey)// 创建交易tx, err := solana.NewTransaction([]solana.Instruction{transferInstruction.Build()},recent.Value.Blockhash,solana.TransactionPayer(fromPublicKey),)if err != nil {panic(err)}fmt.Println(tx)// 签名交易_, err = tx.Sign(func(key solana.PublicKey) *solana.PrivateKey {if fromPrivateKey.PublicKey().Equals(key) {return &fromPrivateKey}return nil},)if err != nil {panic(fmt.Errorf("unable to sign transaction: %w", err))}//发送并等待交易确认sig, err := confirm.SendAndConfirmTransaction(context.TODO(),rpcClient,wsClient,tx,)if err != nil {panic(err)}fmt.Println("Transaction confirmed:", sig)
}
  •  beta.solpg.io 编辑器:

  •  区块链浏览器:

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Clickhouse系列】事务

目录 1. 标准 ACID 支持场景 (MergeTree 引擎家族) 2. 非 ACID 场景 3. 实验性事务功能 (非云环境) 总结 参考文档 事务性 (ACID) 支持 | ClickHouse Docs ClickHouse ACID 支持核心要点 1. 标准 ACID 支持场景 (MergeTree 引擎家族) • 单分区插入 (原子块) • ✅ 原子性…

在cursor中,配置jdk和maven环境,安装拓展插件

目录 1.手动配置jdk和maven 2.安装java拓展插件 1.手动配置jdk和maven 第一步&#xff1a;按ctrl shift p, 搜索“Preferences: Open User Settings (JSON)” 并回车&#xff0c;打开 settings.json 文件 。然后添加或修改以下内容&#xff1a; "java.home": &qu…

(线性代数最小二乘问题)Normal Equation(正规方程)

Normal Equation&#xff08;正规方程&#xff09; 是线性代数中的一个重要概念&#xff0c;主要用于解决最小二乘问题&#xff08;Least Squares Problem&#xff09;。它通过直接求解一个线性方程组&#xff0c;找到线性回归模型的最优参数&#xff08;如权重或系数&#xff…

在架构设计中平衡动态语言与静态语言部署差异的策略分析

在软件架构设计过程中&#xff0c;语言的选型不仅仅关乎开发效率&#xff0c;更直接影响系统的部署速度、运行性能与维护成本。动态语言&#xff08;如 Python、Node.js&#xff09;部署快、开发灵活&#xff1b;静态语言&#xff08;如 Go、Java、Rust&#xff09;性能强、类型…

我的VSCode中那些插件

前言 最近在研究VUE.JS&#xff0c;而VUE官方推荐使用VSCode作为开发工具&#xff0c;因此最近才开始大量使用这个工具。在使用过程中&#xff0c;总会遇到一些视频博主推荐某某插件&#xff0c;于是我都将其安装在我的VSCode上。这里记录一下&#xff0c;仅供参考。 插件列表…

C# 时间格式日期格式使用合集

一、常用整理 C#时间使用整理,DateTime 使用整理_c#时间格式-CSDN博客 C# 本地时间格式&#xff0c;UTC时间格式&#xff0c;GMT时间格式处理 二、 C#如何获取今天零点的时间 C# 获取周一、周日 三、 C#计算两个时间年份月份差 C#时间点字符串转换为日期&#xff0c;当…

Ribbon负载均衡的具体实现原理

Ribbon 是 Netflix 开源的一款客户端负载均衡工具&#xff0c;广泛应用于微服务架构中&#xff0c;用于在客户端选择目标服务实例。 以下是 Ribbon 负载均衡的具体实现原理&#xff1a; 1. 什么是 Ribbon Ribbon 是一个客户端负载均衡器&#xff0c;负责从服务注册中心&#…

iOS APP上架App Store实践:通过自动化流程和辅助工具高效提

在现代开发流程中&#xff0c;持续集成&#xff08;CI&#xff09;已经成为必不可少的环节。对于iOS应用的开发与发布&#xff0c;持续集成不仅限于构建过程&#xff0c;还应该涵盖从代码提交到版本发布的整个生命周期。然而&#xff0c;由于iOS平台对开发环境的限制&#xff0…

3443. K 次修改后的最大曼哈顿距离

3443. K 次修改后的最大曼哈顿距离 题目链接&#xff1a;3443. K 次修改后的最大曼哈顿距离 代码如下&#xff1a; class Solution { public:int maxDistance(string s, int k) {int res 0;// 定义一个大小为 X&#xff08;88&#xff09;的数组&#xff0c;并初始化为 0int…

【Ubuntu】Windows11安装虚拟机超详细图文教程(VMware17.6.1 + ubuntu-24.04.2)

目录 前言 一、准备工作 1、工具安装包 2、获取方式 3、本人的电脑安装环境介绍 二、虚拟机磁盘分区&#xff08;可选&#xff09; 1、分区助手安装 2、为虚拟机准备一个单独的磁盘分区 三、VMware安装 四、ubuntu镜像安装 1、Ubuntu镜像iso文件加载引导 2、Ubuntu…

计算机视觉(Computer Vision, CV)

目录 一、核心任务 二、常见应用场景 三、主流技术框架与工具 四、热门算法简述 五、发展趋势 六、计算机视觉学习路线图&#xff08;从入门到实战&#xff09; 1.阶段总览 2.学习路径详解 阶段一&#xff1a;CV入门基础 学习目标&#xff1a; 推荐内容&#xff1a;…

使用Dagster资产工厂模式高效管理重复ETL任务

本文介绍了如何利用Dagster的资产工厂模式来高效管理和自动化重复的ETL&#xff08;提取、转换、加载&#xff09;任务。通过Python函数和YAML配置文件的结合&#xff0c;我们可以轻松地创建和管理大量相似的资产&#xff0c;同时提高代码的可维护性和可配置性。文章还探讨了如…

浅谈开源在线客服系统与 APP 集成的技术方案与优劣势

在为移动端 App 接入在线客服系统的过程中&#xff0c;我经历了长时间的技术选型探索。最初&#xff0c;我也曾被一些“技术理想主义”选项所吸引&#xff0c;比如让用户自己研发界面我提供 API 以获得最高自由度&#xff0c;或集成 SDK 以追求原生体验。然而&#xff0c;随着项…

prometheus+grafana+MySQL监控

prometheusgrafanaMySQL监控 环境说明 操作前提&#xff1a; 先去搭建Docker部署prometheusgrafana...这篇文章的系统 Docker部署prometheusgrafana...的参考文章&#xff1a; Docker部署prometheusgrafana…-CSDN博客 在的节点服务器上搭建MySQL数据库&#xff08;可以采用直…

多模态+类人认知:Embodied AI迈向AGI的三大瓶颈与突破路径

作者&#xff1a;Yequan Wang&#xff1b;Aixin Sun 摘要 AGI常被视为本质上具有具身特性。随着机器人技术和基础人工智能模型的最新进展&#xff0c;我们正站在一个新时代的门槛上——这一时代以日益通用化的具身人工智能系统为标志。本文通过提出一个涵盖五个层级&#xff…

wpf DataTemplate 宽度和控件宽度一样

wpf DataTemplate 宽度和控件宽度一样 在WPF中,如果你想要一个DataTemplate的宽度与它内部控件的宽度一致,你可以使用几种不同的方法来实现这一点。下面是一些常见的方法: 方法1:使用DataTemplate的Width属性 你可以在DataTemplate中直接设置Width属性,使其与内部控件的…

C#上位机实现报警语音播报

我们在开发C#上位机时&#xff0c;有时候会需要将报警信息通过语音进行播报&#xff0c;今天跟大家分享一下具体的实现过程。 一、组件安装 首先我们创建好一个Windows窗体项目&#xff0c;然后添加System.Speech库引用。 点击引用&#xff0c;右击添加引用&#xff0c;在程…

01-StarRocks安装部署FAQ

StarRocks安装部署FAQ 概述 本文档整理了StarRocks安装部署过程中常见的问题和解决方案,涵盖了环境准备、集群部署、配置优化等各个方面,帮助用户快速解决安装部署过程中遇到的问题。 环境准备FAQ Q1: StarRocks对硬件配置有什么要求? A: StarRocks的硬件配置要求如下:…

MinIO入门教程:从零开始搭建方便快捷的分布式对象存储服务

目录 一、MinIO简介二、环境准备三、MinIO服务部署1. 下载指定版本MinIO镜像2. 启动MinIO容器3. 参数详解 四、访问MinIO控制台1. 在浏览器中打开管理控制台&#xff1a;2. 输用户名和密码登录3. 创建存储桶Bucket4. 设置访问权限为公有5. 上传文件6. 访问文件 一、MinIO简介 …

多卡解决报错torch.distributed.elastic.multiprocessing.errors.ChildFailedError的问题

使用多卡运行 Pytorch出现下面的报错&#xff1a; E0619 10:29:15.774000 5065 site-packages/torch/distributed/elastic/multiprocessing/api.py:874] failed (exitcode: -11) local_rank: 0 (pid: 5184) of binary: /root/miniconda3/bin/python Traceback (most recent ca…