アルゴリズムとかオーダーとか

仕事で勉強したことなどをまとめてます

Solidity

debug_traceTransactionとprogram counterとsource mapping

y-nakajo.hatenablog.com 今回は上記の以前の記事で触れた、Ethereumのdebug機構について調べたことをまとめていきます。 Ethereumでは任意のtxをdebugするための機能が、またSolidityではbyte codeとソースファイルをmappingするための情報が提供されていま…

sol-trace - truffleのtestでエラー行を表示する

今回はみんなが待ち望んでいたと思われる非常に便利なツールを紹介します。 それがこちら。sol-traceです! github.comReadme.mdを見て分かる通り、truffleのtestに組み込むことでrevertが発生した時に、エラーの対象のソースファイルと行数を表示してくれま…

非中央集権的なPausableの提案

今回はこちらの記事を読んで思いついたSmartContractの紹介記事です。 btcnews.jp今回、BancorはPausableを継承したSmartContractを作成していたことで、BNTに関してはすぐにpaused状態にして流出を防ぐことができました。 しかし、この処置に関しては上記の…

Solidity Assembly入門 ~ 配列について storage/memory ~

今回の記事はSolidity Assembly入門という連載記事の第4回目です。 この連載ではSolidityのコードをコンパイルした時に生成されるopcodeについて解説していきます。 この連載ではSolidityのコードをデバッグするのに必要な知識を得られることを目的としてい…

Solidityとvyperの変換tips

最近は暇があればcasper FFGのSmart ContractをvyperからSolidityに変換しています。 github.com作業をしていくにあたり、vyperのコードからSolidityのコードへ変換する際のtipsが思ったよりも溜まってきたので、忘れないうちに記事にしてまとめておきます。…

Solidity Assembly入門 ~ フリーメモリポインタ ~

今回の記事はSolidity Assembly入門という連載記事の第3回目です。 この連載ではSolidityのコードをコンパイルした時に生成されるopcodeについて解説していきます。 この連載ではSolidityのコードをデバッグするのに必要な知識を得られることを目的としてい…

Solidity Assembly入門 ~ 5つの記憶領域 ~

今回の記事はSolidity Assembly入門という連載記事の第2回目です。 この連載ではSolidityのコードをコンパイルした時に生成されるopcodeについて解説していきます。 この連載ではSolidityのコードをデバッグするのに必要な知識を得られることを目的としてい…

Solidity Assembly入門 ~ Remixデバッガーの使い方 ~

今回の記事はSolidity Assembly入門という連載記事の第1回目です。 この連載ではSolidityのコードをコンパイルした時に生成されるopcodeについて解説していきます。 この連載ではSolidityのコードをデバッグするのに必要な知識を得られることを目的としてい…

EthereumのContract Creationの仕組み

Solidityをコンパイルして生成されたopcodes=SmartContractが、Contract CreationのときにEthereumのStateDBに保存されるまでの仕組みがどうなっているのか興味が湧いたので調べてみました。というわけで、今回の記事はContract Creationの仕組みについてま…

Ethereumを学習するときのロードマップ

自分がEthereumを学習したときの経験を元にゼロからEthereumを勉強するためのロードマップをまとめてみました。 先人たちは大体この流れで学習を進めていったと思います。

ERC20のバグと誤報されたBatchOverFlowを体験してみる

先日セキュリティーアラートが上がり、多くの取引所が一時ERC20準拠トークンの取引を停止したという報道とともに話題になった、BatchOverFlowについて今更な感じですが自分なりにまとめてみます。今回の問題についてはGunosyの@yamarkzさんがいち早くまとめ…

32byte blockを意識してgas代を節約しよう

Ethereumではstorageにデータを格納する場合、32byteごとにgas代がかかります。この32byteの境界を意識することでガス代が節約できます。 という話をたまに聞くのですが、実体験として経験したことがなかったので実際に試してみました。 今回は試してみたテ…

brew install で solidity 0.4.19をインストールする

brew upgrade solidityしても0.4.19が落ちてこなくてなんでだろう?ってずっと思ったら、homeberw用の配布ファイル(になるのかな?)のsolidity.rbに記載してあるバージョン番号を書き換え忘れているのが原因だったようです。 github.comPR出てたのでそちら…

ContractのInterface検出機能の提案ERC-165とERC-820を調べてみた

新しく提案されているERCでは他のERCを利用しているものが多くなってきました。今回はその中でも個人的によく目について気になっていたERC-165とERC-820について調べたことをまとめます。ERC-165とERC-820は基本的にはどちらもStandard Interface Detection…

絶対にtoken喪失の起きないtokenを実装してみた

ERC-223 tokenは画期的な部分もありますが、完全にtokenの喪失を防げるわけでは無いです。 例えば、fallback関数を定義済みのContractに対しては送金可能だし、0x00000000000000000000000000000000000001234に送金したら多分private keyを持っている人がいな…

Solidityで配列の任意のデータを削除できない理由

ethereumコミュニティーで、配列の途中のデータを削除して、全体を詰めたいのですがSolidityでどうやったらいいのですか?っていう質問があったので、いろいろと調べてみました。結論としては、Solidityでは配列の要素を削除できません。理由としてはgas代が…

EthereumでSolidityを使った署名検証のやり方

ブロックチェーンを利用する場合、スケーリング等の問題から何かしらオフチェーンで承認を行い、最後の結果をブロックチェーンに登録する。というものを実装したくなることが多々あります。今回はEthereumでオフチェーンでのやり取りを保証するための署名検…

Solidityのassertとrequireとrevertの違い

Solidityでは引数などの値の妥当性を検証するためにassertとrequire関数が用意されています。また、コードの実行をストップさせるためのrevert()関数もあります。今回はこれらの関数の挙動についてまとめてみました。 assert(condition) assert関数はconditi…

Solidityのテストでカバレッジを計測する

Contractのセキュリティーを担保する上で、テストのカバレッジ率100%を目指すのは結構重要です。今回は、テストのカバレッジ率を出す方法についてまとめます。今回使うツールはsolidity-coverageです。 github.com

実際にhackしながら危険なContract実装を学んでみた

qiita.com こちらの記事に紹介されていたCTF形式(?)なる危険なContractをhackする問題を解いてみました。 後輩の助けを借りながらなんとか全問クリアできました。Contractを実装する上でのセキュリティーのベストプラクティスは 推奨する実装方法 - Ether…

Solidityのassembly tips

Solidityでいろいろトリッキーなことを試す時にassemblyコードを書くのですが、毎回あれってどう書くんだっけ?ってなるので自分がよく使うassemblyコードをまとめておきます。

Revert opcodeの使い方

EthereumのByzantiumからrevert使うとエラーメッセージをよしなにできるらしいですよ?っていうのが内輪で話題になったので実際にどういう風に利用できるのかを調べてみました。byzantiumのリリースノートはこちら。 blog.ethereum.org

SolidityのDocumentを自動生成する

今回はSolidityで書いたContractのドキュメントを自動生成するツールの紹介とその使い方のまとめです。 実業務を考えるとやっぱり、作ったプログラムのAPIリファレンスは自動生成できるようにしておいたほうが何かと便利ですよね。今回利用したツールはこち…

ERC223Tokenを試してみた

とあるEthereumグループでちょっと話題になったERC223Tokenを実際に試してみました。 ERC223Tokenについてはこちらの方がわかりやすく説明されているので参照ください。 qiita.comERC223のリポジトリはこちら。 GitHub - Dexaran/ERC223-token-standard

Eventにつけるindexedの役割

ContractのEventの仕組み - アルゴリズムとかオーダーとかに引き続きContractのEvent関連のお話です。 Eventを定義する時にparameterにindexedというmodifierを付与する事ができます。今回はこのindexedの仕組みについてまとめてみました。

TruffleのtestでEventがWatchingできなくて困った

今回はContractのEventをテストする時の注意点や思いついたtipsなどをまとめました。 結局は非同期で動いていることを意識してなかったのが原因ではあるのですが、node動かしながら試してたことをそのままテストに書いてもうまくいかないといういい例の一つ…

ContractのEventの仕組み

Ethereum Advent Calendar 2017 の 7 日目の記事です。 ContractにEventを定義すると、Contractの状態が変更された時などに必要な人が通知を受け取れるようになります。 しかし、getter系のfunctionにはEventが設定できなかったりします。 今回はこのEventの…

OpenZeppelin(zeppelin-solidity)のtest/helpersを使う方法

更新 この記事の内容は古いため、20180417現在では使えません。最新での導入方法についてはこちらにまとめています。 y-nakajo.hatenablog.com OpenZeppelin(zeppelin-solidity)はEthereumのContract作るなら使わないと損だよ!ってぐらい便利なContractのラ…

拡張・変更可能なContractパターン solidity-proxy

EthereumでContractを作って運用を考えるとやっぱり頭を悩ませるのが、コードの変更が不可能な事。 基本的にContractであまり複雑な事をすべきではないとは思うけど、それでもやっぱりサービスの成長とともにコードのアップデートも必要となる。 libraryやde…

Solidityのstorage,memoryキーワードとは何か?

Solidityのlibraryのメソッドはだいたいこんな形の定義になる。 function (StructHoge storage self, uint _val) {最初の引数にstorageキーワードをつけないとコンパイルエラーになっちゃうから必須のキーワードのようだ。 で、このstorageが何のために必要…