solana链上智能合约开发案例一则
-
环境搭建
- 安装Solana CLI:Solana CLI是开发Solana应用的基础工具。你可以通过官方文档提供的安装步骤,在本地环境中安装适合你操作系统的Solana CLI版本。安装完成后,使用命令行工具进行配置,例如设置网络环境(如开发网络、测试网络或主网络)和钱包路径等。
- 选择代码编辑器:一个好的代码编辑器能够提高开发效率。对于Solana智能合约开发,Visual Studio Code是一个不错的选择。它有丰富的插件生态系统,你可以安装支持Rust(Solana智能合约常用语言)的插件,如“Rust - Analyzer”,帮助你进行代码自动补全、语法检查等操作。
-
编程语言学习(以Rust为例)
- 基础语法学习:Rust的基本语法包括变量声明、数据类型(如整数、浮点数、字符串等)、控制流(if - else语句、循环语句)和函数定义。例如,在Rust中声明一个变量
let x: u32 = 5;
,这里u32
表示无符号32位整数类型。 - 理解所有权系统:Rust的所有权系统是其核心特性之一。它确保了内存安全,避免了数据竞争和悬空指针等问题。例如,当一个值被移动(moved)到另一个变量时,原来的变量就不能再被使用。这有助于在智能合约开发中有效管理资源,防止出现内存泄漏等安全隐患。
- 学习结构体和枚举:结构体用于组合多个相关的值,而枚举用于定义一组可能的取值。在智能合约中,你可以使用结构体来表示复杂的数据结构,如账户状态。例如,定义一个代表用户账户的结构体
struct UserAccount { balance: u64, nonce: u8 }
,其中包含用户余额和一个用于防止重放攻击的随机数(nonce)。
- 基础语法学习:Rust的基本语法包括变量声明、数据类型(如整数、浮点数、字符串等)、控制流(if - else语句、循环语句)和函数定义。例如,在Rust中声明一个变量
-
智能合约框架 - Solana Program Library (SPL)
- 熟悉SPL标准:SPL提供了一系列的标准,用于在Solana上开发智能合约。例如,SPL Token标准定义了如何在Solana区块链上创建和管理数字资产。学习这个标准可以让你了解如何实现诸如创建新的代币、转账、查询余额等功能。
- 开发自定义SPL程序:在熟悉标准的基础上,你可以开始开发自己的SPL程序。这需要深入理解Solana的账户模型和指令集。例如,要开发一个简单的借贷智能合约,你需要考虑如何在账户中存储借贷信息,如何处理抵押品,以及如何根据用户的操作(如借款、还款)更新账户状态。
-
智能合约开发流程
- 项目初始化:使用Solana CLI或者其他开发工具创建一个新的智能合约项目。这通常会生成一个基本的项目结构,包括用于存放源代码的目录、配置文件等。例如,使用
anchor init my - contract - project
(如果使用Anchor框架)来初始化一个名为“my - contract - project”的项目。 - 编写智能合约代码:在项目的源代码目录中,根据你的需求编写智能合约代码。以Rust为例,你可以定义合约的入口点和各种函数来实现具体的业务逻辑。例如,一个简单的智能合约可能有一个函数用于接收用户的转账请求,并更新账户余额。
- 编译智能合约:完成代码编写后,需要将代码编译成Solana VM能够识别的格式。对于Rust编写的智能合约,使用
cargo build - - target = bpfel - unknown - unknown - release
命令(这是将Rust代码编译为Solana可执行的字节码格式的常见命令)来进行编译。 - 部署和测试智能合约:使用Solana CLI或者相关的部署工具将编译好的智能合约部署到Solana区块链上。在部署之前,通常需要先创建一个Solana钱包并获取足够的测试代币(如果在测试网络)。部署完成后,通过发送交易来测试智能合约的各种功能,检查是否按照预期执行。例如,在测试一个简单的数字资产合约时,测试转账功能是否能够正确更新账户余额。
- 项目初始化:使用Solana CLI或者其他开发工具创建一个新的智能合约项目。这通常会生成一个基本的项目结构,包括用于存放源代码的目录、配置文件等。例如,使用
-
与前端和钱包的交互(开发DApp)
- 前端开发(可选):如果要开发一个完整的去中心化应用(DApp),需要进行前端开发。使用JavaScript/TypeScript和相关的框架(如React)来构建用户界面。通过
@solana/web3.js
等库与Solana区块链和智能合约进行交互。例如,在前端界面中实现一个按钮,点击该按钮可以发送一笔交易来调用智能合约中的某个函数。 - 钱包集成:Solana上有多种钱包可供选择,如Phantom钱包。在DApp开发中,需要将钱包集成到前端应用中。这通常涉及到请求用户授权连接钱包、获取钱包地址等操作。通过钱包,用户可以签署交易,使得智能合约能够在区块链上执行。例如,当用户在DApp中进行一笔涉及智能合约的交易时,钱包会弹出提示,要求用户确认并签署交易。
- 前端开发(可选):如果要开发一个完整的去中心化应用(DApp),需要进行前端开发。使用JavaScript/TypeScript和相关的框架(如React)来构建用户界面。通过
-
开发一个简单的Solana数字资产(Token)智能合约案例
- 环境搭建
- 首先,确保已经安装了Solana CLI。打开终端,通过官方文档中的安装命令(如对于macOS可以使用
sh -c "$(curl -sSfL https://release.solana.com/v1.14.19/install)"
,版本号可能会更新)进行安装。安装完成后,使用solana config set --url devnet
将网络环境设置为开发网络(Devnet),方便测试。
- 首先,确保已经安装了Solana CLI。打开终端,通过官方文档中的安装命令(如对于macOS可以使用
- 创建项目并初始化
- 使用
anchor init token - contract
命令(假设已经安装了Anchor框架)创建一个名为“token - contract”的Solana智能合约项目。这会生成一个包含基本文件结构的项目目录,包括src
目录用于存放智能合约源代码,tests
目录用于存放测试代码等。
- 使用
- 编写智能合约代码(Rust)
- 在
src
目录下的主要合约文件(如lib.rs
)中,定义一个简单的数字资产合约。首先,引入必要的库和模块:
- 在
- 环境搭建
use anchor_lang::prelude::*;
- 然后,定义合约的主要结构和变量:
#[program]
pub mod token_contract {use super::*;pub fn initialize(ctx: Context<Initialize>) -> ProgramResult {let token_account = &mut ctx.accounts.token_account;token_account.supply = 0;token_account.mint_authority = *ctx.accounts.mint_authority.key;Ok(())}
}#[derive(Accounts)]
pub struct Initialize<'info> {#[account(init, payer = user, space = 8 + 8 + 32)]pub token_account: Account<'info, TokenAccount>,#[account(mut)]pub user: Signer<'info>,pub mint_authority: AccountInfo<'info>,
}#[account]
pub struct TokenAccount {pub supply: u64,pub mint_authority: Pubkey,
}
- 在这个代码片段中,`initialize`函数是合约的初始化函数。当合约首次部署时,这个函数会被调用,用于设置数字资产的初始供应(`supply`)为0,并指定铸币权限(`mint_authority`)。`TokenAccount`结构体用于存储数字资产账户的信息,包括供应数量和铸币权限的公钥。
- **编译智能合约**- 在项目目录下,通过命令`cargo build - - target = bpfel - unknown - unknown - release`将智能合约代码编译为Solana可执行的字节码格式。这一步会生成可以在Solana VM中运行的二进制文件。
- **部署和测试智能合约**- **部署**:首先,需要创建一个Solana钱包(如果还没有),可以使用`solana-keygen new`命令创建。然后,通过`solana airdrop 2`(在Devnet环境下)获取一些测试用的Solana代币到钱包,用于支付部署合约的费用。使用`anchor deploy`命令将编译好的智能合约部署到Solana开发网络。- **测试**:在`tests`目录下编写测试代码来验证智能合约的功能。例如,测试数字资产的初始化是否正确:
#[tokio::test]
async fn test_initialize() {// 构建测试环境let mut context = setup();// 调用初始化函数token_contract::initialize(context).await.unwrap();// 检查数字资产账户的供应是否为0assert_eq!(context.accounts.token_account.supply, 0);
}
- **与前端交互(可选)**- 如果要构建一个完整的去中心化应用(DApp),可以使用JavaScript和`@solana/web3.js`库来开发前端界面。例如,在一个简单的HTML页面中,通过以下代码连接到Solana钱包并调用智能合约的初始化函数:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8">
</head>
<body><button onclick="initializeContract()">Initialize Token Contract</button><script src="https://cdnjs.cloudflare.com/ajax/libs/@solana/web3.js/1.70.0/solana - web3.min.js"></script><script>async function initializeContract() {const connection = new solanaWeb3.Connection(solanaWeb3.clusterApiUrl('devnet'));const wallet = window.solana.connect();const programId = new solanaWeb3.PublicKey('YOUR_PROGRAM_ID');const transaction = new solanaWeb3.Transaction();const instruction = new solanaWeb3.TransactionInstruction({keys: [],programId: programId,data: Buffer.from([])});transaction.add(instruction);const signature = await wallet.sendTransaction(transaction, connection);console.log('Transaction Signature:', signature);}</script>
</body>
</html>
- 在上述代码中,需要将`YOUR_PROGRAM_ID`替换为实际部署的智能合约的程序ID。当用户点击按钮时,代码会连接到Solana开发网络的钱包,构建一个交易来调用智能合约的初始化函数,并发送交易。发送交易后,会在控制台打印出交易签名,用于跟踪交易状态。
这只是一个简单的Solana智能合约开发案例,实际应用中可能会涉及更复杂的业务逻辑,如转账、交易对创建、去中心化金融(DeFi)功能等。
相关文章:
solana链上智能合约开发案例一则
环境搭建 安装Solana CLI:Solana CLI是开发Solana应用的基础工具。你可以通过官方文档提供的安装步骤,在本地环境中安装适合你操作系统的Solana CLI版本。安装完成后,使用命令行工具进行配置,例如设置网络环境(如开发网…...
使用 PyTorch 实现 ZFNet 进行 MNIST 图像分类
在本篇博客中,我们将通过两个主要部分来演示如何使用 PyTorch 实现 ZFNet,并在 MNIST 数据集上进行训练和测试。ZFNet(ZFNet)是基于卷积神经网络(CNN)的图像分类模型,广泛用于图像识别任务。 环…...
车轮上的科技:Spring Boot汽车新闻集散地
1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理汽车资讯网站的相关信息成为必然。开发合适…...
IDEA2023 SpringBoot整合Web开发(二)
一、SpringBoot介绍 由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。SpringBoot提供了一种新的编程范式,可以更加快速便捷…...
国产三维CAD 2025新动向:推进MBD模式,联通企业设计-制造数据
本文为CAD芯智库原创整理,未经允许请勿复制、转载! 上一篇文章阿芯分享了影响企业数字化转型的「MBD」是什么、对企业优化产品设计流程有何价值——这也是国产三维CAD软件中望3D 2024发布会上,胡其登先生(中望软件产品规划与GTM中…...
ubuntu 之 安装mysql8
安装 # 如果 ubuntu 版本 > 20.04 则不用执行 wget 这步 wget https://dev.mysql.com/get/mysql-apt-config_0.8.12-1_all.debsudo apt-get updatesudo apt-get install mysql-server mysql-client 安装过程中如果没有提示输入密码 sudo cat /etc/mysql/debian.cnf # 查…...
Flink Lookup Join(维表 Join)
Lookup Join 定义(支持 Batch\Streaming) Lookup Join 其实就是维表 Join,比如拿离线数仓来说,常常会有用户画像,设备画像等数据,而对应到实时数仓场景中,这种实时获取外部缓存的 Join 就叫做维…...
Elasticsearch retrievers 通常与 Elasticsearch 8.16.0 一起正式发布!
作者:来自 Elastic Panagiotis Bailis Elasticsearch 检索器经过了重大改进,现在可供所有人使用。了解其架构和用例。 在这篇博文中,我们将再次深入探讨检索器(retrievers)。我们已经在之前的博文中讨论过它们…...
【并发模式】Go 常见并发模式实现Runner、Pool、Work
通过并发编程在 Go 程序中实现的3种常见的并发模式。 参考:https://cloud.tencent.com/developer/article/1720733 1、Runner 定时任务 Runner 模式有代表性,能把(任务队列,超时,系统中断信号)等结合起来…...
【前端知识】Javascript前端框架Vue入门
前端框架VUE入门 概述基础语法介绍组件特性组件注册Props 属性声明事件组件 v-model(双向绑定)插槽Slots内容与出口 组件生命周期样式文件使用1. 直接在<style>标签中写CSS2. 引入外部CSS文件3. 使用CSS预处理器4. 在main.js中全局引入CSS文件5. 使用CSS Modules6. 使用P…...
Springboot3.3.5 启动流程之 Bean创建流程
在文章Springboot3.3.5 启动流程(源码分析)中我们只是粗略的介绍了bean 的装配(Bean的定义)流程和实例化流程分别开始于 finishBeanFactoryInitialization 和 preInstantiateSingletons. 其实,在Spring boot中,Bean 的装配是多阶段的…...
golang反射函数注册
package main import ( “fmt” “reflect” ) type Job interface { New([]interface{}) interface{} Run() (interface{}, error) } type DetEd struct { Name string Age int } // 为什么这样设计 // 这样就避免了 在创建新的实例的之后 结构体的方法中接受者为指针类型…...
【Spring】Bean
Spring 将管理对象称为 Bean。 Spring 可以看作是一个大型工厂,用于生产和管理 Spring 容器中的 Bean。如果要使用 Spring 生产和管理 Bean,那么就需要将 Bean 配置在 Spring 的配置文件中。Spring 框架支持 XML 和 Properties 两种格式的配置文件&#…...
深入解析TK技术下视频音频不同步的成因与解决方案
随着互联网和数字视频技术的飞速发展,音视频同步问题逐渐成为网络视频播放、直播、编辑等过程中不可忽视的技术难题。尤其是在采用TK(Transmission Keying)技术进行视频传输时,由于其特殊的时序同步要求,音视频不同步现…...
为什么要使用Ansible实现Linux管理自动化?
自动化和Linux系统管理 多年来,大多数系统管理和基础架构管理都依赖于通过图形或命令行用户界面执行的手动任务。系统管理员通常使用清单、其他文档或记忆的例程来执行标准任务。 这种方法容易出错。系统管理员很容易跳过某个步骤或在某个步骤上犯错误。验证这些步…...
Android:任意层级树形控件(有效果图和Demo示例)
先上效果图: 1.创建treeview文件夹 2.treeview -> adapter -> SimpleTreeAdapter.java import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.ListView; i…...
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
引言 C 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C 的开发者来说,了解这些容…...
C++---类型转换
文章目录 C的类型转换C的4种强制类型转换RTTI C的类型转换 类型转换 内置类型之间的转换 // a、内置类型之间 // 1、隐式类型转换 整形之间/整形和浮点数之间 // 2、显示类型的转换 指针和整形、指针之间 int main() {int i 1;// 隐式类型转换double d i;printf("%d…...
CSS基础学习练习题
编程题 1.为下面这段文字定义字体样式,要求字体类型指定多种、大小为14px、粗细为粗体、颜色为蓝色。 “有规划的人生叫蓝图,没规划的人生叫拼图。” 代码: <!DOCTYPE html> <html lang"en"> <head><me…...
TypeScript知识点总结和案例使用
TypeScript 是一种由微软开发的开源编程语言,它是 JavaScript 的超集,提供了静态类型检查和其他一些增强功能。以下是一些 TypeScript 的重要知识点总结: 1. 基本类型 TypeScript 支持多种基本数据类型,包括: numbe…...
解决BUG: Since 17.0, the “attrs“ and “states“ attributes are no longer used.
从Odoo 17.0开始,attrs和states属性不再使用,取而代之的是使用depends和domain属性来控制字段的可见性和其他行为。如果您想要在选择国家之后继续选择州,并且希望在选择了国家之后才显示州字段,您可以使用depends属性来实现这一点…...
单片机GPIO中断+定时器 实现模拟串口接收
单片机GPIO中断定时器 实现模拟串口接收 解决思路代码示例 解决思路 串口波特率9600bps,每个bit约为1000000us/9600104.16us; 定时器第一次定时时间设为52us即半个bit的时间,其目的是偏移半个bit时间,之后的每104us采样并读取1bit数据。使得…...
《深入理解 Spring MVC 工作流程》
一、Spring MVC 架构概述 Spring MVC 是一个基于 Java 的轻量级 Web 应用框架,它遵循了经典的 MVC(Model-View-Controller)设计模式,将请求、响应和业务逻辑分离,从而构建出灵活可维护的 Web 应用程序。 在 Spring MV…...
HTML简介
知识点一 HTML 什么是HTML? 超文本标记语言(HyperTextMarkup Language,简称HTML) 怎么学HTML? HTML 是一门标记语言,标记语言由一套标记标签组成,学习 HTML,其实就是学习标签 开发工具 编辑器: Pycha…...
Linux系统Centos设置开机默认root用户
目录 一. 教程 二. 部分第三方工具配置也无效 一. 教程 使用 Linux 安装Centos系统的小伙伴大概都知道,我们进入系统后,通常都是自己设置的普通用户身份,而不是 root 超级管理员用户,导致我们在操作文件夹时往往爆出没有权限&am…...
【网络安全 | 甲方建设】双/多因素认证、TOTP原理及实现
未经许可,不得转载。 文章目录 背景双因素、多因素认证双因素认证(2FA)多因素认证(MFA)TOTP实现TOTP生成流程TOTP算法TOTP代码示例(JS)Google Authenticator总结背景 在传统的在线银行系统中,用户通常只需输入用户名和密码就可以访问自己的账户。然而,如果密码不慎泄…...
Nuxt3 动态路由URL不更改的前提下参数更新,NuxtLink不刷新不跳转,生命周期无响应解决方案
Nuxt3 动态路由URL不更改的前提下参数更新,NuxtLink不刷新不跳转,生命周期无响应解决方案 首先说明一点,Nuxt3 的动态路由响应机制是根据 URL 是否更改,参数的更改并不会触发 Router 去更新页面,这在 Vue3 上同样存在…...
2024华为java面经
华为2024年Java招聘面试题目可能会涵盖Java基础知识、核心技术、框架与工具、项目经验以及算法与数据结构等多个方面。以下是考的内容。 一、Java基础知识 Java中有哪些基本数据类型? Java为什么能够跨平台运行? String是基本数据类型吗?能…...
2021 年 9 月青少年软编等考 C 语言三级真题解析
目录 T1. 课程冲突思路分析T2. 余数相同问题思路分析T3. 生成括号思路分析T4. 广义格雷码思路分析T5. 菲波那契数列思路分析T1. 课程冲突 小 A 修了 n n n 门课程,第 i i i 门课程是从第 a i a_i ai 天一直上到第 b i b_i bi 天。 定义两门课程的冲突程度为:有几天…...
深度解析FastDFS:构建高效分布式文件存储的实战指南(下)
接上篇:《深度解析FastDFS:构建高效分布式文件存储的实战指南(上)》 传送门: link 文章目录 六、常用命令七、FastDFS配置详解7.1 tracker配置文件7.2 tracker目录及文件结构7.3 storage配置文件7.4 storage服务器的目录结构和文件…...
12306网站多钱做的/北京网络营销公司排名
前端控制器(Font Controller) Java Web中的前端控制器是应用的门面,所有请求都需要经过这个前端控制器,由前端控制器根据请求的内容来决定如何处理并将处理的结果返回给浏览器。 Model1 Model1的中心是JSP页面,JSP页…...
采购平台网/青岛谷歌优化
效果图 2022年卡塔尔世界杯,全世界球迷翘首企盼,据悉,一共有67372名球迷入场观赛,为自己支持的球队鼓噪呐喊,释放蓄势积攒已久的激情。毕竟这一别,距离上届杯赛,已足四年!通过以上图…...
ui做的好的公司网站/关键词竞价排名是什么意思
Author:Harish_huqq.com 由于现在电脑上只有4.0的代码,考虑到代码差别也不大,所以下部分,就基于4.0来分析。 3:SensorManager 上一部分说过,开机后,system server启动时,就会初始化s…...
wordpress订阅会员/谷歌独立站
采用phpsmary来模拟dedecms后台?>"更新所有文档”的功能。特别说明,因为是在本机测试,只是为了能看到实现的功能,所以写得很简单。当然,本人也是菜鸟级php爱好者,欢迎大家批评指正。第一步:下载和…...
做网站应该选择怎样的公司/百度网盘客服
我是泽国华都:已入职一家电商公司做数据分析相关的工作,日常的工作内容是:(1)梳理来自产品经理、运营、财务等部门的数据需求,就分析维度达成共识再展开工作。(2)Excel和SQL是日常工…...
做网站订金是多少/简述网站推广的方法
4、新建Makefile.am新建Makefile.am文件,命令:$ vi Makefile.am 内容如下:AUTOMAKE_OPTIONSforeignbin_PROGRAMShelloworldhelloworld_SOURCEShelloworld.c automake会根据你写的Makefile.am来自动生成Makefile.in。Makefile.am中定义的宏和目标,会指导a…...