😎

Solidity勉強で役に立ったサイトまとめ

2021/06/09に公開
2

コピー渡し、参照渡し

・関数の引数に配列を渡すときは、(渡す配列がmemoryだろうとstorageだろうと)引数の宣言がmemoryだとコピー渡し、storageだと参照渡しになる。
・structのコンストラクタはコピー渡し。なので、structの実体がstorageであれば、初期化時点でmemoryがstorageにコピーされる。
https://medium.com/loom-network/ethereum-solidity-memory-vs-storage-how-to-initialize-an-array-inside-a-struct-184baf6aa2eb

public変数は自動で取得関数(ゲッター)が生成される。

ただし、配列やmappingは要素一つずつのゲッターは生成されるが、全体を取得するゲッターは自動生成されない。
また、structも要素一つずつについて自動生成されるが、配列やmappingが子要素の場合は自動生成されないし、もちろん全体を返すゲッターも自動生成されない。

配列全体,Struct全体を取得するゲッターは自分で作成可能。

配列、Structは関数の返り値にできるので全体をを返すゲッターを自分で作る事はできる。

Mapping全体を取得するゲッターは工夫がいる。

mappingはinternalとprivate関数のみしか返り値として利用できないため、internalとprivateでしかゲッターは作れない(publicなゲッターを作るためには配列やStringになおすなどの工夫が必要)。
https://qiita.com/Qui/items/fcb55b5d9d2394b2891f
https://qiita.com/yuhattor/items/2bd78cafd1bfd3f08b69

stringの連結やlength、splitはこのライブラリを使えばできそう。

https://github.com/Arachnid/solidity-stringutils

addressやuint256をstringに変更するのは以下のサイトが参考になる。

https://ethereum.stackexchange.com/questions/8346/convert-address-to-string

動的配列は基本、関数によって返すことができない。

唯一の例外は、関数の外で定義されたStorage動的配列のみ。
関数内では動的配列を定義することはできないし、memory配列は固定長のみ。
https://qiita.com/_akira19/items/42c7e2bba006decacbd4

ETHを送金するアドレスは、addressではなくて、address payableでなくてはだめ。

addressをaddress payableにキャストするにはpayable(address)としてやればいい。
https://ethereum.stackexchange.com/questions/65693/how-to-cast-address-to-address-payable-in-solidity-0-5-0

RemixでのJavaScript実行サンプル

https://medium.com/remix-ide/running-js-async-await-scripts-in-remix-ide-3115b5dd7687

Remixでのデメリット:

eventをjavascriptで受け取れないっぽい
よくソースコードが消える。
バックアップ機能が動かない

HardHatでWeb3

npm install --save-dev @nomiclabs/hardhat-web3 web3
を実行し、
hardhat.config.jsに require("@nomiclabs/hardhat-web3"); を記入
することで、scriptでweb3が使えるようになる。
https://hardhat.org/guides/create-task.html

HardHatでopenzeppelinのインストール

https://docs.openzeppelin.com/contracts/4.x/

Discussion

全財産イーサリアム全財産イーサリアム

自分用のメモのためのページだったので雑だったんですけど、意外に読まれてるので多少読みやすくしました。

dai-tokyodai-tokyo

誠に有難うございました。とても勉強になりました