先决条件
您需要两个测试网钱包来创建代币。请在 Pi 钱包中创建它们,并在 Pi 测试网上激活它们。您可以从钱包的设置页面访问钱包的私钥。
令牌是如何创建的
在 Pi 区块链上,如果钱包想要处理某个代币,必须先通过“建立信任线”来信任该代币。这可以保护钱包免受来自未知发送者的未经授权的代币的侵害。当特定代币的信任线首次建立时,该代币就会被写入链上。您将在下面的示例中详细了解其工作原理。
步骤
假设我们要创建“TestToken”。在本文档中,我们将把先决条件中的两个钱包分别称为“发行者”和“分发者”。
1.从“分发者”钱包建立一条指向“TestToken”的信任线。由于这是首次为“TestToken”建立信任线,因此该代币现在已被链上识别。但是,由于该代币尚未铸造,因此其总供应量尚不存在。
2.现在,您可以通过“发行方”钱包使用“支付”操作向“分发方”钱包发送一定数量的代币,这本质上就是“铸造”代币。正如我们在上一节中了解到的,钱包需要信任线才能处理特定的代币。当注册新代币时,第一个建立信任线的钱包自然而然地成为分发方钱包,因为它是唯一可以持有该代币的钱包,直到其他钱包也建立起对该代币的信任线为止。
代币铸造 - 代码示例
以下是一个 NodeJS 代码片段,展示了上述步骤。这是一个非常简单的示例,仅展示了流程的概要,您的生产代码应该负责错误处理。请注意,您需要将 Stellar SDK 作为依赖项。
const StellarSDK = require("@stellar/stellar-sdk");
const server = new StellarSDK.Horizon.Server("https://api.testnet.minepi.com");
const NETWORK_PASSPHRASE = "Pi Testnet";
// prepare keypairs
const issuerKeypair = StellarSDK.Keypair.fromSecret(""); // use actual secret key here
const distributorKeypair = StellarSDK.Keypair.fromSecret(""); // use actual secret key here
// define a token
// token code should be alphanumeric and up to 12 characters, case sensitive
const customToken = new StellarSDK.Asset("TestToken", issuerKeypair.publicKey());
const distributorAccount = await server.loadAccount(distributorKeypair.publicKey());
// look up base fee
const response = await server.ledgers().order("desc").limit(1).call();
const latestBlock = response.records[0];
const baseFee = latestBlock.base_fee_in_stroops;
// prepare a transaction that establishes trustline
const trustlineTransaction = new StellarSDK.TransactionBuilder(distributorAccount, {
fee: baseFee,
networkPassphrase: NETWORK_PASSPHRASE,
timebounds: await server.fetchTimebounds(90),
})
.addOperation(StellarSDK.Operation.changeTrust({ asset: customToken, limit: undefined }))
.build();
trustlineTransaction.sign(distributorKeypair);
// submit a tx
await server.submitTransaction(trustlineTransaction);
console.log("Trustline created successfully");
//====================================================================================
// now mint TestToken by sending from issuer account to distributor account
const issuerAccount = await server.loadAccount(issuerKeypair.publicKey());
const paymentTransaction = new StellarSDK.TransactionBuilder(issuerAccount, {
fee: baseFee,
networkPassphrase: NETWORK_PASSPHRASE,
timebounds: await server.fetchTimebounds(90),
})
.addOperation(
StellarSDK.Operation.payment({
destination: distributorKeypair.publicKey(),
asset: customToken,
amount: "100000", // amount to mint
})
)
.build();
paymentTransaction.sign(issuerKeypair);
// submit a tx
await server.submitTransaction(paymentTransaction);
console.log("Token issued successfully");
// checking new balance of the distributor account
const updatedDistributorAccount = await server.loadAccount(distributorKeypair.publicKey());
updatedDistributorAccount.balances.forEach((balance) => {
if (balance.asset_type === "native") {
console.log(`Test-Pi Balance: ${balance.balance}`);
} else {
console.log(`${balance.asset_code} Balance: ${balance.balance}`);
}
});如何在 Pi Wallet 上列出
虽然代币已在 Pi 测试网上铸造,但只有在 Pi 服务器识别后才会显示在 Pi 钱包中。要将其添加到 Pi 钱包,您需要将您的主域名关联到您的发行方账户,您可以使用“setOptions”操作进行设置。
在设置“主域名”之前,如果您检查您的令牌"https://api.testnet.minepi.com/assets?asset_code=<YOUR_TOKEN_CODE>&asset_issuer=<YOUR_TOKEN_ISSUER>",您会注意到“toml”部分下的“href”为空。
...
"_links": {
"toml": {
"href": ""
}
}
...现在您可以参考下面的示例,将主域名设置为颁发者帐户。
设置主域名 - 代码示例
每次交易时,都需要加载账户以使用账户的最新序列号,这一点非常重要。
const issuerAccount = await server.loadAccount(issuerKeypair.publicKey());
const setOptionsTransaction = new StellarSDK.TransactionBuilder(issuerAccount, {
fee: baseFee,
networkPassphrase: NETWORK_PASSPHRASE,
timebounds: await server.fetchTimebounds(90),
})
.addOperation(StellarSDK.Operation.setOptions({ homeDomain: "example.com" })) // replace with your actual domain
.build();
setOptionsTransaction.sign(issuerKeypair);
await server.submitTransaction(setOptionsTransaction);
console.log("Home Domain is set successfully.");设置“主页域名”后,如果您再次查看同一页面,您会注意到它现在显示您的主页域名,如下所示。
...
"_links": {
"toml": {
"href": "https://<YOUR_DOMAIN>/.well-known/pi.toml"
}
}
...除了上述内容外,"home_domain"您的发卡机构帐户页面上还会出现一个新字段("https://api.testnet.minepi.com/accounts/<ISSUER_ACCOUNT_PUBLIC_KEY>")。
正如您可能预料到的,您需要pi.toml在指定位置托管一个文件https://<YOUR_DOMAIN>/.well-known/pi.toml。该文件包含您的令牌的一些元数据,用于证明该令牌与该域名关联。请确保此文件可公开访问,并以纯文本形式托管在您的服务器上(content-type: text/plain)。
pi.toml 的内容
有几个与令牌相关的必填字段需要供 Pi 服务器验证。以下是一个示例。由于这是一个表示所有元数据的文本文件,您可以添加其他字段。
如果一个发行方发行多个代币,则每个代币都应该有自己的[[CURRENCIES]]部分。
[[CURRENCIES]] code="TestToken" issuer="GCNCQ6RRVEERQXWGKB3XMRK6VGJRIHGT5UTDAAU6QEU5NL2AHFOJDYLC" name="Pi Core Team" desc="This is a test token that is created as an example and has no value." image="https://image-of-your-token.com/image.png"
这些是必须核实的必填字段。
代码:令牌的代码
发行者:代币发行者的公钥
名称:代币发行者的名称
desc:令牌的简单描述
图片:包含令牌图标的图片。
重要提示:
设置好主域名并完成有效pi.toml文件的托管后,经 Pi 服务器扫描,您的代币将开始出现在 Pi 钱包中。Pi 区块链上的代币会定期进行扫描,如果验证因某些原因失败(例如缺少字段或图像无法访问),之前上架的代币可能会从 Pi 钱包中移除。强烈建议您正确缓存您的文件pi.toml。image
您的pi.toml文件image必须可通过访问https,否则验证将失败。
代币分发
代币分发方式有多种,但这里我们将介绍两种简单的方法。请注意,接收者必须将您的代币添加到 Pi 钱包中。当您的代币出现在 Pi 钱包中时,用户可以在 Pi 钱包用户界面中选择您的代币并启用(即创建信任线)。
1.直接支付流
假设接收方已为您的代币创建了信任线,您可以像在代币铸造 - 代码示例部分中从发行方账户到分销商账户那样,使用分销商账户的“支付”操作。
2.创建流动性池
由于用户可以通过水龙头访问 Test-Pi,另一种方法是创建一个流动性池 (LP),让用户直接从池中获取一些您的代币。
a. 在 Pi 钱包中,前往“代币”页面,然后点击“流动性池”图标。选择“我的池”选项卡,在底部您会看到可以创建新的流动性池。选择“Test-Pi”以及您想要的代币和数量。创建完成后,该池将显示在“全部”选项卡下。
b. 作为用户,假设我已经将您的代币添加到我的钱包,我可以前往“代币”页面,然后点击“兑换”图标。该From代币名为“Test-Pi”,也To就是您的代币。选择代币后,我可以输入想要兑换的数量。输入数量后From,相应的To金额会自动填充。然后我就可以进行兑换,并获得您的代币了。
其他资源
如果您想了解更多高级功能,请查看以下页面。强烈建议您点击最后一个链接,配置最大发行量并锁定发行账户。
精彩的文档
Stellar JS SDK 文档
代币最佳实践
Pi 打赏
微信打赏