ピヨピヨ日記

毎日ピヨピヨしています

たぶん10分くらいでできるオリジナル暗号通貨の作り方

たぶん10分くらいで簡単にできるオリジナル暗号通貨の作り方。たぶん。

暗号通貨の作り方の記事はいろんなところで書かれているけど、ハードルを下げるために、ブラウザだけで オリジナル暗号通貨を作る方法をメモしておきます。

今回作るのは、暗号通貨といっても、とても簡単な Ethereum の ERC20 準拠のスマートコントラクトを使った暗号通貨(トークン)です。簡単だけど、よくある ERC20 ベースの暗号通貨と同様に MyEtherWallet とかで送ったり受け取ったりすることができます。(そもそもスマートコントラクトって何?っていう方には、『スマートコントラクト本格入門―FinTechとブロックチェーンが作り出す近未来がわかる』という本がおすすめ。)

あと、よくあるサンプルだとトークンを購入できる手段が用意されていないので、今回はいつでもだれでもトークンを購入できる機能をトークン自体に追加してみました。(一般的には、トークンそのものとは別のプログラム - クラウドセール用のプログラム等 - がトークンを一定期間購入できる機能を持っている場合が多いです。ほんとはそのほうがいいと思う。)

なお、この記事で紹介しているのは、ぼくが書いたてきとうプログラムおよびてきとうデプロイ方法であり、何かあっても一切の責任を持てないので、あくまで遊ぶときの参考程度にしてみてください。

 

今回つくる暗号通貨(トークン)の仕様

今回つくる暗号通貨(トークン)の仕様はつぎのとおりとします。

  • ERC20 標準に準拠。この標準に準拠しておくと、多くの ICO で発行される ERC20 トークンと同様に、MyEtherWallet 等の ERC20 をサポートしている Wallet でやりとりができる。
  • 最大発行数を設けることができる。
  • Ether で購入することができる。
  • Ether で購入するときのレートを決めることができる。

 

必要なもの

それぞれの詳細については公式サイトをみてください。

 

準備

MetaMask をインストール、アカウントを作って、Ether を MetaMask に送っておきます。オリジナル暗号通貨のデプロイ時に Ether が必要になるためです。0.1 Ether くらいあれば足りるかと思います。Ether を持っていない方は、暗号通貨取引所で Ether を入手してください。

 

Remix を開いてスマートコントラクトのコードをコピペ

まず、開発環境にコードをコピペします。実はコードはすでに出来上がっていて、スマートコントラクトの作成(デプロイ)時に、引数としてトークンの名称やその他設定を渡すだけでトークンを作ることができます。

Remix はブラウザ上で動く Ethereum の開発環境です。Solidity という JavaScript ライクな言語を使用してスマートコントラクトの開発・デプロイができます。何もダウンロードしなくても https://remix.ethereum.org にアクセスすれば使えます。

Solidity や Ethereum のスマートコントラクト開発入門には、『はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門』という本がおすすめです。(ただ、Kindle 版が固定レイアウトなので、ソフトカバー版(紙の書籍)を買った方がいいと思います。)

 

スマートコントラクトのコードのコピペ手順

  • https://remix.ethereum.org にアクセスしたら、画面左上の + ボタンを押して、新規ファイルを作成します。
  • ファイル名を入力する画面が出てくるので、 EasyToken.sol とでもしておきます。OK を押すとファイルが作成されます。
  • 作成したファイルに次のコードをコピペします。

 

gist.github.com

 

コードの解説

ほとんどの説明はコメントで書いてあるので、読んでみてください。

このコードは OpenZeppelin という Ethereum のスマートコントラクト開発を簡単にしてくれる素敵なライブラリを使っているため、とても短いです。内容を理解するためには、OpenZeppelin の github リポジトリ を読み込むといいと思います。

とりあえず、このコードで大事なところは、コンストラクタの部分です。デプロイ時に渡す引数によって、今回つくる暗号通貨の詳細を決めることになります。

デプロイ時にコンストラクタに渡す引数は次のとおりです。

  • トークンの初期発行数
  • トークンの最大発行数
  • トークンの名称
  • トークンのシンボル
  • トークンとEther のレート
  • 新規トークン発行時に Ether を受け取るアドレス

このコードでは、通常の ERC20 トークンがもつ機能に加えて、Ether をトークンのスマートコントラクトに送付すると、送付された Ether とレートによって計算された数のトークンが新規に発行され、Ether を送付したアカウントが、新たに発行されたのトークンを取得できるようにしています。それを実現するメソッドが、issueToken メソッドです。また、暗号通貨が際限なく発行できちゃうのもどうかと思うので、一応最大発行数を設けられるようにしています。

たとえば、1 Ether を送ると、新規に 300 トークン発行できるようにレートを設定した場合、0.01 Ether を送ると、Ether を送付したアカウントに 3 トークンが付与されます。

あ、書いてておもったけど、issueToken メソッドの実装では、トークン送受信のイベントを発火させるために、tokenを付与する際にほんとは transfer メソッドを使用したほうがいいかも。Etherscan上でTokenの所有者数を簡単にみることができるので。まぁ、でも、そもそも token を issue するコントラクトは別にしたほうがいいか。

ERC20 のドキュメントに、つぎのように記載があったので、token を issue する際に、 Trasnser event を実行するように修正しました。また、デプロイ時に最初に発行するぶんのtokenについても、Trasnser event を実行するように修正しました。

Note Transfers of 0 values MUST be treated as normal transfers and fire the Transfer event.

EIPs/eip-20-token-standard.md at master · ethereum/EIPs · GitHub

 

Remix と MetaMask を使ってデプロイ 

  • Remix 画面右側パネルの Run を選択し、Environment が Injected Web3、Account が MetaMask で使用中のアカウントであることを確認します。 

gyazo.com

  • 赤い Create ボタンの左側の入力フィールドに、デプロイ時の引数を入力します。
  • ここで入力する引数によって、トークンの詳細が決まります。

例えば、僕が実際につくった PiyoPiyoCoin では次のとおり設定しました。(アドレスだけマスクしています。)

  • トークンの初期発行数: 5000兆
  • トークンの最大発行数: 5000京
  • トークンの名称: PiyoPiyoCoin
  • トークンのシンボル: PIYOPIYO
  • トークンとEther のレート: 5000兆(1ETHあたり5000兆PIYOPIYO)
  • 新規トークン発行時に Ether を受け取るアドレス: 0x*****

この設定のとおりに引数を入力する場合は、カンマ区切りで次のように入力します。

"5000000000000000", "50000000000000000000", "PiyoPiyoCoin", "PIYOPIYO", "5000000000000000", "0x*****"

  • 上記を参考に引数を入力したら、Create ボタンを押します。
  • すると、MetaMask のポップアップが表示されるので、Gas Limit, Gas Price、トータルのトランザクション手数料を確認して問題なければ SUBMIT を押します。
  • Gas Limit は自動で計算されますが、おおよそ 2,000,000 に設定しておけば問題ないと思います。Gas Price は、Ethereum ネットワークの需要が高まっていることにより高騰しているので、40 GWEI くらいにはしておいたほうがいいと思います。

gyazo.com

 

 

トークンのコントラクトアドレスを確認

しばらくして、トランザクションが成功すると、Etherscan 上でコントラクトが作成されたことがわかります。

次のスクリーンショットの、[Contract 0x**** Created] と記載されている箇所の、0x**** がトークンのコントラクトアドレスです。

PiyoPiyoCoin の場合は、0x8fBbF6223d0dB08AbC1f5EfFF65d08E29F1D7BC1 がコントラクトアドレスです。

 

f:id:plygnd:20180114142029p:plain

 

 

オリジナル暗号通貨を取得

デプロイを実行したアカウントには、デプロイ時に指定した初期発行数ぶんのトークンが付与されていますが、そのほかのアカウントは、上で確認したコントラクトアドレスに Ether を送付することで、レートに応じた数のトークンを取得することができます。 

取得したトークンの残高は、ERC20 をサポートしているウォレットで確認することができます。

Ether を送付してオリジナル暗号通貨を取得する方法の詳細は、前回のエントリに書いてあります。

 

diary.piyopiyo.jp

 

MetaMask での確認方法

MetaMask の TOKENS タブ => ADD TOKEN ボタンを押下、Token Contract Address という項目にトークンのコントラクトアドレスを入力すると、MetaMask でトークンの残高を知ることができます。

 

f:id:plygnd:20180114142720p:plain

 

MyEtherWallet での確認方法

View Wallet Info ページ右下の Token Balances で Add Custom Token というボタンを押して、Token Contract Address にトークンのコントラクトアドレス、Token Symbol にトークンのシンボル、Decimals に 18 と入力するとトークンの残高を知ることができます。

f:id:plygnd:20180114142915p:plain

 

おわりに 

以上、書きなぐってしまいましたが、いつかもしかしたら誰かの役に立てばなあと思っています。

あと、やはり実際に手を動かして本番環境で作業をしてみると気づきが多いので、ちょっとつらいけどもう少しサラリーマンとして日本円マイニングを頑張ってこつこつ日本円を Ether に変換して、もっともっとたくさん実験したいです。

オリジナル暗号通貨(トークン)を作ること自体は非常に簡単なので、それを使った何か面白いサービスをみんなが考えたり手を動かして実験するきっかけになるといいな。

 

オリジナル暗号通貨 PiyoPiyoCoin を作って5000兆ピヨピヨを入手した

いろいろと実験したかったので、とりあえず久しぶりにオリジナル暗号通貨(ERC20トークン)を作ってみた。

今回は、次の要件を満たすように作った。

  • ERC20 標準 に準拠。
  • 最大発行数(tokenCap)を設けることができる。
  • Ether で購入することができる。
  • Ether で購入するときのレートを決めることができる。

また、前回は Truffle を使用してデプロイしたけど、今回は Remix と MetaMask をつかってみた。個人的には Truffle のほうが好きだけど、多くのひとにとっては Remix + MetaMask の組み合わせのほうがデプロイしやすいと思ったので。あとで、つくる手順をかんたんにメモしておきたい。

 

とりあえず、コードはここ

 

そんなこんなで、今回作った PiyoPiyoCoin の内容はつぎのような感じです。

  • トークン名: PiyoPiyoCoin
  • トークンシンボル: PIYOPIYO
  • 最大発行数: 50000000000000000000 PIYOPIYO
  • レート: 5000兆 PIYOPIYO/ETH(1 Ether で 5000兆 PIYOPIYO)

とりあえず、初期発行数として、5000兆ピヨピヨを発行して入手!やったね!

 

f:id:plygnd:20180114143447p:plain

 

(だけど、このコントラクトをデプロイするのに、トランザクション手数料としておよそ $100 ぶんの Ether を使ってしまった...手数料高い><)

 

MetaMask を使っている場合は、次のボタンを押すと入手できるので、余裕のある方は試しに入手してみてください。

 

 

PiyoPiyoCoin 入手後に、MetaMask の TOKENS タブ => ADD TOKEN にいって、Token Contract Address という項目に PiyoPiyoCoin のコントラクトアドレス(0x8fBbF6223d0dB08AbC1f5EfFF65d08E29F1D7BC1)を入力すると、MetaMask で PiyoPiyoCoin の残高を知ることができます。

 

f:id:plygnd:20180114142720p:plain
 

MyEtherWallet から PiyoPiyoCoin を入手するのも、単純に 0x8fBbF6223d0dB08AbC1f5EfFF65d08E29F1D7BC1 に Ether を送付すればok。

MyEtherWallet では、Token Balances で Add Custom Token というボタンを押して、Token Contract Address に 0x8fBbF6223d0dB08AbC1f5EfFF65d08E29F1D7BC1、Token Symbol に PIYOPIYO、Decimals に 18 と入力すると PiyoPiyoCoin の残高を知ることができます。

f:id:plygnd:20180114142915p:plain

 

また、Etherscan を使用すると、PiyoPiyoCoin のトランザクション履歴や保有率を確認できたりします。

https://etherscan.io/token/0x8fbbf6223d0db08abc1f5efff65d08e29f1d7bc1#balances

 

おもしろい!

非中央集権型 DOOH(屋外デジタル広告)

言ったもの勝ちのタイトルです。

 

昨日つくったなんちゃって非中央集権型広告配信システムを使って、屋外デジタル広告デバイス(という名前がついたRasberry Pi)に広告を配信してみました。(お金がつらいのでテストネットで広告配信)

 

f:id:plygnd:20180111112715j:plain

 

これを駅前とかにおけば立派なDOOH!

Ethereum で非中央集権型広告配信システムをつくってみた

ちょっとおおげさなタイトルですが、Ethereum を使って広告配信システムっぽいものをつくれないかと思い、実験として酔った勢いで作ってみました。下に表示されているやつは、Ethereum のブロックチェーン上に記録された情報をもとに JavaScript で広告を表示しています。(広告配信というとそれっぽく聞こえるのですが、Ethereum に広告配信時間と広告テキスト・ URLが記録してあるだけです。)

 

 

 

この広告を表示する JavaScript 自体はサーバに置いてありますが、いつ・どのような広告を表示するか?といった情報はブロックチェーン上に乗っかっています。なので、クライアントが Ethereum のブロックチェーン上の情報を読みにいくことができれば、広告用のサーバに広告をリクエストすることなく広告を配信することができます。なお、広告枠が購入されていない状態(いわゆる空き枠)だと、空枠って表示されるようにしています。広告枠は空いていれば誰でも購入可能です。

 

広告枠はこちらから購入できます: https://piyolab.github.io/DAD/

(なんか MetaMask の挙動が TestNet - Ropsten と異なっていて、「広告を出稿」ボタンを押してからかなり時間がかかってMetaMaskのポップアップが出る。あと、Gas Limit は入力する文字列の長さによっては1000000とかかなり多めにする必要がある)

 

今回作ったものはかなり適当なものですが、すっごく頑張ればそれなりのものは作れるかも、という感触がありました。ただ、広告にブロックチェーンを使う意義は今のところあんまりわからなくて、広告ネットワーク運用のコスト削減によって手数料が削減できて、広告費を直接暗号通貨で支払うことができるくらいかなあ、と思っています。やっぱり、なんでもかんでもブロックチェーンや暗号通貨と組み合わせればいいってものじゃないですね。

 

あと、Etehreum のトランザクションがたくさん発生しちゃうとつらい感じになるので、インプレッション課金とかそういうのは(少なくとも Ethereum では)ちょっと難しそうだなあと思いました。今回は、インプレッション課金で実装するのは難しそうだったので、期間保証で配信することにしました。オンライン広告には向いていないけど、DOOH(屋外デジタル広告)とかに使うと面白そうだなあ、とおもったり。渋谷の巨大屋外ディスプレイの広告枠が暗号通貨で買える未来がくるのもそう遠くない(かも)。

 

それにしても Ether の高騰がつらい。超シンプルなスマートコントラクトをデプロイするのに、$37.84 もかかってしまいました。手数料もかなり高くなってしまっていていまのところ実用するのはかなり難しいかんじ。貴族じゃないと Ethereum で遊ぶことはできないのか...

 

体重計のAPIから体重を取得

とりあえず、体重計で測った体重を API 経由で取得する方法を勉強した
体重計上の表示では数字丸められて 60kg だったけど、API では小数点以下3桁までの数字が取れるみたい。
つい ruby で書いちゃったけど、どうかんがえても nodejs で書いたほうがよさそうだよなあ

 

f:id:plygnd:20180103021909p:plain

 

コードとしてはまったく賢いことをやっていなくて、単純に URL 叩いて、帰ってきたJson をパースして情報を取っているだけ。

 

APIドキュメントはこちら:

https://developer.health.nokia.com/api/doc#api-Measure-get_measure

 

最初ライブラリを使おうとおもったけど、なんか使い方を調べるのがめんどくさくなって URL を直接叩くことにした。