官方英文文档:https://solana.com/zh/docs/intro/quick-start/writing-to-network
1.在账户之间转移 SOL
从账户之间转移 SOL 的简单示例开始。转移 SOL,您需要调用 System Program 的 转移 指令。
Solana 账户模型的一个关键概念要求只有拥有 账户可以扣除账户的 lamport (SOL) 余额。这意味着如果你愿意 要从钱包账户转移 SOL,您必须调用系统程序,因为 它显示为 Program owner (程序所有者) 在 所有者 字段。
点击此链接可在 Solana Playground 中打开示例。您将看到以下代码:
import {
LAMPORTS_PER_SOL,
SystemProgram,
Transaction,
sendAndConfirmTransaction,
Keypair,
} from "@solana/web3.js";
//将您的 Playground 钱包设置为发送者
const sender = pg.wallet.keypair;
//创建一个新的密钥对作为接收方
const receiver = new Keypair();
//构建转账指令以转账 0.01 SOL
const transferInstruction = SystemProgram.transfer({
fromPubkey: sender.publicKey,
toPubkey: receiver.publicKey,
lamports: 0.01 * LAMPORTS_PER_SOL,
});
//构建一个包含转账指令的交易
const transaction = new Transaction().add(transferInstruction);
//发送并确认交易
const transactionSignature = await sendAndConfirmTransaction(
pg.connection,
transaction,
[sender],
);
//在 Playground 终端中打印出指向 SolanaFM 资源管理器的链接以查看交易详情
console.log(
"Transaction Signature:",
`https://solana.fm/tx/${transactionSignature}?cluster=devnet-solana`,
);
Running client...
client.ts:
Transaction Signature: https://solana.fm/tx/he9dBwrEPhrfrx2BaX4cUmUbY22DEyqZ837zrGrFRnYEBmKhCb5SvoaUeRKSeLFXiGxC8hFY5eDbHqSJ7NYYo42?cluster=devnet-solana
点击输出链接,在 SolanaFM 浏览器上查看交易详情。
2.创建新令牌Token
使用系统程序创建新帐户;使用令牌扩展程序将帐户的数据初始化为 Mint
(首先一些解释一下模糊的概念:)
Mint是什么意思?
答:在Solana开发中,“Mint”通常指的是创建新的代币或NFT(非同质化代币)的过程。具体来说,Minting是指在区块链上生成新的代币,并将其分配给特定的地址。
点击此链接可在 Solana Playground 中打开示例。您将看到以下代码:
import {
Connection,
Keypair,
SystemProgram,
Transaction,
clusterApiUrl,
sendAndConfirmTransaction,
} from "@solana/web3.js";
import {
MINT_SIZE,
TOKEN_2022_PROGRAM_ID,
createInitializeMint2Instruction,
getMinimumBalanceForRentExemptMint,
} from "@solana/spl-token";
//获取您的 Playground 钱包并创建与 Solana 开发网的连接
const wallet = pg.wallet;
const connection = new Connection(clusterApiUrl("devnet"), "confirmed");
//生成一个新的密钥对,用作 Mint 账户的地址
// Generate keypair to use as address of mint account
const mint = new Keypair();
//计算 Mint 账户所需的 lamports
// Calculate lamports for space required by mint account
const rentLamports = await getMinimumBalanceForRentExemptMint(connection);
//构建一个 System Program 指令以创建新帐户。
// Instruction to create new account with space for new mint account
const createAccountInstruction = SystemProgram.createAccount({
fromPubkey: wallet.publicKey,
newAccountPubkey: mint.publicKey, //从钱包转账 lamports 为新账户注资
space: MINT_SIZE, //分配存储 mint 数据所需的空间
lamports: rentLamports,
programId: TOKEN_2022_PROGRAM_ID, //将帐户的所有权分配给令牌扩展程序 (TOKEN_2022_PROGRAM_ID)
});
//构造一个 Token Extensions Program 指令来初始化 Mint 账户数据
// Instruction to initialize mint account
const initializeMintInstruction = createInitializeMint2Instruction(
mint.publicKey,
2, // decimals
wallet.publicKey, // mint authority
wallet.publicKey, // freeze authority
TOKEN_2022_PROGRAM_ID
);
//将两个指令添加到单个事务中
// Build transaction with instructions to create new account and initialize mint account
const transaction = new Transaction().add(
createAccountInstruction,
initializeMintInstruction
);
//发送并确认交易,并要求两个签名者 :
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[
wallet.keypair, // payer //用于支付账户创建和交易费用的钱包密钥对
mint, // mint address keypair //mint 密钥对,用于使用其公钥作为账户地址创建新账户
]
);
//打印出链接以查看 SolanaFM 上的交易和铸造账户详细信息
console.log(
"\nTransaction Signature:",
`https://solana.fm/tx/${transactionSignature}?cluster=devnet-solana`
);
console.log(
"\nMint Account:",
`https://solana.fm/address/${mint.publicKey}?cluster=devnet-solana`
);
Running client...
client.ts:
Transaction Signature: https://solana.fm/tx/3BEjFxqyGwHXWSrEBnc7vTSaXUGDJFY1Zr6L9iwLrjH8KBZdJSucoMrFUEJgWrWVRYzrFvbjX8TmxKUV88oKr86g?cluster=devnet-solana
Mint Account: https://solana.fm/address/CoZ3Nz488rmATDhy1hPk5fvwSZaipCngvf8rYBYVc4jN?cluster=devnet-solana
(经过上面一通操作,已经完成了创建新令牌token,但怎么用,是否可以随意发币设置数量等 还需要后面进一步学习!)