このコントラクトは、Nekoniumのクロスチェーンハードフォークに使うトークンコントラクトです。
Nekoniumチェーンから生成したマルチシグ残高証明トランザクションを元に、対象ネットワークへ残高を記録し、同量のトークンを生成します。 チェーンにとってはハードフォークですが、ユーザーにとっては申告を要するトークンエアドロップに近い意味を持ちます。
対象ネットワークはEthereum mainnetを想定していますが、Ethereumと互換性のあるアドレスであれば、応用することが可能です。
※トークンに価値は保障されませんが、ここでは受け取るトークンを報酬として表現します。
- 生成するトークンはERC223トークンと互換性があります。
- ERC223のbalance値とは別に、アカウントのスナップショット残高を示すsnapshot値があります。
- スナップショット残高の記録とトークン生成の為に、2つの拡張関数があります。
- totalSupplyは、残高スナップショットの合計値+残高スナップショットの数量×書き込み報酬です。
- マルチシグを用いることで、単独の署名者による不正な残高証明の発行を防止します。
- アップデート・プロキシ機能、事後調整機能を持ちません。不具合やハッキングに対して無防備です。
このトークンの目的は、Nekoniumの残高スナップショットを流動性を維持したまま他のチェーンへ保管することです。 何らかの資金調達や、将来的な付加価値を約束するものではありません。投機・投資・貯蓄活動の為の利用はご遠慮ください。
※トークンに価値は保障されませんが、ここでは受け取るトークンを報酬として表現します。
コントラクトを取り巻く登場者を紹介します。
- トークン生成者(残高生成者)
- 署名者
- 登録者
- 残高所有者
トークン生成者は、このコントラクトの可変パラメータを決定し、対象ネットワークにデプロイし、そこに生成する残高証明のリストを作成します。
署名者は、トークン生成者が生成した残高リストの正統性に、そのアカウントで署名を行います。
登録者は、署名者が署名済みの残高証明をコントラクトに送信し、対象ネットワークに残高情報とトークン残高を発生させます。
残高所有者は、Nekoniumネットワークの、あるブロック高について、残高を持つアカウントの所有者です。
トークン生成者はコントラクトのパラメータを決定できます。デプロイの為に対象ネットワークに手数料を支払いますが、直接得られる報酬はありません。
署名者の収受する手数料や報酬はありません。
登録者はトランザクション送信の為に対象ネットワークに手数料を支払います。その代わり、登録に成功した場合は固定値のトークン残高を得ます。
残高所有者が登録者と同一な場合は、残高所有者はトランザクション送信の為に対象ネットワークに手数料を支払い、登録に成功した場合は固定値のトークン残高と残高証明にある額の合計を受け取ります。残高所有者が登録者と異なる場合は、他の登録者が登録に成功した場合に、残高証明にあるトークン残高を受け取ります。
残高は、トークン生成者によって生成します。これを署名者が検証して署名することで、残高証明を正統化します。
署名者が多いほど、後に不正な残高生成をすることが難しくなります。署名するアカウントは、それぞれの信頼性をアカウントの所属するネットワークで担保します。 署名者は様々な立場で複数人が参加するべきです。これにより、事後の談合による不正な署名が防止されます。アカウントではなく、アカウントの所有者で正統性を担保するならば、一次的に生成したアカウントを署名に使用し、署名後に検証不能な形で破棄する方式も使用できます。
残高証明を持つ残高所有者は、自身が登録者になるか、または他社によって自分のトランザクションが送信されることで、トークンを得ます。 残高証明を持たない登録者は、トランザクションの送信により、対象ネットワークへの手数料と引き換えにトークンを得る機会を得ます。
トークンをデプロイする前に、次のパラメータを決定します。これらのパラメータは、コントラクトのソースにハードコートします。
- スナップショットを実施するNekoniumチェーンのブロック高。
- トークン発行の対象から外すアカウントリスト。
- 書き込みリワードの数量。
- HF識別子となる16文字の識別子
1のブロック高は、過去でも未来でも構いません。スナップショットを製造するためにはNekoniumチェーンのブロック高がその値を超える必要があります。 2のアカウントリストは、運用又は政治的な理由で除外したいアカウントを対象にします。Nekoniumチェーンのプレマインアカウントや、BURNアカウントのリストを指定するべきです。 3の書き込みリワードは、コントラクトの実行者が受け取るトークンの数量を指定します。アカウント数×数量が、残高証明とは別に発行されることに注意してください。 4の識別子はユーザー領域です。お好みの文字列を設定します。16文字に満たない部分は0パディングして下さい。
ソースファイルをコンパイルしてデプロイします。
solc --evm-version 0.7.3 contract.sol
残高生成の元とするマルチシグ残高証明トランザクションをNukoPunchで生成します。
まずはgnekoniumを同期してフルノードを構築します。
$ gnekonium --rpc --rpcaddr "localhost" --syncmode full console
blockScan.pyでチェーンに存在するアカウント情報を全て取得します。
$python3 blockScan.py 0 --format sqlite --out ./nekonium_accounts.sqlite3
スナップショット残高を生成します。ここではブロック高100000を指定しました。
$python3 balanceSnapshot.py ./nekonium_accounts.sqlite3 100000 --format sqlite
スナップショット残高をJSONへ書き出します。messageの値はTEST\0\0\0\0\0\0\0\0\0\0\0\0とします。
$python3 genSignedBalanceList.py init nekonium_accounts.sqlite3 100000 --message TEST --out ./signed.json
スナップショットに署名します。BURNリストへ指定した順番で署名をしてください。
$python3 genSignedBalanceList.py sign ./signed.json 0x4b647402e73185ae03b5591b43f5236eccfcff23 --password "PASSWORD"
全ての署名が終わったら、JSON、またはCSVへトランザクションリストを書き出します。ここではCSVを選択します。
$python3 genSignedBalanceList.py export --format csv ./signed.json
次のようなCSVが出力されます。適切に加工して、Webサイトなどの残高所有者全員が閲覧可能な場所にアップロードしてください。
version created_date
SignedBalanceList/0.1;BalanceCertification/0.1 2020-12-24 21:24:15.853105
:
0x0000000000000000000000000000000000000000 0.0 0 0x000000000000000000000000000000000000000000002710000000000000000000000000544553540000000000000000000000002076a645a9703d01a9d01beae5a0f7940db453653d313945fe4944704b6c9b334db3206213b9e9f66133309b824885e84485084732bae2b826c34b50f97b2c761c
0xdcEa28Ea2Cb699bF020a6D4738EB3A94D9FAEBb7 26088.920726 26088920726000000000000 0xdcea28ea2cb699bf020a6d4738eb3a94d9faebb70000271000000586488187455c176000544553540000000000000000000000004884f34ceb81d7ff230e91ff7c3bbf9934932a71a1122de48339ed97b333343d3740ecb17b7e23779b3ab3afed5ba59702d3495513e78cd11942dfb919d4b02e1c
:
後で書く