跳到主要内容

质押通证和资产

质押是将通证或资产 (NFT) 锁定给特定接收者的过程,通常是为了保障网络安全、参与治理或赚取奖励。本指南使用 OCAP Client 详细介绍了整个质押生命周期的分步操作,包括创建质押、撤销质押、领回资产以及因惩罚性原因罚没质押。

此过程涉及几个关键方法:

  • stake():创建一个新的质押。
  • revokeStake():启动取回已质押物品的过程。
  • claimStake():完成取回操作,将物品返还至您的账户。
  • slashStake():允许授权方惩罚质押者。

如何质押

首先,您使用 stake 方法来锁定您的通证或资产。此操作会在链上创建一个新的、唯一的质押地址,该地址持有您质押的物品及管理这些物品的规则。

参数

  • to string (required) — 接收质押的账户的 DID 地址。
  • assets string[] — 要质押的资产地址 (NFT) 数组。
  • tokens object[] — 要质押的通证对象数组。
    • address string (required) — 通证合约的地址。
    • value number (required) — 要质押的通证数量。
  • wallet WalletObject (required) — 质押者的钱包对象。
  • locked boolean (default: false) — 指示质押在创建时是否锁定的布尔值。
  • slashers string[] — 允许罚没此质押的 DID 地址数组。如果未提供,则默认为接收者的地址。
  • message string — 质押的可选备注或消息。
  • nonce string — 确保质押地址唯一的可选 nonce。

示例

Staking Tokens and an Asset

javascript
// 假设 'client' 是一个已初始化的 GraphQLClient 实例
// 且 'stakerWallet' 是一个有效的钱包对象。
const receiverAddress = 'z29d5852576b8a8b6f3a8b4b74a3f4a3e2e1d'; // 质押接收者的地址

async function createStake() {
  try {
    const [txHash, stakeAddress] = await client.stake({
      to: receiverAddress,
      tokens: [{
        address: 'z35n6aTUTK8h5nAF43h21A1g84g3C3D7B5E', // 要质押的通证地址
        value: 100, // 要质押的通证数量
      }],
      assets: ['zNKtA1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6'], // 要质押的资产/NFT 地址
      message: 'Staking for validator rewards',
      wallet: stakerWallet,
    });

    console.log('Stake transaction sent:', txHash);
    console.log('New stake address created:', stakeAddress);
    return stakeAddress;
  } catch (error) {
    console.error('Error creating stake:', error);
  }
}

返回值

stake 方法返回一个包含交易哈希和新创建的 stakeAddress 的元组。此地址对于未来与此特定质押的所有交互(如撤销或罚没)至关重要。

如何撤销质押

撤销质押是由质押者发起的、用以取回其锁定的通证和资产的过程。此交易不会立即返还资金;相反,它会将资金标记为可供领回,但需遵守链上任何锁定期规定。

参数

  • from string (required) — 要撤销的质押地址(从 'stake' 调用中获取)。
  • assets string[] — 要从质押中撤销的资产地址数组。
  • tokens object[] — 要撤销的通证对象数组。
    • address string (required) — 通证合约的地址。
    • value number (required) — 要撤销的通证数量。
  • wallet WalletObject (required) — 质押者的钱包对象,必须是质押的原始创建者。

示例

Revoking a Stake

javascript
// 假设 'stakeAddress' 是上一步返回的地址
// 且 'stakerWallet' 是用于创建质押的同一个钱包。

async function revokeExistingStake(stakeAddress) {
  try {
    const revokeTxHash = await client.revokeStake({
      from: stakeAddress,
      tokens: [{
        address: 'z35n6aTUTK8h5nAF43h21A1g84g3C3D7B5E',
        value: 100,
      }],
      assets: ['zNKtA1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6'],
      wallet: stakerWallet,
    });

    console.log('Revoke stake transaction sent:', revokeTxHash);
    console.log('IMPORTANT: Save this hash to claim your stake later.');
    return revokeTxHash;
  } catch (error) {
    console.error('Error revoking stake:', error);
  }
}

返回值

此函数返回撤销操作的交易哈希。该哈希作为凭证,并且是领回质押的最后一步所必需的。

如何领回已撤销的质押

质押成功撤销后,质押者必须发送一个 claimStake 交易,才能将通证和资产移回其账户。这标志着取回过程的最终完成。

参数

  • from string (required) — 质押的地址。
  • evidence string (required) — 来自 'revokeStake' 调用的交易哈希,作为撤销的凭证。
  • wallet WalletObject (required) — 质押者的钱包对象。

示例

Claiming Staked Items

javascript
// 假设 'stakeAddress' 和 'revokeTxHash' 来自前面的步骤,
// 且 'stakerWallet' 是质押者的钱包。

async function claimRevokedStake(stakeAddress, revokeTxHash) {
  try {
    const claimTxHash = await client.claimStake({
      from: stakeAddress,
      evidence: revokeTxHash,
      wallet: stakerWallet,
    });

    console.log('Claim stake transaction sent:', claimTxHash);
    console.log('Your tokens and assets have been returned to your account.');
  } catch (error) {
    console.error('Error claiming stake:', error);
  }
}

返回值

该方法返回最终的交易哈希。一旦此交易在链上确认,质押的物品将返还至 wallet 的地址。

如何罚没质押

罚没是一种惩罚性操作,可由指定的 slasher(通常是质押接收者)对质押者执行。这种情况通常发生在质押者违反某些规则时。被罚没的通证或资产将从质押中移除,并发送至指定的保险库。

参数

  • from string (required) — 要罚没的质押地址。
  • reason string (required) — 解释罚没原因的强制性消息。
  • assets string[] — 要从质押中罚没的资产地址数组。
  • tokens object[] — 要罚没的通证对象数组。
    • address string (required) — 通证合约的地址。
    • value number (required) — 要罚没的通证数量。
  • wallet WalletObject (required) — 经授权的罚没者的钱包对象。

示例

Slashing a Stake

javascript
// 假设 'stakeAddress' 是要罚没的质押地址,
// 且 'slasherWallet' 是经授权的罚没者的钱包。

async function slashExistingStake(stakeAddress) {
  try {
    const slashTxHash = await client.slashStake({
      from: stakeAddress,
      reason: 'Validator missed signing 10 consecutive blocks.',
      tokens: [{
        address: 'z35n6aTUTK8h5nAF43h21A1g84g3C3D7B5E',
        value: 10, // 罚没 10 个通证作为惩罚
      }],
      wallet: slasherWallet,
    });

    console.log('Slash stake transaction sent:', slashTxHash);
  } catch (error) {
    console.error('Error slashing stake:', error);
  }
}

返回值

此方法返回罚没操作的交易哈希。

总结

现在您已经了解了在 OCAP 区块链上进行质押的完整生命周期:使用 stake 创建质押,使用 revokeStakeclaimStake 取回资金,以及使用 slashStake 惩罚恶意行为者。这一强大的机制是许多去中心化应用的基础。

要了解更多关于可以质押的物品的信息,请参阅管理通证管理资产 (NFT)指南。