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

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

Ethereum

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 ということで早速動作確認してみました。

EthreumのContractを簡単に操作できるReact Component作りました。

前回の詐欺みたいな記事を詐欺じゃなくするべく、abiとaddressを入れるとRemixみたいにEthereumのContractを操作できるようになるReact Componentを作りましたー。前回と同じくデモページはこちら https://nakajo2011.github.io/react-ethereum-sample/

Revert opcodeの使い方

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

ERC223Tokenを試してみた

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

Ethereumの情報を色々あれするReact Componentを作ってみた

タイトル詐欺です。すいません。実際にはEthereumのaccount addressとbalanceを取得するだけのコンポーネントです。reactの勉強がてら作ってみました。 こちらに公開してます。 https://nakajo2011.github.io/react-ethereum-sample/リポジトリはこちら gith…

Ropstenにつなげた時の exceeds block gas limit エラー

意外に情報が少なくて、解決するのに時間かかったので自分用メモのつもりでブログに残しておきます。 Ropstenのガスリミットは4700000 Ropstenのガスリミットは4700000だそうです。truffle(に限らないのかな?)でgas limitを指定しなかった時のデフォルト…

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の…

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

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

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

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

Solidityの外部ライブラリの呼び出し方いろいろ

Solidityで用意されている外部のcontractのメソッドを呼び出すdelegatecallのtipsみたいなものをまとめてみました。 思いついた使い方は以下の4通り。A. library定義を利用して呼び出す B. 外部Contractのaddressをあらかじめ準備してdelegatecallメソッド…

Libraryを利用したContractをTruffleでデプロイする方法

Libraryを利用したContractをデプロイする時はLibraryのアドレスをリンカーに教えないとContractがデプロイできません。(できても正常に動きません)TruffleでLibraryとContractをlinkしてデプロイする方法はTruffleの公式ドキュメントにさらーっと書いてる…