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

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

Ethereum

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

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

Plasma 勉強会1回目の参加レポ

最近特にホットな話題となっているPlasmaの勉強会が開かれるということで早速参加してきました! plasma-research.connpass.com 今回はPlasma勉強会の第1回目のレポートをまとめたいと思います。また、参加メンバーのリアルタイムツイートについてもtogette…

uPortでmyAppを作ってみた

Hi-Etherで少し話題に出ていたuPortを実際に触ってみました。 uPort Developer PortaluPortの説明についての説明はこちらのブログが綺麗にまとまってますのでご参照ください。 zoom-blc.com今回はuPort AppManagerを使ってUport Appを自作する手順についてま…

EthereumのTransactionHashの計算方法

EthereumはBitcoinと同様にTransactionHashをTransactionのrawデータから求めることができます。 今回はEthereumのTransactionHashの求め方について調べたことをまとめました。

ganache-cli@beta+web3.eth.subscribeを試してみた

y-nakajo.hatenablog.com 前回の記事の続きになります。 タイトルの通りweb3.eth.subscribeを試してみました。 が、テストのためだけにGethのノードを準備するのはめんどくさいのでtestRPCあらため、ganache-cliでWebSocketサーバ起動できないのかなぁ?と思…

web3.eth.filterとweb3.eth.subscribe

web3.jsは現状2つのバージョンが開発されています。1つはweb3@0.x.x(現行は0.20.5)とweb3@1.0.0です。truffleが利用しているのが0.x.x系で、npm install web3 するとインストールされるのがweb3@1.0.0系です。 0.x.xがstableバージョンであり、1.0.0はまだβ…

ERC-712 ヒューマンリーダブルな型付署名の提案

今回はEthereumに新しく機能を追加する提案であるERC-712を紹介します。 この提案はRPCにすでにあるeth_signをさらに拡張した新しい機能を追加する提案です。μRaidenでも疑似的に実装して利用しています。 github.com

Geth 1.8.1でとりあえず動くTruffleを公開しました

追記 Geth1.8.1に対応したtruffle 4.0.8がすでにリリースされていますのでtruffleを最新版にアップデートしてください。 最新のgo-ethereum 1.8.1でgetTransactionReceiptの挙動が変わっており、それが原因で現状truffle migrate などが正常に動かなくなって…

ERC-20拡張提案でありOpenZeppelinにいち早く導入されたERC-827

今回は番号からわかる通り2018/02現在一番新しい(よね?)ERC-20の拡張提案であるERC-827を紹介します。 github.com

Transactionの消費gasは最大50%offまで!

Hi-Etherのslackで興味深い質問がありました。 storageのデータを削除するときには gasがrefundされるという認識だったのですが、arrayの要素を全削除するときにgasが大量にかかるのはどうしてでしょうか?教えていただきたいです。 確かに、以前の記事でsto…

ERC-20が抱える問題

ERC-20を拡張したToken Standardの提案がいくつか出てきています。これらの提案が新たにされている背景としてはERC-20のToken Standardは2つの問題を抱えているためです。 今回はこの2つの問題について詳しく説明したいと思います。

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

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

MacOSX+Geth1.8.0-unstableでRopstenを同期する

Raiden Networkを試してみようと思い、まずはドキュメントに書いてある通りRopstenで動かすために同期をし始めたのですが一向に進まないどころかさっぱりpeerを見つけることもできなくて四苦八苦してしまいました。 なんとか解決(?)できたので同じ症状で…

ERC-777 新しいToken標準の提案

Ethereumの開発者コミュニティーでは常に新しい提案が発表されています。Token Contractの標準としては現状EIP20が主流ですが、この標準規格も問題がないわけではなく、常にそれらの問題を解決するための新しいToken標準が提案されています。今回は比較的新…

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を持っている人がいな…

Ethereumのstorage使用料金は3種類

Ethereumはstorageにデータを登録する際に、ストレージ使用料がかかります。実はこの使用料はどうやら一定では無いらしく、データをセットする同じfunctionを実行しているのに最初だけ高かったりします。すごく気になったので実際にどういう時にいくらのgas…

estimateGasのすゝめ

Ethereumでスマートコントラクトを実行するとgasを消費します。そのため、スマートコントラクトを実行するために発行するTransactionにgas limitを指定する必要があります。 さて、このgas limitって一体いくつに設定したらいいのでしょうか?Transactionのg…

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

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

EthereumのsendTransaction時のvalidationエラー一覧

truffleを使ってContractをデプロイしようとした時などによく目にするエラーメッセージ insufficient funds for gas * price + value や exceeds block gas limit などのエラーはnodeがtransaction poolに新しくtransactionを追加する際のチェックに通らなか…

ecrecoverでpublic keyが一意に定まる理由

y-nakajo.hatenablog.com 以前の記事でEthereumの署名検証の仕組みについて書きましたが、この記事を書いてる時にecrecover(hash, v, r, s)で署名と元となるhashデータから公開鍵が求まるのが不思議でid:techmedia-thinkに質問したところブログでまとめてく…

μRaidenの概要

RaidenNetworkもテストネットに公開されていたので、RaidenNetworkの勉強のためにまずは簡単な実装であるμRaidenについて調査してみました。 今回はμRaidenについての理解を整理する意味でも記事としてまとめてみます。

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

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

hdwalletのアカウントからkeystore fileを生成するツールを公開しました

EthreumのμRaidenのサンプルを動かそうとしたら、accountのkeystore Json fileが必要になったのですが、もともと持ってるMetaMaskのアカウントを使いたかったのですが、MetaMaskからはkeystoreファイルがダウンロードできなかったのでmnemonicとパスワードを…

Truffleのmigrateでasync/awaitを使う方法

今回はtruffleのmigrate taskの中でasync/awaitを使って非同期処理をする方法についてまとめました。 この記事は truffle v4.0.4時点でのものです。migrate taskの中でasync/awaitを使いたいシチュエーションとしては、例えば、TokenAとUseTokenという2つの…

truffle-hdwallet-providerはmnemonicがundefinedでも使えてしまうので注意

タイトルの通りです。基本的には他のHDWalletから取得したmnemonicをimportすることが多いと思いますが、ちょっとしたミスでやらかした場合、十中八九etherを盗まれてしまうので注意してくださいね。すでにpull requestも投げられてるのですがまだ取り込まれ…

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…

truffle-hdwallet-providerがマルチアカウントに対応

MultiSIg Contractのテストをしたくてtruffle-hdwallet-providerをマルチアカウントに対応しようかと思い、久しぶりにgithubを覗いてみたらすでに対応されていました。github.com ということで早速動作確認してみました。