//tips
7月嶋津さん合宿爆誕なるか。
ジャックドーシーのweb5構想。個人情報の分散化(暗号化)は、集権化組織よりどれほど安全になるのかに注目。一時期、チェーン上での個人信用スコアを作りたくDIDについて調べていたので、うまくいったらいいなと思う。最終的にはオラクルとの接続や管理の問題に行き着いたかと思うので、そこがどう扱われるのかが気になるところ。オラクルの役割を内包するということなのだろうか。
https://docs.google.com/presentation/d/1SaHGyY9TjPg4a0VNLCsfchoVG1yU3ffTDsPRcU99H1E/preview?pru=AAABgXZOy7s*0hI5PK8uoB_CS0HyTxNEWQ&slide=id.g11d24dbeb84_0_0
https://developer.tbd.website/projects/web5/
//smart contract
色々なハッキング被害がでているので防衛策と危ないポイントを確認しておく。
Deploy済みのPudgyPenguinsをお手本にしつつ、他のポイントをチェックしていく。
https://etherscan.io/address/0xbd3531da5cf5857e7cfaa92426877b022e612cf8#code
・selfdestruct(address) functionによる攻撃
https://hackernoon.com/how-to-hack-smart-contracts-self-destruct-and-solidity
an attacker can create a contract with a selfdestruct() function, send ether to it, call selfdestruct(target) and force ether to be sent to a target.
The selfdestruct(address) function removes all bytecode from the contract address and sends all ether stored to the specified address.
先にコントラクトにselfdestructを仕込んでおくと全てのbytecodeを消去して、コントラクト内のethを特定のアドレスに移せるよう。
NFTを購入する際にはcodeのなかにこれがないかは確認しておく。
Bytecodeをなぜ削除する必要があるのかわからなかったので確認。
When we compile the solidity code using the solc compiler, it will translate our code into bytecode, something only the EVM can understand.
EVMは記述されたスマートコントラクトをブロックチェーン上で動かすものと理解している。
Bytecodeは元のコードを16進数で暗号化し、数字に置き換えたものなのでコントラクトのコードを削除するものなののよう。
ちなみにアカウントやtxの“0x”は16進数(hexadecimals)だよという目印。
https://medium.com/@blockchain101/solidity-bytecode-and-opcode-basics-672e9b1a88c2
コンパイルの際にbytecodeと一緒に聞くABIはContract bytecodeとやり取りを行うインターフェースとのこと。
ABI is an interface to interact with EVM bytecode.
if you want to call a function in a smart contract with your JavaScript code, ABI plays a role as an intermediary between your JavaScript code and EVM bytecode to interact with each other.
https://medium.com/@eiki1212/explaining-ethereum-contract-abi-evm-bytecode-6afa6e917c3b
ここからEVMはブロックチェーンとユーザーの間に立ち、コードと機械語のやり取りを、
関数名と返り値のデータ型をJSON formatで表すルール役であるABIと
Bytecodeという16進数の値でやりとりしていることがわかる。
EVMのおかげで特殊なパソコンでなくともスマートコントラクトのやり取りができる。
In Ethereum, Contract ABI is an interface that defines a standard scheme of how to call functions in a smart contract and get data back. Contract ABI is designed for external use to enables application-to-contract and contract-to-contract interaction. For example, if you want to call a smart contract function from your dApp, you call via Contract ABI.
Bytecodeについてはわかった。
selfdestruct(address) functionについての備えを確認。
気になるのはdeploy後のインスタンスに対しての追加設定について。
contract Attack {
EtherGame etherGame;
constructor(EtherGame _etherGame) {
etherGame = EtherGame(_etherGame);
}
function attack() public payable {
address payable addr = payable(address(etherGame));
selfdestruct(addr);
}
}
後からコントラクトの中身に変更はできないと理解しているがインスタンスに対して何かの追加設定を行うことでコントラクトに干渉できるのか。
送金、コントラクトの実行・生成は同じ流れで行えるので、dataにコードさえ埋め込めれば、トランザクションの送付先でコード内容が実行できる。
ここのセキュリティ検査ツールは一通り使えるようになっておいた方が良さそう。
selfdestructを入れざるを得ないわけがあるのではと探ってみると、コントラクトを無効化したい時に使われるとのこと、ただ悪用されるので、代わりに全てのfunctionを元に戻させる内部の状態を変更することでコントラクトを無効化するのがセオリーのよう。
コントラクトを無効化したい時とは、外部からのハッキングで内部バランスの流出が止まらない場合などのことを指し、攻撃者からの不正な引出しをされる前にetherを回収できるようにしておくこと役割を持つselfdestructは最終防衛策という位置付け。これが逆に悪用されてしまうのだから難しいところでもある。
基本的には不特定のアドレスからコントラクトを破棄されては困るので、onlyOwnerを付加して、コントラクトのオーナーからのみ実行できるようにアクセス制限をかける。
https://solidity-jp.readthedocs.io/ja/latest/introduction-to-smart-contracts.html
https://betterprogramming.pub/solidity-what-happens-with-selfdestruct-f337fcaa58a7
https://medium.com/loom-network-japanese/%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%82%B3%E3%83%B3%E3%83%88%E3%83%A9%E3%82%AF%E3%83%88%E3%81%AE%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3-part-2-6ef700df00af
fallback関数の説明。
https://qiita.com/k-keisuke/items/cd2744c7ba085beff16b
Onlyowenerとしなかった理由があったのか。わからぬ。
また、selfdestructが、もし受け取りアドレスがコントラクトであった場合、fallback関数は実行されなくなるため制約条件が飛ばして実行される可能性があるとのこと。これも実行主を制限すれば良さそう。
逆にオーナーアカウントが乗っ取られた場合が厄介か。
意図的に希少なNFTを入手できるようにコントラクト経由で操作可能。あまり希少性組込みには興味ないのでここはスルーで良いか。
https://inspexco.medium.com/how-hackers-can-become-lucky-in-nft-minting-822f48d4b917
https://zenn.dev/razokulover/scraps/cf211e2b8ff9d5
Slitherでの検証を行う方法を模索。