イーサリアム開発フレームワーク-トリュフの基本的な使用

トリュフ

トリュフ入門

truffle unbox webpackコマンドは
、必要な多くのモジュールをダウンロードするのに約10分かかるので、最初にTruffleを見てみましょう。

Truffleは現在最も人気のあるEthereumDApp開発フレームワークであり、(公式Webサイトによると)
世界開発環境とテストフレームワーク、およびEVMを使用するすべてのブロックチェーンの資産管理チャネルです。これはJavaScriptに基づいており、コミットされています。イーサリアムでの開発を簡単にしました。

トリュフには次の機能があります。

 内置的智能合约编译,链接,部署和二进制文件的管理。
 合约自动测试,方便快速开发。
 脚本化的、可扩展的部署与发布框架。
 可部署到任意数量公网或私网的网络环境管理功能
 使用 EthPM 和 NPM 提供的包管理,使用 ERC190 标准。
 与合约直接通信的直接交互控制台(写完合约就可以命令行里验证了)。
 可配的构建流程,支持紧密集成。
 在 Truffle 环境里支持执行外部的脚本。

トリュフクライアント

後で作成するスマートコントラクトは、テストのためにチェーンにデプロイする必要があるため、truffleによって構築されたDAppは
、デプロイするチェーンも選択する必要があります。RinkebyやRopstenなどの一部の公開テストチェーンにデプロイすることを選択できますが、デメリットは、デプロイとテストの時間が比較的長く、ガス切れを防ぐために偽のトークンを取得するのに一定の時間がかかることです。もちろん、DAppリリースの正式なプロセスでは、ステージング(シミュレーション環境)を使用してパブリックチェーンをテストする必要があります。

もう1つの方法は、プライベートチェーンにデプロイすることです。これは、開発フェーズでの通常の選択です。
トリュフは、次の2つのクライアントを公式に推奨しています
。ガナッシュ
トリュフの開発

truffledevelopはtruffleの組み込みクライアントであり、基本的に
はGanacheのコマンドラインバージョンに似ています。truffleディレクトリにbashと入力します。

>truffle develop

クライアントを開くことができ、ガナッシュのように、自動的に10個のアカウントが生成されます。
唯一の注意点は、truffledevelopでtruffleコマンドを実行する場合、前の
「truffle」を省略する必要があることです。たとえば、「trufflecompile」は「compile」と入力するだけで済みます。

Truffleをインストールする

gethを開始してから、truffleをインストールしましょう。truffleは、dappの
構築と管理を非常に簡単にするdapp開発フレームワークです。

このようにnpmを使用してインストールできます。truffle: >npm install -g truffle
次に、空のディレクトリを作成し、以下のtruffleプロジェクトを作成します。

>mkdir simple_voting_by_truffle_dapp
>cd simple_voting_by_truffle_dapp
>npm install -g webpack
>truffle unbox webpack

truffle init:現在のディレクトリで新しい空のtruffleプロジェクトを初期化します(プロジェクトファイルには
truffle-config.jsとtruffle.jsのみ、contractsディレクトリにはMigrations.solのみ、migrationsディレクトリには1_initial_migration.jsのみ)

truffle unbox:トリュフボックスを直接ダウンロードします。つまり、事前に作成されたトリュフプロジェクトです。
開梱プロセスは比較的長く、完了後に次のプロンプトが表示されます。

ここに画像の説明を挿入
こちらのwebpackは、webpackビルドプロセスに基づく公式のプロジェクトフレームワーク(トリュフボックス)です。
その他のトリュフボックスについては、https: //truffleframework.com/boxesを参照してください。

プロジェクトを作成する


truffleプロジェクトが初期化されると、完全なdappを実行するために必要なすべてのファイルとディレクトリが作成されます。webpackのトリュフボックスを直接ダウンロードします。その中のディレクトリは次のとおりです。

>ls
README.md contracts node_modules test 
webpack.config.js truffle.js app migrations 
package.json
>ls app/
index.html javascripts stylesheets
>ls contracts/
ConvertLib.sol MetaCoin.sol Migrations.sol
>ls migrations/
1_initial_migration.js 2_deploy_contracts.js

app/-アプリケーションファイルが実行されるデフォルトのディレクトリ。これには、javascriptファイル
とcssスタイルファイルの推奨ディレクトリが含まれますが、これらのディレクトリの使用方法を決定するのはあなた次第です。
contract/-Truffleのデフォルトのコントラクトファイルストレージディレクトリ。migrations/-デプロイメントスクリプトファイルのストレージディレクトリtest
/-アプリケーションとコントラクトをテストするためのテストファイルディレクトリプロジェクトの下のコントラクトディレクトリにあるConvertLib.solファイルとMetaCoin.solファイルを削除します。

>rm contracts/ConvertLib.sol contracts/MetaCoin.sol

また、プロジェクトディレクトリでtruffle.jsという設定ファイルを探します。
ネットワークを開発するための構成が含まれています。プライベートチェーンとガナッシュはデフォルトでこのポートで実行されるため、ポート番号を7545から8545に変更します。

移行

移行の概念
移行ディレクトリの内容を理解することが重要です。これらの移行ファイルは、コントラクト
をブロックチェーンにデプロイするために使用されます。

前のプロジェクトでは、ノードコンソールでVotingContract.newを呼び出すことにより、投票契約がブロックチェーンにデプロイされました。将来的には、これを行う必要はなくなります。truffleはすべての展開を展開し、追跡します。

移行は、デプロイメントのニーズが時間の経過とともに変化することを前提として、デプロイメントタスクのステージングを担当するJavaScriptファイルです。プロジェクトが成長するにつれて、チェーンの契約状態を変更するための新しい移行スクリプトを作成する必要があります。すべての実行移行履歴レコードは、特別な移行契約を通じてチェーンに記録されます。

最初の移行1_initial_migration.jsは、
移行と呼ばれるコントラクトをブロックチェーンにデプロイし、デプロイした最新のコントラクトを保存するために使用されます。移行を実行するたびに、truffleはブロックチェーンに最新のデプロイ済みコントラクトを照会し、まだデプロイされていないコントラクトをデプロイします。

次に、移行コントラクトのlast_completed_migrationフィールドを更新して、最後にデプロイされたコントラクトをポイントします。
これは、常に最新の列last_completed_migrationを持つデータベーステーブルと単純に考えることができます。

移行ファイルの命名には特別な要件があります:プレフィックスは
移行が正常に実行されるかどうかを示すために使用される番号(必須)です;サフィックスは読みやすさを向上させ、理解を容易にするために説明的な単語です。

Artifacts.require()

スクリプトの開始時に、artifacts.require()メソッドを使用して、デプロイおよび移行するコントラクトをtruffleに通知
します。これは、ノードでのrequireと非常によく似ています。ただし、最新の公式ドキュメントでは、.solファイルに複数のコントラクトが含まれている可能性があるため、ファイル名ではなく、定義されたコントラクト名を渡す必要があると警告されていることに注意してください。

輸出の機能


移行jsのエクスポート関数は、最初のパラメーターとしてデプロイヤーオブジェクトを受け取る必要があります。このオブジェクトは主に、デプロイと公開のプロセスで明確な構文サポートを提供するために使用されます。また、後で使用するためにデプロイされたファイルを保存するなど、いくつかの一般的なコントラクトデプロイメントの責任も提供します。

デプロイヤオブジェクト

デプロイヤオブジェクトは、デプロイメントタスクをステージングするためのメインインターフェイスです。
Truffleの他のすべてのコードと同様に、Truffleは
独自のコードのコントラクト抽象化を提供し、Ethereumネットワークと簡単に対話できるように初期化されます。これらの抽象インターフェイスはすべて、展開プロセスの一部です。

移行ファイルを更新する

2_deploy_contracts.jsのコンテンツを次の情報で更新します。

var Voting = artifacts.require("./Voting.sol");
module.exports = function(deployer) {
    
    
deployer.deploy(Voting, ['Alice', 'Bob', 'Cary'], {
    
    gas:
290000});
};

上記からわかるように、デプロイヤーは、コンストラクターパラメーターに続く最初のパラメーターがコントラクト名であることを期待しています。

この場合、候補の配列であるパラメーターは1つだけです。3番目のパラメーターは、コードのデプロイに必要なガスを指定するために使用するハッシュです。ガスの量は、契約の規模によって異なります。投票契約の場合、290000で十分です。

トリュフ構成ファイルを更新します

次のようにtruffle.jsの内容を更新します。

require('babel-register')
module.exports = {
    
    
networks: {
    
     
development: {
    
     
host: 'localhost', 
port: 8545, 
network_id: '*', 
gas: 470000 
} } }

以前のtruffle.jsと更新されたファイルの唯一の違いはgasオプションであることに気付くでしょう。
これは、すべての移行に適用されるグローバル変数です。たとえば、2_deploy_contracts.jsでガス値290000を指定しない場合
、移行はデフォルトで470000になります。

契約コードVoting.sol
は以前にコーディングされており、追加の変更なしでトリュフに使用できます。
simple_voting_dappからcontractsディレクトリにファイルをコピーするだけです。

アカウントを作成します(メタマスクでアカウント転送を使用できます)

コントラクトをデプロイする前に、エーテルが含まれているアカウントが必要です。ガナッシュを使用する
と、各アカウントに100個のテストエーテルを含む10個のテストアカウントが作成されました
ただし、テストネットとメインネットの場合は、独自のアカウントを作成し、それにエーテルを入れる必要があります。

以前のガナッシュアプ​​リケーションでは、シングルノードコンソールを起動
し、web3オブジェクトを初期化しました。truffleコンソールを実行すると、truffleがすべてを実行し、web3オブジェクトを使用できるようになります。
これで、アドレスが「0x95a94979d86d9c32d1d2ab5ace2dcc8d1b446fa1」(別のアドレスになります)のアカウントがあり、残高は0です。

 >truffle console
// Replace 'verystrongpassword' with a good strong password.
truffle(development)> 
web3.personal.newAccount('verystrongpassword') ' 0xbaeec91f6390a4eedad8729aea4bf47bf8769b15'
truffle(development)> 
web3.eth.getBalance('0xbaeec91f6390a4eedad8729aea4bf47bf8769b1
5')
{
    
     [String: '0'] s: 1, e: 0, c: [ 0 ] }
truffle(development)> 
web3.personal.unlockAccount('0xbaeec91f6390a4eedad8729aea4bf47
bf8769b15', 'verystrongpassword', 15000)

配備

すでにエーテルがあれば、先に進んでコントラクトをコンパイルしてブロックチェーンにデプロイできます。以下に関連するコマンドがあります
。すべてがうまくいくと、次の出力が表示されます。

>truffle compile
Compiling Migrations.sol...Compiling Voting.sol...Writing 
artifacts to ./build/contracts
>truffle migrate
Running migration: 1_initial_migration.js
Deploying Migrations...
Migrations: 0x3cee101c94f8a06d549334372181bc5a7b3a8bee
Saving successful migration to network...
Saving artifacts...
Running migration: 2_deploy_contracts.js
Deploying Voting...
Voting: 0xd24a32f0ee12f5e9d233a2ebab5a53d4d4986203
Saving successful migration to network...
Saving artifacts...

複数のアカウントをお持ちの場合は、関連するアカウントがロックされていないことを確認してください。デフォルトでは、最初のアカウント
web3.eth.accounts[0]がデプロイメントに使用されます。

考えられる問題と解決策

  1. ガスが不十分なためにデプロイが失敗した場合は
    、migrations/2_deploy_contracts.jsのガスアカウントを
    500000に増やしてみてください。例:deployer.deploy(Voting、['Rama'、'Nick'、'Jose']、
    {gas:500000});
  2. 複数のアカウントがあり、accounts [0]ではなくアカウントを選択したい場合は、truffle.jsで使用するアカウントのアドレスを指定できます。network_idの後
    に「from:your address」を追加すると、truffleは指定したアドレスを使用してデプロイおよび対話します。

展開がうまくいけば、コンソールとWebページを介して契約を操作できます

新しいJavaScriptファイルapp/scripts/index.jsを作成します

   // Import the page's CSS. Webpack will know what to do with it.
import "../styles/app.css";
// Import libraries we need.
import {
    
     default as Web3} from 'web3';
import {
    
     default as contract } from 'truffle-contract'
import voting_artifacts from '../../build/contracts/Voting.json'
var Voting = contract(voting_artifacts);
let candidates = {
    
    "Alice": "candidate-1", "Bob": "candidate-2", 
"Cary": "candidate-3"}
window.voteForCandidate = function(candidate) {
    
     
    let candidateName = $("#candidate").val(); 
    try {
    
     
        $("#msg").html("Vote has been submitted. The vote count 
        will increment as soon as the vote is recorded on the blockchain. 
        Please wait.") 
        $("#candidate").val("");
        Voting.deployed().then(function(contractInstance) {
    
     
            contractInstance.voteForCandidate(candidateName, 
            {
    
    gas: 140000,
            from:web3.eth.accounts[0]})
            .then(function() {
    
     
                let div_id = candidates[candidateName]; 
                return

                contractInstance.totalVotesFor
                .call(candidateName).then(function(v) {
    
     
                $("#" + div_id).html(v.toString()); 
                $("#msg").html(""); 
                }); 
            }); 
        }); 
    } catch (err) {
    
     
        console.log(err); 
    } 
}

$( document ).ready(function() {
    
     
    if (typeof web3 !== 'undefined') {
    
     
        console.warn("Using web3 detected from external 
        source like Metamask") // Use Mist/MetaMask's provider 
        window.web3 = new Web3(web3.currentProvider); 
    } else {
    
     
        console.warn("No web3 detected. Falling back to 
        http://localhost:8545. You should remove this fallback when you 
        deploy live, as it's inherently insecure. Consider switching to 
        Metamask for development. More info here: 
        http://truffleframework.com/tutorials/truffle-and-metamask"); 
        // fallback - use your fallback strategy (local node / hosted node 
        + in-dapp id mgmt / fail) 
        window.web3 = new Web3(new
        Web3.providers
        .HttpProvider("http://localhost:8545")); 
    }
    Voting.setProvider(web3.currentProvider); 
    let candidateNames = Object.keys(candidates); 
    for (var i = 0; i < candidateNames.length; i++) {
    
     
        let name = candidateNames[i]; 

        Voting.deployed().then(function(contractInstance) {
    
     
            contractInstance.totalVotesFor
            .call(name).then(function(v) {
    
     
            $("#" + candidates[name])
            .html(v.toString()); 
            }); 
        }); 
    }
});

7行目:投票コントラクトをコンパイルしてデプロイすると、truffleはabiとデプロイされたアドレス
をビルドディレクトリの下のjsonファイルに保存します。以前にabiについて説明しました。この情報を使用
して、投票の抽象化を開始します。次に、この抽象化を使用して、投票契約のインスタンスを作成します。

14行目:Voting.deployed()はコントラクトインスタンスを返します。truffleを呼び出すたび
にpromiseが返されるため、すべてのトランザクション呼び出しでthen()を使用します。

コンソールを操作するには、新しいコンソールを再度開く必要があります

>truffle console
truffle(default)> 
Voting.deployed().then(function(contractInstance) 
{
    
    contractInstance.voteForCandidate('Alice').then(function(v) 
{
    
    console.log(v)})})
{
    
     blockHash: 
'0x7229f668db0ac335cdd0c4c86e0394a35dd471a1095b8fafb52ebd76714
33156',
blockNumber: 469628,
contractAddress: null,
....
....
truffle(default)> 
Voting.deployed().then(function(contractInstance) 
{
    
    contractInstance.totalVotesFor.call('Alice').then(function(v) 
{
    
    console.log(v)})})
{
    
     [String: '1'] s: 1, e: 0, c: [ 1] }

トランザクションの送信には時間がかかるため、voteForCandidateメソッドを呼び出した後、少し待つ必要があります
。トリュフへのすべての呼び出しはpromiseを返すことに注意してください。これが
、then()関数でラップされた各応答とtotalVoteFor( )メソッド.call()なしで直接呼び出すこともでき
、トランザクションは送信されません。

送信トランザクションは、gethのログ出力ファイルにあります。テストネットワーク
に接続している場合は、etherscanのhttps://rinkeby.etherscan.ioでクエリを実行できます。

トリュフのデフォルトのgasPriceは100GWeiであることがわかります。苦痛を感じる場合は、truffle.jsで変更し、gasPrice:1000000000を追加して1GWeiに変更し、トリュフコンソールを再起動して有効にします。

Webインタラクション
コンソールでwebpackを使用してサーバーを起動します。

>npm run dev

デフォルトのポートは8080です。ブラウザでlocalhost:8080にアクセスすると、ページを表示できます。
メタマスクがインストールされている場合、index.jsは自動的にメタマスクを検出してweb3
プロバイダーとして使用するため、現在接続しているネットワークにメタマスクを切り替えることに注意する必要があります。

おすすめ

転載: blog.csdn.net/david2000999/article/details/120472092