【04】构建一笔交易 发送SOL

  • 董承泽
  • 更新于 2024-04-19 10:55
  • 阅读 948

构建一笔交易 发送SOL

配套视频教程: Bilibili:https://www.bilibili.com/video/BV1Cz421r7Cd/?spm_id_from=333.788&vd_source=2979dcefbf505a6422797470b6fbbfad Youtube:https://www.youtube.com/watch?v=9H-NInDcuPA&list=PLMsVemdMJKNUSTsRpjQj7CTrm8O-luVxi&index=5 欢迎添加我的联系方式:Rico_Ruilabs

基础知识

一笔交易可以由很多步骤组成

A -> B ->C

链上交易是原子的:要么(所有步骤)都成功、要么(所有步骤)都失败,没有中间选项

代码

提前下载好 Node,创建工程目录,执行

npm init -y

初始化空的 package.json文件,添加 "type": "module",执行 npm i 命令,依次下载 "@solana/web3.js","bs58","dotenv" 这三个库

image.png

package.json 文件最终状态:

image.png

先 构建交易

再 创建一个发送SOL的事务,事务由三部分组成 发送者、接收者、调用数据

之后 将事务添加到交易

最后 将交易发送到 集群(区块链),该环节也是三部分组成 实例化的RPC、交易、签名者数组

solana中,最后发送交易时的签名者是一个签名者数组,即可以多个地址同时发出并行交易,本节示例只演示一个签名者的情况

// 依次引入三个库
import { Keypair, Connection, LAMPORTS_PER_SOL,PublicKey,Transaction ,SystemProgram,sendAndConfirmTransaction} from "@solana/web3.js"
import "dotenv/config"
import base58 from 'bs58'

// 读取 .env 文件中的私钥字符串
const userKeypair =  Keypair.fromSecretKey(base58.decode(process.env.SECRET_KEY))

// 连接到 Devnet
const devConnection = new Connection('https://devnet.helius-rpc.com/?api-key=9fc1bee2-a8b0-4ed5-93f6-a0dfc850013c')

// 我的地址
const add = userKeypair.publicKey.toBase58()
const userAdd = new PublicKey(add)

// 接收方地址
const toAdd = new PublicKey('8RJVj9JuLnhirYo2bpXJdWogLXuETD4JRi6KD7L1GFpC')

// 获取账户余额
let myBalance = await devConnection.getBalance(userAdd)
let toAddBalance = await devConnection.getBalance(toAdd)

// 转化成 SOL 数量
let balanceInSol = myBalance / LAMPORTS_PER_SOL
let toAddBalanceInSol = toAddBalance / LAMPORTS_PER_SOL

console.log(`发送方 ${userAdd} -- 余额 ${balanceInSol} SOL`)
console.log(`接收方 ${toAdd} -- 余额 ${toAddBalanceInSol} SOL`)

// 创建交易
const transaction = new Transaction()

const sendSolInstruction = SystemProgram.transfer({
  fromPubkey: userAdd,
  toPubkey:toAdd,
  lamports: 50000000, // 0.05 SOL
});

transaction.add(sendSolInstruction);

let signature = await sendAndConfirmTransaction(devConnection, transaction, [
    userKeypair,
]);

console.log(
  `成功发送`
)

// 获取账户余额,confirmed参数,表示获取的状态是已被确定的、更新后的
myBalance = await devConnection.getBalance(userAdd,'confirmed')
toAddBalance = await devConnection.getBalance(toAdd,'confirmed')

// 转化成 SOL 数量
balanceInSol = myBalance / LAMPORTS_PER_SOL
toAddBalanceInSol = toAddBalance / LAMPORTS_PER_SOL

console.log(`发送方 ${userAdd} -- 余额更新为 ${balanceInSol} SOL`)
console.log(`接收方 ${toAdd} -- 余额更新为 ${toAddBalanceInSol} SOL`)
  • 原创
  • 学分: 4
  • 分类: Solana
  • 标签:
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。
该文章收录于 Solana 极简入门
52 订阅 10 篇文章

0 条评论

请先 登录 后评论
董承泽
董承泽
0x513D...fEC0
VX:ruichao_web3 bilibili :https://space.bilibili.com/434418210 youtube :https://www.youtube.com/channel/UCbVSj4aA2TAR9cUZuSoql5A