//tips
言語を描画するサイトでいろいろ試しているがなかなか思っているものが出てこない。NFTのmintまでできる模様。
https://app.wombo.art/
//smart contract
クリプトゾンビ見直し。
自分の所有ゾンビ数をmapping (address => uint[]) public ownerToZombiesのような形でpush(zombieId)でゾンビを追加していく処理を取らないのは、ゾンビを誰かに譲る関数を実行するたびに、莫大なガスコストが発生するため。元のオーナーの配列から所有を削除し、配列の穴を埋めるためindexをずらす処理が必要で、そちらで余分なコストが発生してしまう。
その対策として、view関数は外部から呼び出した時にガスコストがかからないから、memoryで配列を定義したgetZombiesByOwner内でforループを使って、オーナーのゾンビ軍団の配列を作るのがコスト削減のコツとのこと。一見冗長なように見えても意味がある。
function getZombiesByOwner(address _owner) external view returns(uint[]) {
uint[] memory result = new uint[](ownerZombieCount[_owner]);
を使うことでガス代を使用せずにこの中で加工した各オーナーのゾンビ配列を返すことが可能。
payable関数は、Etherを受け取ることができる特別なタイプの関数。一般的なアプリでは代金の支払いは別の決済システムと連動しており、商品の移動とお金の移動は別の流れで行われる。
一方でイーサリアムの場合は、Etherもデータ(トランザクションの内容)もイーサリアム上にあるので関数の実行/商品の所有の入れ替えと支払いが同時にできる。ユーザーがpayable関数内で支払いを行うと支払われたethはコントラクト内に貯蔵される。
function levelUp(uint _zombieId) external payable {
require(msg.value == levelUpFee);
zombies[_zombieId].level++;
}
コントラクトからEtherを引き出す関数を追加しない限りはそこに貯められたまま。もし販売主の間にコントラクトが入っていたら、transfer関数を使ってEtherを特定のアドレスに送処理seller.transfer(msg.value)などを実施することになる。
Solidityにおいて安全な乱数を生成することは今のところできないが、keccak256ハッシュ関数が一番おすすめ。本気の乱数は確かスパコンが必要だった気がする。イーサリアムのブロックチェーン外部から乱数関数にアクセスするために oracle を使うことになる。
Solidityにおいて安全な乱数が発行できない要因としては、 自分のノードだけに向けてトランザクションを発行できるだめ自分の好きな目が出た時のみをブロック内のトランザクションとして組み込むことができるよう。解読可能性の問題ではなく、擬似的に数値操作ができてしまうという内容だった。
一般的に言われるトークンとは、openzeppelinなどに継承されることにより、基本的にいくつかの共通ルールに従ったスマートコントラクトとなっている。
そのベーシックなコントラクトの基盤として、誰がトークンをどれくらいを所有しているのかを記録するコントラクトと、ユーザーが自分のトークンを他のアドレスに送ることができるようにする機能、が存在している。
トークンの保有数は、10円玉何枚のような形ではなく、管理コントラクト上での数字の増減と言えるか。
例えば、ユーザーはトークンを取引所のウォレットアドレスに送るようコントラクトに指示でき、取引所はユーザーが引き出しを要求した場合にトークンを彼らに送り返すようコントラクトに指示する。
これがERC20トークンのベーシックな考え方で、クリプト収集物により適したERC721トークンは一つの単位ごとの取引のみ可能とする。