# トークンとアセットのステーク

ステーキングとは、特定の受取人に対してトークンやアセット（NFT）をロックアップするプロセスであり、多くの場合、ネットワークのセキュリティを確保したり、ガバナンスに参加したり、報酬を得るために行われます。このガイドでは、OCAP Client を使用したステーキングのライフサイクル全体を段階的に説明します。これには、ステークの作成、その取り消し、アセットの請求、懲罰的な理由によるステークのスラッシュが含まれます。

このプロセスには、いくつかの主要なメソッドが関わります：

* `stake()`: 新しいステークを作成します。
* `revokeStake()`: ステークされたアイテムを引き出すプロセスを開始します。
* `claimStake()`: 引き出しを完了し、アイテムをアカウントに戻します。
* `slashStake()`: 権限を持つ者がステーカーにペナルティを課すことを許可します。


## ステーク方法

まず、`stake` メソッドを使用してトークンやアセットをロックします。このアクションにより、ステークされたアイテムとそのルールを保持する、チェーン上で一意の新しいステークアドレスが作成されます。

### パラメータ

<x-field-group>
  <x-field data-name="to" data-type="string" data-required="true" data-desc="ステークを受け取るアカウントのDIDアドレス。"></x-field>
  <x-field data-name="assets" data-type="string[]" data-required="false" data-desc="ステークするアセットアドレス（NFT）の配列。"></x-field>
  <x-field data-name="tokens" data-type="object[]" data-required="false" data-desc="ステークするトークンオブジェクトの配列。">
    <x-field data-name="address" data-type="string" data-required="true" data-desc="トークンコントラクトのアドレス。"></x-field>
    <x-field data-name="value" data-type="number" data-required="true" data-desc="ステークするトークンの量。"></x-field>
  </x-field>
  <x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="ステーカーのウォレットオブジェクト。"></x-field>
  <x-field data-name="locked" data-type="boolean" data-default="false" data-required="false" data-desc="作成時にステークがロックされるかどうかを示すブール値。"></x-field>
  <x-field data-name="slashers" data-type="string[]" data-required="false" data-desc="このステークをスラッシュすることが許可されているDIDアドレスの配列。指定しない場合、デフォルトで受取人のアドレスになります。"></x-field>
  <x-field data-name="message" data-type="string" data-required="false" data-desc="ステークのためのオプションのメモまたはメッセージ。"></x-field>
  <x-field data-name="nonce" data-type="string" data-required="false" data-desc="ステークアドレスが一意であることを保証するためのオプションのナンス。"></x-field>
</x-field-group>

### 例

```javascript トークンとアセットのステーキング icon=logos: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` を含むタプルを返します。このアドレスは、取り消しやスラッシュなど、この特定のステークとの将来のすべてのやり取りにとって重要です。

---


## ステークの取り消し方法

ステークの取り消しは、ステーカーがロックされたトークンとアセットを回収するために開始するプロセスです。このトランザクションは資金を即座に返すのではなく、チェーン上のロックアップ期間に従って、請求可能としてマークします。

### パラメータ

<x-field-group>
  <x-field data-name="from" data-type="string" data-required="true" data-desc="取り消すステークのアドレス（'stake' 呼び出しから取得）。"></x-field>
  <x-field data-name="assets" data-type="string[]" data-required="false" data-desc="ステークから取り消すアセットアドレスの配列。"></x-field>
  <x-field data-name="tokens" data-type="object[]" data-required="false" data-desc="取り消すトークンオブジェクトの配列。">
    <x-field data-name="address" data-type="string" data-required="true" data-desc="トークンコントラクトのアドレス。"></x-field>
    <x-field data-name="value" data-type="number" data-required="true" data-desc="取り消すトークンの量。"></x-field>
  </x-field>
  <x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="ステーカーのウォレットオブジェクト。ステークの元の作成者である必要があります。"></x-field>
</x-field-group>

### 例

```javascript ステークの取り消し icon=logos: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` トランザクションを送信して、トークンとアセットを自分のアカウントに戻す必要があります。これにより、引き出しプロセスが完了します。

### パラメータ

<x-field-group>
  <x-field data-name="from" data-type="string" data-required="true" data-desc="ステークのアドレス。"></x-field>
  <x-field data-name="evidence" data-type="string" data-required="true" data-desc="'revokeStake' 呼び出しからのトランザクションハッシュ。これは取り消しの証明として機能します。"></x-field>
  <x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="ステーカーのウォレットオブジェクト。"></x-field>
</x-field-group>

### 例

```javascript ステークされたアイテムの請求 icon=logos: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`（通常はステークの受取人）がステーカーに対して行うことができる懲罰的措置です。これは通常、ステーカーが特定のルールに違反した場合に発生します。スラッシュされたトークンやアセットはステークから削除され、指定された保管庫に送られます。

### パラメータ

<x-field-group>
  <x-field data-name="from" data-type="string" data-required="true" data-desc="スラッシュされるステークのアドレス。"></x-field>
  <x-field data-name="reason" data-type="string" data-required="true" data-desc="スラッシュが発生する理由を説明する必須のメッセージ。"></x-field>
  <x-field data-name="assets" data-type="string[]" data-required="false" data-desc="ステークからスラッシュされるアセットアドレスの配列。"></x-field>
  <x-field data-name="tokens" data-type="object[]" data-required="false" data-desc="スラッシュされるトークンオブジェクトの配列。">
    <x-field data-name="address" data-type="string" data-required="true" data-desc="トークンコントラクトのアドレス。"></x-field>
    <x-field data-name="value" data-type="number" data-required="true" data-desc="スラッシュするトークンの量。"></x-field>
  </x-field>
  <x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="権限のあるスラッシャーのウォレットオブジェクト。"></x-field>
</x-field-group>

### 例

```javascript ステークのスラッシュ icon=logos: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` でステークを作成し、`revokeStake` と `claimStake` で資金を回収し、`slashStake` で不正な行為者を罰します。この強力なメカニズムは、多くの分散型アプリケーションの基礎となります。

ステークできるアイテムについてさらに詳しく知りたい場合は、[トークンの管理](./how-to-guides-manage-tokens.md) および [アセット（NFT）の管理](./how-to-guides-manage-assets.md) のガイドを参照してください。
