スキップしてメイン コンテンツに移動

truffle zeppelin-solidity を利用して初めてERC20 Tokenを作ってみる。

ERC20とかtokenに関しては概念ははっきりしていたが、
作るのは初めて。
特に問題ないだろうと思って始めたが…。
開発ツールも安定してないし
そもそもEthereum(イーザリアム)って歴史が短かったし
開発した人の開発経験も短いので
毎日変わっていく感じ。
とのことで今書いている情報も明日には
使えないもんになるかもしれないので
そのまま使えるよりは
変わったら何をみるべきのかを教えたいと思います。

まず https://ethereum.org/token からTokenを作成してもいいですが、
テストごとに費用がかかったり、テストなしで本番に反映とか
コードの管理が難しくなるので
比較的によくできているtruffleとzeppelin-solidityを使ってみます。
zeppelinとopenzeppelinはコードとバージョンが異なりますので
一つを決めて使ったほうがいいと思います。
openzeppelinの場合はフォルダを決めて設定しないといけないですが、
zeppelinは決まっているフォルダで勝手に入るので初心者の方なら
zeppelin-solidityをお薦めします。

まずはtruffleのインストールですね。
npm install -g truffle
 これは問題ないのでスキップ。
作業ディレクトリを空っぽにする必要があります。
mkdir giiptoken 
作業フォルダに入って全て操作します。
truffle関連するファイルをダウンロード
truffle init
このコマンドでtruffle関連ファイルが勝手にダウンロードできます。
npm init
これでTokenの情報を入力。勝手に入力しても全然いいので適当に…。
もし以前設定したToken情報を読み取るには
npm init -f
で自動ダウンロードできます。
まず稼働してみようと思ったら
何処のブログでコードをコピーしても
上手く行かないのがほとんどですね。
理由は下に整理します。
なのでまずは稼働してみましょう!
truffle unbox metacoin
metacoinというERC20コインソースが勝手にダウンロードされちゃいました!
これはtruffleのbox機能で
自分で作ったソースをアップロードできちゃうんです。
詳しくは
https://truffleframework.com/boxes
ソースもできちゃったのでまずテストで稼働!
truffle dev
いきなり何らかのテキストで出ちゃいました!
これは開発モードなので
テスト用のWallet(財布)10個とキーなどをもらいました。
これで伝送テストとかできちゃいます!

色々検索してここまで来た方のために…。
他のブログのソースはなぜ上手く行かないかというと
truffleのバージョンとzeppelin-solidityのバージョンによって
ソースの形式とFunctionがかなり変わってくるんです。
今までのソフトウェアの感じで
モジュールアップデート位に考えたらいけません。
パラメタの数と形式などが
全く違うFunctionみたいに変わっちゃうんです!

なのでもしエラーが出たら
一番下のエラーのポイントを見るのが大事です!

function giipTokenCrowdsale(uint256 _startTime, uint256 _endTime, uint256 _rate, uint256 _goal, uint256 _cap, address _wallet) public
    ^ (Relevant source part starts here and spans across multiple lines).
,/Users/lowyshin/Downloads/Projects/gex/contracts/giipTokenCrowdsale.sol:12:5: TypeError: Wrong argument count for modifier invocation: 4 arguments given but expected 3.
    Crowdsale(_startTime, _endTime, _rate, _wallet)
    ^--------------------------------------------------^
Compilation failed. See above.

Crowdsaleというソースを持ってきたのに4つのパラメタではなく3つだって??
じゃ、Crowdsaleが何なのか見てみましょう。

ソースは/node_modules/zeppelin-solidity/contracts/crowdsale/Crowdsale.solにありました!
中身を見ると

Crowdsale()を記述しているところを見ると

/**
* @param _rate Number of token units a buyer gets per wei
* @param _wallet Address where collected funds will be forwarded to
* @param _token Address of the token being sold
*/

と書かれています。
ちなみにブログ主が使っているzeppelin-solidityのバージョンが異なったため入力パラメタも変わったはず。

なので合わせてみました。

Crowdsale(_rate, _wallet, _token)

そうしたらまた新しいエラーが…。

function giipTokenCrowdsale(uint256 _startTime, uint256 _endTime, uint256 _rate, uint256 _goal, uint256 _cap, address _wallet) public
    ^ (Relevant source part starts here and spans across multiple lines).
,/Users/lowyshin/Downloads/Projects/gex/contracts/giipTokenCrowdsale.sol:20:31: DeclarationError: Undeclared identifier. Did you mean "token"?
    Crowdsale(_rate, _wallet, _token)
                              ^----^

Compilation failed. See above.

_tokenという変数の意味がわからんとか…。

じゃ、上のfunctionに入れてみる。

function giipTokenCrowdsale(uint256 _startTime, uint256 _endTime, uint256 _rate,
uint256 _goal, uint256 _cap, address _wallet, address _token) public

Crowdsale(_rate, _wallet, _token)

じゃ、またやり直し


truffle(ropsten)> migrate --reset

私はDevではなくropstenネットワークで試してます。ropstenはEthereumのテストネットの一つで何がいいかはわかりませんが適当に乗っているテストネットから一つ選んだだけです。

 function giipTokenCrowdsale(uint256 _startTime, uint256 _endTime, uint256 _rate, uint256 _goal, uint256 _cap, address _wallet, address _token) public
    ^ (Relevant source part starts here and spans across multiple lines).
,/Users/lowyshin/Downloads/Projects/gex/contracts/giipTokenCrowdsale.sol:20:31: TypeError: Invalid type for argument in modifier invocation. Invalid implicit conversion from address to contract ERC20 requested.
    Crowdsale(_rate, _wallet, _token)
                              ^----^

Compilation failed. See above.

また出た!
Invalid implicit conversion from address to contract ERC20 requested.
と書かれたいるので
探してみたらaddress形式とERC20形式があるけどこれはaddressではなくERC20らしい。
とゆうことで修正。

function giipTokenCrowdsale(uint256 _startTime, uint256 _endTime, uint256 _rate,
uint256 _goal, uint256 _cap, address _wallet, ERC20 _token) public

Crowdsale(_rate, _wallet, _token)

では、
では、

Running migration: 1_initial_migration.js
  Replacing Migrations...
  ... 0x136917c0c492293a82ea5f5c7d7cc1c0753fe1447f15846f4d42906f5ef353ad
  Migrations: 0x668a5e5b4d191df7dbe0e34c128e038d05122cfb
Saving successful migration to network...
  ... 0x6fbf0e3177c759a60fa6df73f6fe9b1aa33fbba25e9a98a5f318dc4dc8fb9e5d
Saving artifacts...
Running migration: 2_deploy_giiptoken.js

Error: Web3ProviderEngine does not support synchronous requests.

まぁ、これは大したエラーではないので飛ばします。
このようにエラーを見てダウンロードしたモジュールとFunctionがソースと一致しているのかをチェックするだけでかなりのエラーは直せます!

頑張ってください!

参考リンク
Ethereum公式トークン作成:https://ethereum.org/token

Xtock Token:https://etherscan.io/address/0x3efe8983a02980710d9d83834baf8782fca702a3#code
Solidityがよく作られていて参考になります。
Advisorと開発チームのLock機能もちゃんと付いていてるので投資家が食い逃げじゃないと判断できるコードです。



コメント

このブログの人気の投稿

コピペができないときチェックすべきこと! :: よく迷うUiPathのコツ

UiPath( https://uipath.com )はMicrosoft社のWWFを改良した製品なのでVisual Studioより初心者向けに使いやすくなっている。 しかし、初心者がそのまま使うにはかなりのハドルがある。 理由は基本開発者向けの開発ツールを無理やり便利に作ってみたとしても開発の概念と考え方がないと結構躓くことが多い。 そのなかで私もよく迷ったりしていることの一つを整理しとく。 基本Activityはすぐコピぺができるので多数のUiPath Studioを開いて開発してたりする。 ここでコピペをしても反応ないときがよくある。 この場合はこれをチェックすること! 1.Sequenceがなく一つのActivityしかないところにはペーストできないのが多い。 例えば、ifの処理ボックスにはSequenceが最初はない。 そのボックスに一つのActivityはペーストできるのに2個目からはなぜか反応ない。 それで分からないまま新しいActivityを追加してたりしたが、 あそこにSequenceを入れたら解決ができるのだ! 2.正常にペーストできるはずのところに反応ない。 この場合はPackageが合わなくペーストが効かないケースが多い。 DESIGN>Manage Packagesをクリックしてコピー元のパッケージにインストールされているのにコピー先にインストールされてないパッケージを探す! パッケージを一々見るのが難しい!と思ったら メモ帳からファイルがあるフォルダにあるproject.jsonファイルを開いてみる! あそこにJSONの形式でインストールされたパッケージが見えるので比較しやすくなる! ちなみにコピペをすると変数の宣言が大変だと思うが、 そこでもコツがあるのだ! 変数の宣言はなるべく細かくしてSequence単位で管理できるようにする。 全てに影響がある変数はしょうがないから一番広く宣言するけど。 初心者向けの説明だと、 Variablesというところをクリックして変数を開いたらScopeという範囲が見える! 大体Sequenceボックスの名前を変えてないのでSequenceがすらりと表示されてるはずが、Sequenceボックスの名前を付けてたら見やすくなる。 あ...

英語をより楽に勉強できる方法

英語ができなくて良い機会が失われた経験があるでしょう。 GoogleさんもMicrosoftさんも英語で面接をしてます。 私がエンジニアですが技術より言語の学びが優先だと思います。 知り合いの中で技術は低いが英語が上手い人が私より良い道を歩いてます。 それは会話ができなければ技術も通じないとのことでしょう。 それで色々お試ししましたところ 情報を公開しようとしてます! まず、 Khan Academy( https://www.khanacademy.org/ )に入会! これはSalman Khanという人が自分の親戚に数学を教えるために試したやり方が色んな人が参加してグーグルさんとマイクロソフトさんが投資をした 完全無料教育サービス です。 しかし、これは英語でしか話してないので初心者の方には無理があるでしょう。 それでも、この記事をお読みになられた方は基本的な文法は学んだ方だと考えときます。 そして TEDアプリ( https://www.ted.com/ ) をダウンロード。 日本語の字幕がある映像の中で自分の好みの映像を選んでください。 有名なスピーカが話したことが多いので話し方など良い勉強になります。 次は MeetUp( https://www.meetup.com/ja-JP/ ) でしょ。 英会話グループを探して加入。 自分のレベルに合わせて参加してら良い友達もできるし勉強にもなります。 電車で単語ばっかり暗記している方が見つかりますが、 それも悪くは無いけど効率はどうかと思います。 やはり勉強は楽しく!自分の好みでは無いと! 映画も良いしドラマも良いです。それともゲームとか旅行もあるでしょう。 自分の趣味から始めるのが大切だと思います。 もしドロンが趣味だとしたらわざわざググってみる。 そして英語のページから探すんです。 最初は無理があるけど好きなイメージなどが見つかったら読みたいでしょ? そのページをスクリーンショットかプリントでも良いです。 その文書の単語を探して読んでみるのが第一歩ですね。 最初は辛いでしょ。 私の場合には最初には単語10個だけ探しました。 1日10個だけ辞書から探して残りは捨てる。 さらに10個をその場で暗記してそれで終わり。 翌日3~4個し...

面倒くさいORACLEの文字化け状況

ORACLEはそもそもUTF-8をサポートしてほかの言語はサポートはしているって書いてますが親切ではないようです。 現在サーバー側は昔からUS7ASCIIに設定して日本語を入れてしまい、データは7ビットASCIIモードで読み取りながら日本語のコートがOS側とクライアント側で変換しない必要があります。 クライアント側で文字化けの解決にはNLS_LANGの設定が効くクライアントが必要ですが、一部の有料クライアントにはサポートするようです。 接続構造は参考に https://www.oracle.com/technetwork/jp/content/charcterset-250314-ja.pdf の19スライドのように クライアントからNLS_LANGをUS7ASCIIに設定しても その設定した言語にもらったUTF-8のデータをクライアントが変換すると NLS_LANGを設定しても意味がないようです。 ORACLE SQL Developerがこの様です。 ODBCと直接接続は必ずUTF-8に変換してしまうのでUS7ASCIIになっているDBからはクライアントをいくら変換しても文字化けのままです。 必ずOCI接続を通じてクライアント側から読み取らないとUS7ASCIIは勝手に変換されますね。 この全ての条件が満たした無料クライアントはA5mk2の2.9.1バージョンだけですね。 A5MK2 ver.2.9.1 : https://a5m2.mmatsubara.com/download/a5m2_2.9.1_x64.zip 2.9.1 バージョンでサーバーを設定する場合Uicode変換を強制に無視するオプションがあります。 多分このバージョンの時点ではUTF-8をメインにして設計したDBが少なかったから文字化け対応のためできたオプションでしょう。 しかし、A5mk2の新しいバージョンにもまた結果の変換をしないオプションがなくなって文字化けしてしまいます。開発者はもうUTF-8ではないDBはないと思ってるでしょう。まだまだ残ってますよ~。 クライアント側からの変換などに参考になればと思います! まだ直接お仕事になさってますか? もう遅いです!ソフトウェアロボットにお仕事を任せてどの位自分の作業分量が減ってるかをご確認ください! https://talklowy-jp.b...