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

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

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

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

結論としては、Geth 1.8.0-unstableにバージョンアップしたら同期が始まりました。1.7.3使ってる人はもう少ないのかな?
ということで、Macbrewを使ったGeth 1.8.0環境への変更方法をまとめます。
以下はすでにethereumのrepositoryをbrew tap済みでgoもインストール済みの前提で進めます。

1.古いGethを削除

brew uninstall --force ethereum

2.develop版のGeth 1.8.0をインストール

release版はまだないのでdevelop版を指定することで1.8.0をインストールできます。

brew install ethereum --devel

3.昔のデータが残ってるかもしれないので削除

geth --testnet removedb

4. Gethを起動

geth --testnet --fast --cache 1024 console

これですぐに同期が始まりました。light client modeで使いたいのですがlight指定だとなかなか同期が始まらなくて断念しました。うーん残念。。

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

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

今回は比較的新しい提案であるERC-777について調べてみたことをまとめました。

github.com

続きを読む

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

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

ERC-165とERC-820は基本的にはどちらもStandard Interface Detection、標準インターフェース検出の提案です。ContractがEIPで定義されたどのインターフェースを実装しているかを定義する方法を提案しています。
ERC-165はNon-fungible Token Standardの提案であるERC-721で利用さており、またERC-820は多分一番新しい?拡張Tokenを提案しているERC-777で利用されています。
github.com
github.com

続きを読む

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

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

ということで絶対にtokenが失われないtokenを実装してみました。
ソースコードは以下を参照ください。
github.com

コンセプトは、そもそも送金したらすぐに指定されたaddressにtokenを送ってしまうから失われてしまうわけで、じゃあ、transferの時に一旦送金予定な状態にして、receiverが明示的にreceiveを呼び出した時に初めてreceiver addressにtokenを移動するようにすれば安全なんじゃ無いの?ってことで作ってみました。

コンセプトを形にしただけなのでいろいろとあれですが、何かの参考になれば。

Ethereumのstorage使用料金は3種類

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

すごく気になったので実際にどういう時にいくらのgas代がかかるのか調べてみました。

続きを読む

estimateGasのすゝめ

Ethereumでスマートコントラクトを実行するとgasを消費します。そのため、スマートコントラクトを実行するために発行するTransactionにgas limitを指定する必要があります。
さて、このgas limitって一体いくつに設定したらいいのでしょうか?Transactionのgas limitの指定にはいろいろな条件があるため勝手な値を指定したところでうまく動かない場合もあります。
今回はgas limitを設定する時に考慮すべき条件と、適切なgas量を計算してくれるestimateGasの使い方についてまとめてみました。

続きを読む

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

ethereumコミュニティーで、配列の途中のデータを削除して、全体を詰めたいのですがSolidityでどうやったらいいのですか?っていう質問があったので、いろいろと調べてみました。

結論としては、Solidityでは配列の要素を削除できません。

理由としてはgas代が予想できないほど膨れ上がる可能性があってなかなか難しいっていうのがわかりました。
ただ、gas代を無視すれば自分でそうした処理を書くことはできます。以降では実際に実装しながら理解したSolidityで配列の要素の削除が難しい理由を説明していきます。
なお、本記事で公開しているコードはいろいろな問題を含んでいますので実案件では利用しないでください。

続きを読む