Solana中原生代币的交互即为对Solana的代币Sol代币的代币进行交易,实际上就是对于Sol代币进行查看,转账这两个操作。JS交互以下为通过JS代码,查看某个特定账户的余额和从某个账户(持有该账户的私钥)向另一个账户(只需要直到公钥地址)进行转账。//导入相关模块constw
Solana
中原生代币的交互即为对Solana
的代币Sol
代币的代币进行交易,实际上就是对于Sol
代币进行查看,转账这两个操作。
以下为通过 JS 代码,查看某个特定账户的余额和从某个账户(持有该账户的私钥)向另一个账户(只需要直到公钥地址)进行转账。
// 导入相关模块
const web3 = require("@solana/web3.js");
// 添加一个与 Solana 的连接
// 这里采用的是库中内置的开发者网的节点地址 web3.clusterApiUrl('devnet')
const connection = new web3.Connection(web3.clusterApiUrl("devnet"), "confirmed");
function localwalletkey(keypairFile) {
// 使用 fs(file system)模块,访问本地文件系统
const fs = require("fs");
// 生成一个私钥钱包对象
const loaded = web3.Keypair.fromSecretKey(
new Uint8Array(JSON.parse(fs.readFileSync(keypairFile).toString()))
);
// 返回这个私钥钱包对象
return loaded;
}
// 采用异步的方法查看账户余额
async function catBalance() {
// 当已知为一个公钥地址时
// mypublickey = new web3.PublicKey("$public_key_addr")
// 当已知为自己的私钥地址(存在一个文件保存私钥)时
const pairkey = localwalletkey("$key_path");
// 获得私钥对应的公钥地址
const mypublickey = pairkey.publicKey;
const balance = await connection.getBalance(mypublickey);
console.log("账户余额为:", balance);
}
// 采用异步的方法执行转账
async function transfersol() {
// 转账者,发送 sol 代币
// const pairkey = localwalletkey("$key_path");
const sender = localwalletkey("wallet-keypair.json");
// 接收者,接收 sol 代币
const recipient = new web3.PublicKey("$another_publikey");
// 生成一个调用系统转账程序的指令(可以看作一笔交易)
let tx = web3.SystemProgram.transfer({
// 转出 sol 的公钥地址
fromPubkey: sender.publicKey,
// 接收 sol 的公钥地址
toPubkey: recipient,
// 转账的 sol 额度(以 lamports 为单位,这个是 sol 最小单位)
lamports: web3.LAMPORTS_PER_SOL / 100,
});
// 将指令放入交易(相当于指令集,可以包含多个指令)中
let transcation = new web3.Transaction().add(tx);
// 对交易签名并发送,交易费用由 [sender] 支付
let signature = await web3.sendAndConfirmTransaction(connection, transcation, [sender]);
console.log("交易签名:", signature);
}
async function main() {
await catBalance();
await transfersol();
await catBalance();
}
main();
通过python
的seahorse
框架进行转账(假设该程序需要对用户收取sol
)
# 导入 seahorse 的库
# 使用 seahorse 需要使用标准的命名法
from seahorse.prelude import *
# 在编译后自然会产生,然后替换掉里面的字符串
declare_id ('11111111111111111111111111111111')
# 类的命名需要驼峰命名法(单词首字母大写,如:FizzBuzz)
# 程序拥有的 PDA 账户,用于存储从用户那里收取到的 sol 代币
class Pda(Account):
# 存储将来取出 PDA 存储的 sol 的用户地址
owner: Pubkey
# 方法使用蛇形命名法(单词全部小写,使用_连接各个单词)
# 每个方法都要使用 @instruction 修饰
# 初始化生成一个程序控制的 PDA 账户
@instruction
def init_program_pda(owner:Signer, pad:Empty[Pda]):
# 通过自定义的 seed 和程序 id 生成一个只能由该程序控制的 PDA 账户
# 该账户中的数据结构由前面的类决定
# 生成账户的费用由 payer(即 owner)出
pda = pda.init(payer=owner,seed=['pda'])
pda.owner = owner.key()
@instruction
def transfer_sol(Sender:Signer,pda:Pda,amount:u64):{
# Sender 扣除指定数量的 sol (以 lamport 为单位,1 sol = 10^9 lamport)给到 pda 中
Sender.transfer_lamports(pda,amount)
}
@instruction
def withdrawals(recipter:Signer,pda:Pda,amount:u64):
# 要求指定用户才能取出
assert recipter.key() == pda.owner,"Caller is not the current admin"
pda.transfer_lamports(recipter,amount)
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!