ピヨピヨ日記

毎日ピヨピヨしています

Ethereum の SmartContract でアンロックできて遊べる BLE ラジコン

Ethereum の SmartContract を使って車をアンロックできるようにしてみようと思ったんだけど、お金が無くて車を買うことができなかったので、まずラジコンを作ってそのラジコンのアンロックを SmartContract でできるようにしてみた。ラジコンはせっかくなので、Raspberry Pi ベースにして iPhone から BLE で操作できるようにした。

 

f:id:plygnd:20180218001006j:plain

 


Ethereum の SmartContract でアンロックできて遊べる BLE ラジコン

 

このラジコンには Raspberry Pi 3 が乗っかっていて、iPhone と Bluetooth で接続・コントロールができる。Raspberry Pi 側のコードは Node.js を使って書いた。bleno というライブラリを使用すると BLE の Peripheral としてふるまうコードを驚くほど簡単に書ける。iOS 側は普通に CoreBluetooth を使っただけ。

 

車体はすべてタミヤ製。ギヤ・モータは シングルギヤボックス、車体は ユニバーサルプレート、タイヤは スポーツタイヤ と ボールキャスター を使用。モータの制御は L298N モータドライバモジュールを使用。

 

あとは、ラジコンのロック・アンロックを管理する Ethereum の SmartContract を書いて、Raspberry Pi 側の Node.js のコードで SmartContract の状態変数の値をみてロック状態かアンロック状態を判断するようにした。ここでは Web3.js, infura.io を使用して外部のノードをみにいくようにしているけど、外部のノードは嘘をつく可能性があるので、ほんとは ローカルにノードがあったほうがいいような気がする。

 

--- 

 

今日はせっかくの遊びなので、Swift でいろいろクソコードを書くのに挑戦できて面白かった。日本語や絵文字をメソッド名や変数名に使えてとてもたのしい。以下、ラジコンを動かすために iOS から Raspberry Pi に Bluetooth でコマンドを送るためのコード。ひどい。

 

f:id:plygnd:20180218003957p:plain

 

---

 

それにしても、Node.js も iOS も Raspberry Pi もなんだかいろいろ便利ですごいなあ。偉い人たちがライブラリやら環境やらを揃えてくれてるおかげでこのおもちゃを全部作るのにかかった時間は正味 3 時間くらい。ぼくは役に立たないものを作るのは大好きだけど、たまには他の人の役に立つものをつくりたいなあ。

 

ダンボールとiPadとチビ

ダンボールと Nintendo Switch を組み合わせて遊ぶことのできる Nintendo Labo のニュースをみて、iPad とダンボールを使ってアーケードゲーム機を作ったのを思い出した。

 

vimeo.com

 

当時は iPad が世に出たばかりで、米国の Gizmodo とか engadget とかにも取り上げられた。久しぶりにそれらの記事を読んだら、次のようにチビのことが書かれていて嬉しくなった。

 

You can see a full video of the device running (along with some cute puppies)

その機器が動いている様子をビデオでみることができます(可愛い子犬たちと共に

 

f:id:plygnd:20180121131028p:plain

動画を撮影している母を不思議そうにみているチビ


チビの隣でもっといろいろなものを作りたかったなあ。

 

さようなら、チビ。

2018年1月15日、本当に可愛かったチビが亡くなってしまった。チビのおかげで大変なときも優しい気持ちになることができたし、自分より大切な存在がいるということは本当に幸せなことでした。いつも一緒にいてくれてありがとう。

 

f:id:plygnd:20180118195706j:plain

生まれたばかりのチビ(2004年)

 

f:id:plygnd:20180118195829j:plain

赤ちゃんのとき。とてもかわいい。

 

f:id:plygnd:20180118201337j:plain

海に走りに行くのが大好きだったチビ

 

f:id:plygnd:20180118201506g:plain

元気いっぱい!

 

f:id:plygnd:20180118202327j:plain

散歩をせがんで、自分でリードをくわえるチビ

 

f:id:plygnd:20180118201638j:plain

獲物(流木)を捉えるときのジャンプ力

 

f:id:plygnd:20180118201730j:plain

チビはほんとに元気だった

 

f:id:plygnd:20180118202733j:plain

流木をくわえてダッシュするチビ!

 

f:id:plygnd:20180118212626j:plain

弟と狩りごっこをするチビ

 

f:id:plygnd:20180118215059j:plain

狩りごっこが好きなフレンズ

 

f:id:plygnd:20180118202431j:plain

穴掘りも大好き

 

f:id:plygnd:20180118201901g:plain

おうちに帰ると発狂するほど喜んでくれた

 

f:id:plygnd:20180118202036g:plain

モフモフ

 

f:id:plygnd:20180118202126j:plain

甘えているときのチビ

 

f:id:plygnd:20180118202205j:plain

うんこをするときも一緒

 

f:id:plygnd:20180118202529j:plain

ねむいときのチビ

 

f:id:plygnd:20180118202557j:plain

クッションにあたまをつっこんでる

 

f:id:plygnd:20180118223904j:plain

だらチビ

 

f:id:plygnd:20180118224211g:plain

くびをかしげるチビがかわいかった。

 

f:id:plygnd:20180118224059j:plain

いつもおふとんで一緒にねていた


本当にありがとう。おやすみなさい。

 

『ALLIANCE アライアンス』

『ALLIANCE アライアンス』をおすすめしていただいて読んでいる。この本で提唱されている雇用形態・働き方ができるといいな。具体的な形で何かできないか頭を使って考えたい。

 

 

 

ALLIANCE アライアンス―――人と企業が信頼で結ばれる新しい雇用

ALLIANCE アライアンス―――人と企業が信頼で結ばれる新しい雇用

  • 作者: リード・ホフマン;ベン・カスノーカ;クリス・イェ,篠田真貴子;倉田幸信
  • 出版社/メーカー: ダイヤモンド社
  • 発売日: 2015/07/10
  • メディア: 単行本
  • この商品を含むブログ (2件) を見る
 

 

たぶん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

 

おもしろい!