nft登録するまで
NFT登録をしたいです。
方法・わからないワードもメモしていきます。
Faas
Dapps
スマートコントラクト
Solidity
Polygon
ミント(Mint)する
オンチェーン
ガス代
ERC-721
ERC-721とは何かについて深ぼる
ERC-721とはNFTのユニーク性を保つための規格。
同じスマートコントラクト内でNFTのユニーク性を保つ為の規格(決まり事)。
=> 「同じスマートコントラクト内で」は、「同じアドレス内で」と同義。
つまり、同じアドレス内でNFTノユニーク性を保つための規格。
具体的な話をすると、
NFTはtoken ID(uint256変数)とAddressの情報を持つ。
Addressが同じだとしても、NFT1つ1つにtoken IDがあるから、NFTはユニークなのか。
名前の通りですね。
NFT(非代替性トークン)
参考
uint256とは
256 bitの符号付整数型
alchemyを使ってみようかな!
ネットワークの選択
Arbitrumとは
イーサリアムのレイヤー2プロジェクト。ほう。技術が進化しているのね。
レイヤー2とは?
L2コア技術- Plasma
- State Channel
- Rollup
Rollup とは
L2コア技術の1つ
L1とL2をハイブリッドに使用したもの
Optimistic Rollup とは
Rollupの中のOptimistic Rollup 。
nftイメージはIPFS(InterPlanetary File System)に保存するのかな
アップロードするとこんな感じになるっぽい
NFT metadata is the core of an NFT. It is a JSON document that often contains the following:
NFT’s name
Description of the NFT
Link to the hosted image
Traits
…
NFTのメタデータはjsonファイルなんだ。
ちなみにメタデータってなんだ?
メタデータとは、本体であるデータに関する付帯情報が記載されたデータです。「データのためのデータ」と説明されることもあります。
人間でいう、性別、身長、体重、年齢とか。
データであれば、作成日、作成者、更新日、サイズなど
引用
ABIって何?
アプリケーションバイナリインターフェース(Application Binary Interface, ABI)
contract ABIの取得
この実体はこのページのgifで見れるよう
Etherscanにaddress
の情報を入れると、contract ABIがjsonファイルで取得できるよう
というかaddressってしれっと使っていたけど、
イーサリアムにもアドレスがあるのね。
なぜIPFSを使うのか?
- ブロックチェーンのデータは永久
- リンクはリンク切れがある。
それを避けるためっぽい
スマートコントラクトとは
「スマートコントラクト」とは、ブロックチェーンシステム上の概念であり、あらかじめ設定されたルールに従って、ブロックチェーン上のトランザクション(取引)、もしくはブロックチェーン外から取り込まれた情報をトリガーにして実行されるプログラムを指す。
A smart contract is a program that runs on the Ethereum blockchain. Its code and data reside at a specific address on the Ethereum blockchain.
- チェーン状で走る処理。
- イーサリアムのアドレスごとに存在しているイメージ
そしてスマートコントラクトが、
- NFTを譲渡できるか?の判定処理
- 所有者の判定処理
などを行うっぽい。
もうちょい具体的に
あるパラメータを指定して呼び出すと、特定の条件が満たされた場合に何らかのアクションや計算を実行するスクリプト。
具体例
単純なベンダースマートコントラクトは、呼び出し側が特定の受信者にETHを送信した場合、デジタル資産の所有権を作成し、割り当てることができます。
参考
transactionとは何か。
アカウントからの暗号化された署名付きの指示です
ところでアカウントってなに?
ether(ETH)
が保存されている場所。
アカウントとアカウントの残高はEVM
の中に格納されている。つまりEVM
のステートの一部
アカウントのタイプ
- Externally-owned ・・・private-keyを持つ誰もがコントロールできる
- Contract ・・・ネットワークに展開されたスマートコントラクトで、コードによって制御されます。
どちらのアカウントタイプでもできること
- ETHとトークンの受信、保有、送信
- デプロイされているスマートコントラクトとの連動
参考
参考
ブロックチェーンとは
- publicなデータベース。
- 複数(多く)のコンピューターからアクセス可能。
「ブロック」とは何を意味しているのか
データや状態(ステート)が "ブロック "と呼ばれる連続したグループに保存されているということ。
「チェーン」とは何を意味しているのか
"チェーン "とは、各ブロックが暗号的にその親を参照することを指す。
=> つまり、ブロックは連鎖していく
=> とあるブロックのデータを変更するために、それに連なる次のブロックのデータも変更しないといけない
=> ネットワーク全体のコンセンサスが必要となる
なんとなくわかる気もするが、まだ難しい。
MetaMaskでRopsten Test Networkが選択肢に出てこない場合
Ropsten Test Networkしたいのに出てこない場合
アカウントアイコンをクリック => settingを選択
Advancedを選択
Show test networksをONにする
Ropsten Test Networkに(fake)ETHを追加する方法
FaucETH に遷移
Ropstenのaddressを入力
MetaMaskのアカウント画面からコピペでとってこれます
認証完了後
fake ETHを0.42ETHもらいました~
参考
Balanceのチェック
Alchemyのcomposerツールに、アカウントのアドレスを入力すると口座残高が返ってきます。
weiという単位で返ってくる。
1 eth = 1018 wei
イーサリアム用の単位変換ツールを使うと、単位変換できます。
下の画面では
0x5d423c655aa0000 wei = 0.42 eth
smart contractを書くときにopenzeppelin
を利用するのかな?
openzeppelinを利用したスマートコントラクトのコード例と解説
metamask のprivate-keyを使わずにnftのミントをする
秘密鍵を使わずとも、transactionに署名できるんだ!
参考
スマートコントラクトのデプロイも自動化したいなあ..
solic jsを使ったexample
solcを使って、solidityファイルをコンパイルしようと思うと、openzeppelinからのimport分がParserErrorになるな~
ParserError: Source "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol" not found: File not found\n'
pathが間違っていることが原因でした。
エラー出ている箇所のパスを要確認。
できた!
その後にsolc
,web3
を使ってスマートコントラクトをdeployしているサンプルコードを発見。
これも参考になるかな?
infura のapi-keyの取得
infuraに直接繋ぐとうまくいかない..
やっぱりprivate-keyが必要?
説明が丁寧でわかりやすいです
etherの送信に使えそう
Error: nonce too lowのエラー
問題はこれだった。
pinataに画像URLのデータをアップロードしたい。
imageURL => Blob => File => FormData => アップロードという流れかな?
FormDataってまず何者だ?
これか!!
ハードフォークってなに?
export type chain =
| 'mainnet'
| 'goerli'
| 'kovan'
| 'rinkeby'
| 'ropsten';
export type hardfork =
| 'chainstart'
| 'homestead'
| 'dao'
| 'tangerineWhistle'
| 'spuriousDragon'
| 'byzantium'
| 'constantinople'
| 'petersburg'
| 'istanbul';
参考になるかな?
イーサリアムブロックチェーンに関して
スマートコントラクトのデプロイaddress
とabi
が必要なのか
- スマコンのデプロイ
- abiとアドレスを保管
- スマートコントラクト内にある関数を使用するためには、保管してあるabiとトランザクションを送るアドレスの情報を使う。
- mintも保管された
abi
とスマコンのアドレス
を使って、関数を呼ぶ(transaction)
かなりわかりやすいです!
スマートコントラクトのデプロイがpending中にもう一回デプロイしようとすると、already known
のエラーになるっぽい。
maxPriorityFeePerGas
や maxFeePerGas
辺りの説明があります!ありがとうございます!
ガス代について
前回のトランザクションがpendingであった場合の対処法
新しいトランザクションとして送る
- nonceを更新して送る
リプレイスする
- nonceは同じ
- gasの値段を10%あげて送り直す(基本計算量は増えているので、10%以上になる)
solidityの型まとめ
//storage : ブロックチェーン内に保存される値。関数外ではデフォルトでstorage型になる。ガス代は高くなる。
//memory : コントラクト実行時のみ保持される変数。ブロックチェーンには保存されないのでガス代が安くなる。
//virtual: この関数は後でオーバーライドしても良い
//override: この関数はすでにオーバーライドしている
//address : 20バイトの値。Ethereumアドレスの大きさ。
//address payable : addressに加えて、追加のメンバ transfer と send が使える。
Solidityのライブラリの使い方
@openzeppelin/contracts/utils/Counters.sol
内にある、library Counters {...}
Countersライブラリを使う場合
using Counters for Counters.Counter;
forの後には型が入るのかな
参考
払えないガス代を設定すると
こちらのエラーになるnftの売買処理の参考
nodejsで画像のURLを受け取り、pinataへアップロードする方法
typescriptだと、型はany
にしないといけない
PinataCloud/Pinata-SDK#28 (comment)
パーセンテージを計算する時
だめ
uint256 toOperatorEth = _priceWei * 0.03;
OK
uint256 toOperatorEth = _priceWei * 3 / 100;
ミント自体は完了したのでクローズ!