Truffleのインストール
- Truffleとは、ブロックチェーンのためのテスト・フレームワークとアセットパイプラインを提供する開発環境です。
12npm install -g truffle
Truffleプロジェクトの初期化
1. 新しいフォルダーを開いて npm プロジェクトを初期化する
- コマンドの実行:
12mkdir token12npm init
2. Openzeppelin-Solidityをインストール
これらのライブラリはトークンのメインライブラリだけでなく、オーナーシップのためのライブラリ、安全なmath、その他多くの関数をインストールします。これらのライブラリは、高度なセキュリティー基準を達成しているため、このライブラリに依存するコントラクトを正しく使用すれば、ハッキングの影響を受けにくくなっています。
- フォルダーの中で, libraries from OpenZeppelinをインポートします。
12npm install openzeppelin-solidity@1.12.0
3. truffle-hdwallet-providerをインストール
- RSKに接続するために、Truffleの設定を変更します。ここでは、任意のネットワークに接続できるプロバイダを使用しますが、アカウントのロックはローカルで解除します。truffle-hdwallet-provider (Node >= 7.6)を使用します。
12npm install truffle-hdwallet-provider
4. Truffleプロジェクトを実行
- コマンドの実行
12truffle init - ターミナルに次のような結果が表示されれば, このステップは成功です:
12345678910✔ Preparing to download✔ Downloading✔ Cleaning up temporary files✔ Setting up boxUnbox successful. Sweet!Commands:Compile: truffle compileMigrate: truffle migrateTest contracts: truffle test次のようなファイルストラクチャを確認することができます:
├── contracts
│ └── Migrations.sol
├── migrations
│ └── 1_initial_migration.js
├── test
└── truffle-config.js
エディター例:
- ./contracts: すべてのスマートコントラクトはこのフォルダーに保存されます。
- ./migrations: デプロイスクリプトはこのフォルダーに保存されます。
- ./test: テストスクリプトはこのフォルダーに保存されます。
- ./truffle-config: Truffleの設定ファイルです。ここでインタラクトするネットワークを設定できます。
5. RSKアカウントの生成
RSKウォレットを生成するにはこちらのウェブアプリケーションを使ってください: https://iancoleman.io/bip39/. これは本当のウォレットとして使用されるものではありません; (秘密鍵を生成する安全な方法ではありません)。基本知識を学ぶためだけに使われます。
- 5.1 ランダムなニーモニックを生成します:
5.1.1 「Generate a random mnemonic」のボックスで「12」を選択、生成します。
5.1.2 「Generate」をクリックします。
5.1.3 「BIP39 Mnemonic」のボックスに結果が表示されます。下記の画像のような12のランダムな単語が表示されます:
- 5.2 アカウントを生成します:
5.2.1 Truffleプロジェクトのtruffle-config.js ファイルを開き、次のコードを上書きします:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
var HDWalletProvider = requir('truffle-hdwallet-provider') var mnemonic = 'rocket fault regular ... YOURMNEMONIC';// 12 key words we generated before var publicNode = 'https:/public-node.testnet.rsk.co:443'; module.exports = { networks: { testnet: { provider: () => new HDWalletProvider(mnemonic, publicNode), network_id: '*', gas: 2500000, gasPrice: 183000 } }, compilers : { solc: { version: "0.5.0", evmVersion: "byzantium" } } } |
5.2.2 接続を確認するためにTruffleコンソールを開いてください:
1 2 3 4 5 |
```java truffle console --network testnet truffle(testnet)> ``` |
ここでは、TruffleにRSKパブリックテストノードての接続を命令し、先ほど生成されたアカウントの制御を行っています。
5.2.3 RSKアドレスを取得するには, コンソールに次のコードを入力し、ニーモニックでアンロックされたアドレスを確認します:
1 2 3 4 5 |
truffle(testnet)> var account = Object.key(web3.currentProvider.wallets)[0] undefined truffle(testnet)> account '0xf08f6c2eac2183dfc0a5910c58c186496f32498d' |
最後の行の文字列がアドレスです。
- 5.3 このネットワークで資産を得る方法
RSK テストネットは無料のネットワークです。このネットワークを使って資産を取得するために、ファセット(faucet)を利用しましょう。ファセットとは、自分のアドレスを入力すれば、テスト目的のテストネット資産が自動的に送信されるサイトです。RSKファセットを使ってみましょう: https://faucet.testnet.rsk.co
5.3.1 先ほど取得したアドレスを入力します。
5.3.2 表示されたコードを入力します。
5.3.3 フォームを提出します。
5.3.4 成功ページが表示されます。
5.3.5 コンソールで残高をチェックしてみましょう。
Truffleコンソールでこのコマンドを実行します:
1 2 |
truffle(testnet)> web3.eth.getBalance(account,(err, res) => console.log(res)) |
このターミナルで表示されている行が取得した資産額です:
1 2 |
'999969677083000' |
6. トークンの作成方法
- 6.1 コントラクトに関するコードを書きましょう。
6.1.1 ‘YourNewTokens.sol’というファイルを作成します。
6.1.2 先ほど作成したファイルの中に下記のコードを記入します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
pragma solidity ^0.4.17; import 'openzeppelin-solidity/contracts/token/ERC20StandardToken.sol'; import "openzeppelin-solidity/contracts/ownershipOwnable.sol"; contract YourNewToken is StandardToken, Ownable { string public name = 'CoinFabrik'; string public symbol = 'CF'; uint8 public decimals = 18; uint public INITIAL_SUPPLY = 1000; string Owner; event Yes(string); event No(string); constructor() public { totalSupply_ = INITIAL_SUPPLY * (10**uin(decimals)); balances[msg.sender] = totalSupply_; } function setON(string _n) public onlyOwner returns(bool) { Owner = _n; return true; } function getON() public view returns (string) { return Owner; } function () public payable { if (msg.value > 0) { emit Yes('Thanks for donating RBTC! :)'); } else { emit No('Error 404: Function not found :P'); } } function destroy() public onlyOwner { selfdestruct(owner); } } |
7. 上記のコードの説明
- 7.1 Solidityのコンパイラバージョンを定義します。
12pragma solidity ^0.4.17;
- 7.2 ライブラリ XXX.sol をコントラクトにインポートすることができます。
123import 'openzeppelin-solidity/contracts/token/ERC20/StandardToken.sol';import "openzeppelin-solidity/contracts/ownership/Ownable.sol";
ERC20トークンを生成するために、このレポジトリから2つのライブラリをインポートします: トークンの基本関数を持ち、すでにSafeMath.solのような多くのライブラリがインポートされているStandardToken.solと Ownable.solをインポートします。これらによってコントラクトの関数のオーナーコントロールを設定することができます。
- 7.3 “is”を使用しコントラクトをStandardTokenとOwnableとして定義することで、ライブラリの属性と関数を受け継ぐことができます。
12contract YourNewToken is StandardToken, Ownable { }
その後、これらのライブラリとインポートされた上位ライブラリから全ての関数を取得します。
- 7.4 次に、トークンの名前をYourNewTokenと定義し、シンボル、トークンの精密度のための18桁の少数( web3のEther変換機能のためのEthereumネットワーク標準)、そしてトークンの初期供給量1000を次のように設定します:
12345string public name = 'YourNewToken';string public symbol = 'YNT';uint8 public decimals = 18;uint public INITIAL_SUPPLY = 1000;
- 7.5 また、作成者だけが指定された関数とインタラクトできるOwnableライブラリ・プロパティの使用方法を示す別の文字列(トークン機能に関連しない非公式変数)を作成します。これについては後程説明します。
12string Owner;
- 7.6 既に定義されたパラメータを、コンストラクタを執拗してトークンの変数に代入します。ここまで、コンストラクタはコントラクト同じ名前の関数として定義されていましたが、この時点から, 既存のメソッド置き換える「constructor()」という定義となります。以前のようなコンストラクタをコールする場合、Solidityコンパイラが警告を出してくれます。
12345constructor() public {totalSupply_ = INITIAL_SUPPLY * (10**uint(decimals));balances[msg.sender] = totalSupply_;}1234567897.6.1 The number of the INITIAL_SUPPLY times the precision of the decimals will be assigned to the totalSupply_ of the BasicToken contract with```javatotalSupply_ = INITIAL_SUPPLY * (10**uint(decimals));```7.6.2 And deposit them in the creator’s account:```javabalances[msg.sender] = totalSupply_;```
- 7.7 これにより、シンプルで標準的なトークンを使用できるようになりました。しかしここに前述したように、Ownableコントラクトを使用していくつかの機能を追加します。最初に、2つの関数を定義します:1つは非公開変数の状態を書き換えるものであり、オーナーの許可がある場合のみ有効です。もう1つは、文字列のメッセージを返す関数です。定義は次の通りです:
12345678function setON(string _n) public onlyOwner returns(bool) {Owner = _n;return true;}function getON() public view returns (string) {return Owner;}
7.7.1 どちらも公けであるため、誰でもコールを試すことはできます。しかし、最初のコールの場合、オーナーのアドレスのみがリバートをすることが出来ません。もしあなたがオーナーであり関数がコールされたのであれば、その文字列は変数Ownerに(大文字で)保存され、トランザクションでチェックできる真理値もリターンしてくれます。
7.7.2 Owner変数は公けではなくGetterがないため、ブロックチェーンの状態を変更することなく変数値をリターンする関数が必要になります。これが2つ目の関数です。 - 7.8 また、誰かがコントラクトを誤ってコールした場合のための、イベントを発信するフォールバック関数も作成します。
12345678function () public payable {if (msg.value > 0) {emit Yes('Thanks for donating RBTC! :)');} else {emit No('Error 404: Function not found :P');}}
- 7.9 最後に、コントラクトに破棄可能な機能を追加します。この場合、オーナーのみコントラクトを実行できます。
1234function destroy() public onlyOwner {selfdestruct(owner);}
8. マイグレーションの作成
- 8.1 ~/token/migrationsの中に2_deploy_token.jsという名前のファイルを作成します。
- 8.2 コードは次の通りです:
12345var YourNewToken = artifacts.require(".YourNewToken.sol");module.exports = function(deployer) {deployer.deploy(YourNewToken);};
9. コントラクトのデプロイ
- 9.1 Truffleコンソールに下記のコマンドでコントラクトをコンパイルします:
12truffle(testnet)> compile1234567891011121314Compiling your contracts...===========================> Compiling ./contracts/Migrations.sol> Compiling ./contracts/YourNewTokens.sol> Compiling openzeppelin-solidity/contracts/math/SafeMath.sol> Compiling openzeppelin-solidity/contracts/ownership/Ownable.sol> Compiling openzeppelin-solidity/contracts/token/ERC20/BasicToken.sol> Compiling openzeppelin-solidity/contracts/token/ERC20/ERC20.sol> Compiling openzeppelin-solidity/contracts/token/ERC20/ERC20Basic.sol> Compiling openzeppelin-solidity/contracts/token/ERC20/StandardToken.sol> Artifacts written to /Users/huangxu/Project/RIL-DOCS/Smart Contract/build/contracts> Compiled successfully using:- solc: 0.4.24+commit.e67f0147.Emscripten.clang
- 9.2 次にコントラクトをマイグレートします。
12truffle(testnet)> migrate --reset123456789101112131415Using network 'testnet'.Running migration: 1_initial_migration.jsDeploying Migrations...... 0xf00d4ecf2b5752022384f7609fe991aa72dda00a0167a974e8c69864844ae270Migrations: 0x1dc2550023bc8858a7e5521292356a3d42cdcbe9Saving successful migration to network...... 0x3e759e8ff8a7b8e47a441481fa5573ccf502b83f3d591ad3047e622af0f9169eSaving artifacts...Running migration: 2_deploy_token.jsDeploying YourNewToken...YourNewToken: 0xc341678c01bcffa4f7362b2fceb23fbfd33373eaSaving successful migration to network...... 0x71771f7ee5d4e251e386979122bdda8728fa519d95a054572751bb10d40eb8c5Saving artifacts...
- 9.3 どちらのコマンドもこの一つのラインで実行することができます。
12truffle(testnet)> migrate --all --reset
マイグレーションコントラクトがますデプロイされます。Truffleはそれぞれのオペレーションのトランザクションハッシュを提供し、後でも詳細とログをチェックできるようにします。 これが受け取った完全なアウトプットです。
- 9.4 コントラクトとのインタラクションはRSK Testnet explorerで確認できます。作成されたコントラクトとの全てのインタラクションがイクスプローラーで確認することが可能です。
さらなる詳細はこちらを参照してください。