# [Bunzz Decipher] BNBトークンのコントラクトを見てみよう！

> BNBコントラクトは、特定の仮想通貨トークンであるBNBを取り扱うためにEthereumブロックチェーンプラットフォーム上に構築された堅牢で効率的なコントラクトです。

- URL: https://cardene.dev/articles/e4e90738a97d9f
- 公開日: 2023-07-25
- 更新日: 2023-07-25
- トピック: Blockchain
- タグ: ブロックチェーン, solid, smartcontract, ethers

# はじめに

初めまして。
**CryptoGames**というブロックチェーンゲーム企業でエンジニアをしている **cardene（かるでね）** です！
スマートコントラクトを書いたり、フロントエンド・バックエンド・インフラと幅広く触れています。

https://cryptogames.co.jp/

代表的なゲームは**クリプトスペルズ**というブロックチェーンゲームです。

https://cryptospells.jp/

今回はBunzzの新機能『**DeCipher**』を使用して、BNBのコントラクトを見てみようと思います。
『**DeCipher**』はAIを使用してコントラクトのドキュメントを自動生成してくれるサービスです。

:::message alert
『**DeCipher**』は現在クローズドβ版になります。
:::

BNBのコントラクトは以下になります。
https://etherscan.io/token/0xB8c77482e45F1F44dE1745F52C74426C631bDD52#code

生成されたドキュメントを翻訳・要約・補足しながらまとめていきます。

# 概要

BNBコントラクトは、特定の仮想通貨トークンであるBNBを取り扱うためにEthereumブロックチェーンプラットフォーム上に構築された堅牢で効率的なコントラクトです。その基本的な目的は、ブロックチェーン技術の信頼性を確認し、透明性があり安全で改ざんが不可能なトランザクションを保証することです。

このコントラクトは、特定数量のトークンで初期化され、それらはコントラクト作成者のアドレスに割り当てられます。作成者が最初のトークンを保持し、それらをブロックチェーンを介して他の人々に配布することができます。コントラクトの初期化時には、トークンの初期供給量、トークンの名前、小数点以下の桁数、およびトークンのシンボルが設定されます。

## 変数
このコントラクトにはいくつかの`public`変数があります。

- `name`
	- トークンの表示名。
- `symbol`
	- トークンの表示シンボル。
- `decimals`
	- トークンが使用できる小数点以下の桁数。
- `totalSupply`
	- 発行できるトークンの総量。
- `owner`
	- コントラクト作成者のアドレス。
- `balanceOf`
	- 各アドレスのトークンの残高を格納した配列。
- `freezeOf`
	- 各アドレスから凍結されたトークンの量を格納した配列。
- `allowance`
	- あるアドレスが別のアドレスが保有しているトークンのうち、操作できるトークン量を格納した配列。
	- 
## 関数
さまざまな関数により、ユーザーはBNBコントラクトとやり取りができます。

### `BNB`
コントラクトのコンストラクターです。
:::message
constructorとは、コントラクトのデプロイ時に一度だけ実行される関数です。
:::

コントラクトを初期化し、初期発行トークン、トークンの名前、小数点以下の有効桁数、シンボルを設定し、すべてのトークンをコントラクトの作成者に割り当てます。

### transfer
関数実行アドレスの残高から指定された量のトークンを別のアドレスに送付します。

## イベント
さまざまなイベントが特定のブロックチェーン上のトランザクションについて通知されます。

- `Transfer`
	- トークンがあるアドレスから別のアドレスに送付された時に発行。
- `Burn`
	- アドレスが所有するトークンの一部を焼却（破棄）する時に発行。
- `Freeze`
	- アドレスが所有するトークンの一部を凍結（一時的に使用不能）する時に発行。
- `Unfreeze`
	- アドレスが所有するトークンの一部を解凍する時に発行。


BNBコントラクトは、トークンの管理と実行を保証し、トークンの数量を示し、重要なトークン情報を保持し、トークンの焼却と凍結のルールを定義します。
ビジネスオーナーとしての私の視点から見ると、BNBコントラクトはトレース可能なすべてのトランザクションの記録、詐欺リスクの低減、簡単なトランザクション処理により、ビジネスの運営を非常に効率的にサポートしてくれます。

# 使い方

BNBコントラクトは、Ethereum上の標準的なトークンのスマートコントラクトであり、Ethereumネットワーク上で新しいトークンを作成するために使用されます。

## コントラクトの目的
このコントラクトの目的は、トークンを作成し、管理し、運営することで、トークンの送付、トークンの凍結/解凍、トークンの焼却など、さまざまな操作を実行します。

## 実行すべき手順
### コントラクトのデプロイメント
最初のステップは、Ethereumネットワーク上にコントラクトをデプロイすることです。
コントラクトの初期化は、`BNB`関数に以下の4つの引数を渡して実行されます。

- `initialSupply`
- `tokenName`
- `decimalUnits`
- `tokenSymbol`

残りのすべてのトークンは、コントラクトの作成者に割り当てられます。

### トークンの転送
`transfer`関数を使用すると、オーナーやトークンの保有者が特定の数のトークンを特定のEthereumアドレスに送付できます。
この関数を呼び出すために必要なパラメーターは、受信者のアドレス（`_to`）と送付するトークンの数（`_value`）です。

### トークンの承認
`approve`関数を使用すると、トークンの保有者が別のEthereumアドレスに対して特定の数のトークンを引き出すことを承認できます。
これを呼び出すために必要なパラメーターは、承認されるアドレス（`_spender`）と承認されるトークンの数（`_value`）です。

### 特定のアカウントからトークンを送付
`transferFrom`関数を使用すると、許可されたアドレスがトークンの保有者アドレスの代わりにトークンを送付できます。
この関数は以下の3つの値を引数に取ります。
- `_from`
	- トークンを送付する元のアドレス。
- `_to`
	- 受信者のアドレス。
- `_value`
	- 送付するトークンの数。

### コントラクトのイベント
このコントラクトは、変更を管理し追跡するために以下の4つの主要なイベントを使用します。

- `Transfer`
	- トークンが送付されたときの詳細を記録し、送信者、受信者、トークン量の情報をログとして記録します。
- `Burn`
	- トークンが焼却（破棄）されたときの詳細を記録し、焼却されたアドレスと焼却されたトークン量の情報をログとして記録します。
- `Freeze`
	- トークンが凍結（送付不可能）されたときの詳細を記録し、凍結されたアドレスと凍結されたトークン量の情報をログとして記録します。
- `Unfreeze`
	- トークンが解凍（転送可能）されたときの詳細を記録し、凍結されたアドレスと凍結されたトークン量の情報をログとして記録します。

## その他の操作
コントラクトからEtherを引き出す関数、トークンを凍結または解凍する関数（それらを送付不可または送付可能にする）などの操作が含まれます。

# モジュールのパラメータ
コントラクトをデプロイする時に一度だけ実行される、`constructor`の引数の説明がされています。

- `initialSupply`
	- コントラクトの作成者に割り当てられるトークン総量。
	- 初期発行トークンのことです。
- `tokenName`
	- トークンの名前。
- `decimalUnits`
	- 小数点以下の有効桁数。
- `tokenSymbol`
	- トークンのシンボル。

# 関数

この章では各関数について説明していきます。
紹介する関数はERC20規格で実装されている関数以外になります。
ERC20規格内の関数については以下の記事などを参考にしてください。

https://chaldene.net/erc20

## withdrawEther

:::message
コントラクトから指定した量のEtherを引き出す関数。
:::

`public`関数で、引数の`amount`に引き出したいイーサの量を指定します。

この関数を呼び出せるのは、コントラクトの所有者または権限を付与されたアドレスのみです。
`onlyOwner` や `onlyAuthorized`などの修飾子を実装することで、関数実行のアドレスに権限が含まれているか確認し、もし含まれていれば実行できます。

この関数は、ユーザーがコントラクトからイーサリアム資金を引き出すための手段となる。
そのため、ユーザーがコントラクトにEtherを預けていて、その資金を換金したり別のアドレスに移したりしたい場合に便利です。

## unfreeze

:::message
関数実行アドレスの凍結されたトークンを解除する関数。
:::

関数を実行するには、関数実行アドレスが一定量の凍結トークンを持っている必要があります。
引数の`value`は、凍結を解除するトークンの量を表します。
この関数は、送信者に十分な凍結トークンがあるかどうかをチェックします（`_value <= freezeOf[msg.sender]`）。
関数実行アドレスに十分な凍結トークンがない場合や`_value`がマイナスの値か`0`の場合（`_value <= 0`）、この関数は例外を投げます。

関数実行アドレスに十分な凍結トークンがある場合、関数実行アドレスの凍結トークンを表す変数 `freezeOf[msg.sender]`から`_value`を減算します。
この変数は送信者が使用可能なトークンを表します。

その後、関数実行アドレスと凍結解除量（`_value`）を指定して、`Freeze`イベントを発行します。
凍結解除が成功した場合`true`を返します。

この関数を使用するためには以下の条件があります。
- 関数実行アドレスが一定量の凍結トークン（`freezeOf[msg.sender] >= _value`）を持っている。
- 関数実行アドレスは以前に`freeze`関数を使用して、トークンを凍結しておく。

## freeze

:::message
関数実行アドレスの保有しているトークンを凍結する関数。
:::

関数実行アドレスの一定量のトークンを凍結することができます。
関数実行アドレスが指定した量（`_value`）のトークンを保有しているかチェックし、もし保有していなければ例外を投げます。
また、`_value`が`0`以下の場合も例外が投げられます。

必要なチェックを実行した後、この関数は、関数実行アドレスのトークン残高から凍結量（`_value`）を差し引き、凍結されたトークン発行量の合計を更新します。
その後、トークンが正常に凍結されたことを示す`Freeze`イベントを発行します。

この関数は、一定期間アカウントに一定量のトークンをロックし、トークンが他のトランザクションで送金または使用されないようにしたい時に便利です。

# Code

DeCipherの以下の部分にもコードが置かれています。

https://app.bunzz.dev/decipher/chains/1/addresses/0xB8c77482e45F1F44dE1745F52C74426C631bDD52


# 最後に

今回の記事では、Bunzzの新機能『**DeCipher**』を使用して、BNBトークンのコントラクトを見てきました。
いかがだったでしょうか？
今後も特定のNFTやコントラクトをピックアップしてまとめてみたいと思います。

普段はブログやQiitaでブロックチェーンやAIに関する記事を挙げているので、よければ見ていってください！

https://chaldene.net/

https://qiita.com/cardene

https://x.com/cardene777
