Token-2022 是 Solana 引入的升级 token 标准,旨在扩展 SPL token 的功能。它建立在 SPL 标准的基础上,通过添加高级功能来解决更复杂的使用场景。Token-2022 标准与 SPL Token 标准兼容,确保现有 token 可以在不中断的情况下采用这些新功能。
广泛的审计确保这些扩展是安全可靠的,为强大的企业解决方案铺平了道路。Token-2022 在原始 token 标准之上引入了几个新特性和改进。这些增强旨在为 token 创建者和用户提供更大的灵活性和功能。
技术
Token-2022 使用与 SPL 相同的底层区块链基础设施,但引入了新的智能合约功能来支持其高级特性。
与 Solana 的高性能区块链集成可确保 Token-2022 token 享有与 SPL token 相同的可扩展性和效率。
Token-2022 程序向 Solana 引入了 Token Extensions。
Token Extensions 的类型
有两种值得注意的 Token Extensions 类型:
-
铸币 — 除了原始 SPL 程序之外实现。它们扩展了 token 的能力。流行的例子包括机密转账、转账费用、计息 Token、不可转账 Token 和转账Hook。
-
帐户 — 添加到 Solana 帐户以改进与帐户相关的功能。值得注意的例子是交易备忘录和不可变的拥有者。
现在让我们看一下 Solana 上可用的两类 Token Extensions 的各种类型,我们将了解它们的功能、如何部署它们以及它们的用例。
铸币 Extensions
1. 机密转账
交易的透明性质是任何区块链的基本特性。它增强了用户对链的信任。增强安全性,并创建一个透明的数据存储。但是,有时需要隐私。机密转账允许在不披露转账金额的情况下进行交易。虽然转账的 token 以及发送者和接收者地址仍然对公众可见。交易金额只有发起人、接收者和一个可选的第三方审计员才能访问。此功能依赖于强大的密码协议。
初始化机密 Token
solana-confidential create-token
## Initialize a new confidential token
CONF_TOKEN_MINT=$(solana-confidential create-token | grep -oP '(?<=Creating token ).*')
echo "Confidential Token Mint Address: $CONF_TOKEN_MINT"
生成机密密钥
solana-confidential generate-keypair
创建机密帐户
solana-confidential create-account <CONF_TOKEN_MINT> <CONFIDENTIAL_KEYPAIR>
铸造机密 Token
solana-confidential mint <CONF_TOKEN_MINT> <AMOUNT> <RECIPIENT_CONF_ACCOUNT>
转账机密 Token
solana-confidential transfer <CONF_TOKEN_MINT> <AMOUNT> <SENDER_CONF_ACCOUNT> <RECIPIENT_CONF_ACCOUNT>
验证机密转账
solana-confidential account-info <CONF_TOKEN_MINT> <CONF_ACCOUNT>
这是一个完整的示例工作流程,用于设置、铸造、转账和验证机密 token。
## Initialize a new confidential token
CONF_TOKEN_MINT=$(solana-confidential create-token | grep -oP '(?<=Creating token ).*')
echo"Confidential Token Mint Address: $CONF_TOKEN_MINT"
## Generate confidential keys for users
USER1_CONF_KEYPAIR=$(solana-confidential generate-keypair)
USER2_CONF_KEYPAIR=$(solana-confidential generate-keypair)
echo"User 1 Confidential Keypair: $USER1_CONF_KEYPAIR"
echo"User 2 Confidential Keypair: $USER2_CONF_KEYPAIR"
## Create confidential accounts for User 1 and User 2
USER1_CONF_ACCOUNT=$(solana-confidential create-account $CONF_TOKEN_MINT$USER1_CONF_KEYPAIR | grep -oP '(?<=Creating account ).*')
USER2_CONF_ACCOUNT=$(solana-confidential create-account $CONF_TOKEN_MINT$USER2_CONF_KEYPAIR | grep -oP '(?<=Creating account ).*')
echo"User 1 Confidential Account: $USER1_CONF_ACCOUNT"
echo"User 2 Confidential Account: $USER2_CONF_ACCOUNT"
## Mint 1000 confidential tokens to User 1
solana-confidential mint $CONF_TOKEN_MINT 1000 $USER1_CONF_ACCOUNT
## Transfer 100 confidential tokens from User 1 to User 2
solana-confidential transfer $CONF_TOKEN_MINT 100 $USER1_CONF_ACCOUNT$USER2_CONF_ACCOUNT
## Verify User 1 and User 2's confidential token balances
solana-confidential account-info $CONF_TOKEN_MINT$USER1_CONF_ACCOUNT
solana-confidential account-info $CONF_TOKEN_MINT$USER2_CONF_ACCOUNT
用例:
工资单和商家付款:一家以 USDC 支付员工工资的公司可能希望对其员工的工资保密。
机构融资和私人融资/投资:一家贸易公司可能希望对其 OTC 交易的细节保密,以保持竞争优势。
一些已经利用这些特性的著名项目包括 Paxos 的 USDP 等稳定币和 GMO Trust 的受监管稳定币。
2. 转账Hook
转账Hook可以在 Solana 上的所有协议中强制执行,而不仅仅是一个协议。转账Hook扩展在转账 token 时调用一段自定义逻辑。想要只允许列入白名单的地址持有和转账 token 的 Token 发行者。他们可以简单地维护一个列入白名单的地址列表,并在允许转账 token 之前验证地址是否已列入白名单。在 token 级别实现此自定义逻辑消除了复杂代理层的需求,否则所有利益相关者(如钱包和 DEX/市场)都必须实现这些代理层。
通过转账Hook,所有钱包和市场都固有地提供支持。转账Hook允许开发人员在转账结算之前调用程序定义的逻辑。实现非常简单,因为开发人员只需开发和部署一个实现所需接口并执行其业务逻辑的程序。然后,开发人员配置其 token 铸币以使用新程序。
使用 Rust 创建一个新的 Solana 程序。
## Create a new directory for the project
mkdir solana-transfer-hook
cd solana-transfer-hook
## Initialize a new Rust project
cargo new --lib transfer_hook
cd transfer_hook
编辑 Cargo.toml 以包含 Solana 依赖项。
[package]
name = "transfer_hook"
version = "0.1.0"
edition = "2018"
[dependencies]
solana-program = "1.9.9"
在 src/lib.rs 中创建程序逻辑。
use solana_program::{
account_info::{next_account_info, AccountInfo},
entrypoint,
entrypoint::ProgramResult,
msg,
pubkey::Pubkey,
};
entrypoint!(process_instruction);
pub fn process_instruction(
program_id: &Pubkey,
accounts: &[AccountInfo],
_instruction_data: &[u8],
) -> ProgramResult {
let accounts_iter = &mut accounts.iter();
let from_account = next_account_info(accounts_iter)?;
let to_account = next_account_info(accounts_iter)?;
let amount = next_account_info(accounts_iter)?;
let authority_account = next_account_info(accounts_iter)?;
msg!("Transfer Hook: From {}, To {}, Amount: {}", from_account.key, to_account.key, amount.key);
// Add custom logic here, e.g., logging, restricting transfers, etc.
if from_account.owner != authority_account.key {
msg!("Transfer not authorized by the account owner.");
return Err(solana_program::program_error::ProgramError::IllegalOwner);
}
// If you want to implement a fee, you could adjust the amount here
// For example, reduce the amount by 1% as a fee:
// let fee = amount / 100;
// let net_amount = amount - fee;
Ok(())
}
部署程序
## Build the program
cargo build-bpf
## Deploy the program (replace with your actual keypair and cluster URL)
solana program deploy /path/to/your/program/target/deploy/transfer_hook.so
要在 token 转账期间调用转账Hook,你需要在 token 转账交易中调用自定义程序。
use solana_program::{
instruction::{AccountMeta, Instruction},
pubkey::Pubkey,
sysvar::{rent::Rent, Sysvar},
};
use solana_sdk::signature::Signer;
pub fn create_transfer_with_hook_instruction(
program_id: &Pubkey,
token_program_id: &Pubkey,
from_pubkey: &Pubkey,
to_pubkey: &Pubkey,
authority_pubkey: &Pubkey,
amount: u64,
) -> Instruction {
let accounts = vec![\
AccountMeta::new(*from_pubkey, false),\
AccountMeta::new(*to_pubkey, false),\
AccountMeta::new_readonly(*authority_pubkey, true),\
AccountMeta::new_readonly(solana_program::system_program::id(), false),\
];
let data = amount.to_le_bytes();
Instruction {
program_id: *program_id,
accounts,
data: data.to_vec(),
}
}
以下是如何将转账Hook集成到客户端应用程序中。
use solana_client::rpc_client::RpcClient;
use solana_sdk::{
signature::{Keypair, Signer},
transaction::Transaction,
};
fn main() {
let client = RpcClient::new("https://api.devnet.solana.com");
let from_keypair = Keypair::from_base58_string("...");
let to_pubkey = Pubkey::from_str("...").unwrap();
let authority_pubkey = Pubkey::from_str("...").unwrap();
let program_id = Pubkey::from_str("...").unwrap();
let token_program_id = Pubkey::from_str("...").unwrap();
let transfer_instruction = create_transfer_with_hook_instruction(
&program_id,
&token_program_id,
&from_keypair.pubkey(),
&to_pubkey,
&authority_pubkey,
100,
);
let mut transaction = Transaction::new_with_payer(
&[transfer_instruction],
Some(&from_keypair.pubkey()),
);
let recent_blockhash = client.get_recent_blockhash().unwrap().0;
transaction.sign(&[&from_keypair], recent_blockhash);
let signature = client.send_and_confirm_transaction(&transaction).unwrap();
println!("Transaction signature: {}", signature);
}
为了确保你的转账Hook按预期工作,你应该编写测试并将其部署到像 Solana 的 Devnet 这样的测试网络。
## Run tests locally
cargo test
## Deploy and test on Devnet
solana program deploy /path/to/your/program/target/deploy/transfer_hook.so --url https://api.devnet.solana.com
❝本公众号发布的内容除特别标明外版权归原作者所有。若涉及版权问题,请联系我们。所有信息及评论区内容仅供参考,请读者自行判断信息真伪,不构成任何投资建议。据此产生的任何损失,本公众号概不负责,亦不负任何法律责任。

