如何在 Pi 测试网上创建代币?

先决条件

您需要两个测试网钱包来创建代币。请在 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 打赏 微信打赏