IXT ProtectのDAppコードの概要(スマートコントラクトとWebクライアント)
今回はマニアックですがIXT Protectのコードを見ていきます。(完全に自分の勉強と趣味ですので開発者以外は無視してください)
コードの全体概要
コードは以下に置いてあります。
上のページを開くとコードをWeb上で誰でも見ることができます。
(Cloneやdownloadすればクライアントでも見れます)
右側の方に6 days agoなどが出ていますがこれは更新された日付を表しています。(下記の例では1週間前にclient内のコードが更新されてます。)
contributorsというところを見ると誰がコードを開発しているのかがわかります。
hcawという人とingemar-ixtという2名で作成しているようです。
(ただし通常は1アカウント1名で運用していると思いますが、1アカウントをデプロイ用で複数名で運用している可能性もあるので実際の開発者数はわかりません)
話を戻すとIXT ProtectはtruffleというEthereumのDAppプログラムを作成するフレームワークを使用して作られています。フォルダーは大きく4つに別れておりそれぞれの役割は以下のとおりです。 これは典型的なDAppに見られるフォルダ構成です。
- client・・・IXT Protect Webクライアントのソースコード
- contract・・・IXT Protectのスマートコントラクトのソースコード
- migrations・・・スマートコントラクトをデプロイするためのソースコード
- test・・・スマートコントラクトをテストするためのソースコード
- ファイル・・・最上位にpackage.jsonなどのアプリケーション構成ファイルなど
上記のコードと実際の開発を図示すると以下のようになります。
上記のうちmigrationsとtestは特に面白くはないのでclientとcontractをそれぞれもう少し見ていきます。
clientフォルダの概要
ソースを見ていくとReactとSemantic UIを使って組み立てていることがわかります。
modulesの下を見ると僕らの見ているアカウントページの他にadminページがあるようです。
componentsの下がそれぞれの部品の実体です。
stakeコンポーネント
stakeコンポーネントの中のコードを見ていくと例えば以下の部分がdepositボタンをクリックした時に呼び出される部分です。すごい簡潔に記載されてます。
contractフォルダの概要
contractのフォルダにはlibとmocksフォルダの他に.solファイルが3つあります。
メインは.solファイルでixtProtect.solです。
ixtProtect.sol
IXT Protectで使われる様々なイベントと関数が定義されています。
Event
- MemberAdded・・・メンバー追加時
- StakeDeposited・・・ステークデポジット時
- StakeWithdrawn・・・ステーク引き出し時
- RewardClaimed・・・リワード要求時
- InvitationRewardGiven・・・紹介リワード配布時
- PoolDeposit・・・プールデポジット時
- PoolWithdraw・・・プール引き出し時
- AdminRemovedMember・・・メンバー削除時
- MemberDrained・・・全メンバードレイン時
- PoolDrained・・・プールドレイン時
- ContractDrained・・・コントラクトドレイン時
- InvitationRewardChanged・・・紹介リワード変更時
- LoyaltyRewardChanged・・・ロイヤリティリワード変更時
RoleManagerコントラクト
ロールマネージャーはOwnable, Pausable, ValidatorRoleを継承していてアドミンなどのロールを管理していると思われます(全部のコードは追ってないので間違ってるかも)
Functions
- constructor
StakeManagerコントラクト
ステーキングレベルの管理をするだけのコントラクトです。
Modifier
- isValidStakeLevel
Data
- StakeLevel
Functions
- constructor
RewardManagerコントラクト
リワードの管理を行うコントラクトです。
Data
- invitationReward
- loyaltyPeriodDays
- loyaltyRewardAmount
Functions
- constructor
IxtProtectコントラクト
メインのコントラクトです。ほとんどの重要な関数はここに定義されています。
Modifier
isNotMember - isMember
notStaking - staking
Struct
- Member
Data
ixtToken - members
membersArray - totalMemberBalance
- balance
totalPoolBalance - registeredInvitationCodes
Constant
- IXT_DECIMALS
Functions
- constructor
- addMember・・・メンバー追加
- depositStake・・・ステークをデポジット(デポジットボタンをクリックされたら呼ばれる)
- withdrawStake・・・ステークを引き出し
- claimRewards・・・リワードを要求
- getMembersArrayLength・・・メンバー数を取得
- getAccountBalance・・・アカウントバランスを取得
- getStakeBalance・・・ステークバランスを取得
- getRewardBalance・・・リワードバランスを取得
- getInvitationRewardBalance・・・紹介リワードバランスを取得
- getLoyaltyRewardBalance ・・・ロイヤリティリワードバランスを取得
(admin functions)
- depositPool・・・プールにデポジットする
- withdrawPool・・・プールから引き出す
- removeMember・・・メンバーを削除する
- drain・・・緊急時のみにアドミンが実行。全ユーザーのデポジットを返金。
- setInvitationReward・・・紹介リワードの設定
(Internal Functions)
- cancelMembershipInternal
- refundUserBalance
- removeMemberFromArray
- claimRewardsInternal
- depositInternal
depositStake関数
例えばdepositStake関数は以下のようになっています。
publicからisValidStakeLevelまではModifierと言われるチェック関数みたいなものです。
uint256からが実際の処理になります。
レベルに応じで金額をデポジットし、デポジットの開始時間としてタイムスタンプなどを記録しています。
また招待コードの記録もしています。
また時間があればもう少し深く見てみたいと思います。
以上です。