[ブロックチェーンノート6]truffleによる契約とのインタラクション


文書ディレクトリ

  • 敷布団知識
  • 環境構築
  • ソースコード分析
  • 契約抽象
  • はweb 3を通過する.jsと契約のインタラクション
  • 取引実行結果
  • 指定アドレス契約を取得する契約抽象
  • truffleは、イーサ
  • を契約に送信する.

    知識を敷く.


    イーサー坊ネットワークでは,通常,書き込みデータをトランザクションと呼び,読み出しデータを呼び出しと呼ぶ.
    取引には実行コストがあり、gasを消費し、ネットワークの状態を変更し、直ちに処理せず、通常取引のidを取得する.呼び出しは無料で、gasを消費せず、ネットワークの状態を変更せず、直ちに処理し、戻り値がある.

    環境構築


    このノートにはtruffleの例を使用したMetaCoin契約が必要です.truffle unbox webpackです.ここでは降りられないのでgitでダウンロードします.git clone https://github.com/truffle-box/webpack-box

    ソース分析

    pragma solidity >=0.4.21 <0.7.0;
    library ConvertLib {
    	//convert:     amount 
        function convert(uint amount,uint conversionRate) public pure returns (uint convertedAmount) {
            return amount * conversionRate;
        }
    }
    
    pragma solidity >=0.4.21 <0.7.0;
    import "./ConvertLib.sol";
    contract MetaCoin {
    	// 
        mapping (address => uint) balances;
        //Transfer 
        event Transfer(address indexed _from, address indexed _to, uint256 _value);
        // --> 10000
        constructor() public {
            balances[msg.sender] = 10000;
        }
        // 
        function sendCoin(address receiver, uint amount) public returns(bool sufficient) {
            if (balances[msg.sender] < amount) return false;
            balances[msg.sender] -= amount;
            balances[receiver] += amount;
            emit Transfer(msg.sender, receiver, amount);
            //emit 
            return true;
        }
        // 
        function getBalanceInEth(address addr) public view returns(uint) {
            return ConvertLib.convert(getBalance(addr),2);
        }
        // 
        function getBalance(address addr) public view returns(uint) {
            return balances[addr];
        }
    }
    

    契約抽象


    MetaCoin.deployed().then(instance => contract = instance)によってMetaCoin契約の抽象を取得し、contract変数に返す.このときcontract変数でそのメソッドにアクセスできます.

    Web 3を通じて.jsと契約のインタラクション

    web3.eth.accountsでGanacheネットワーク上のすべてのアカウントアドレス用変数を取得できますvar accounts = web3.eth.accountsトランザクションパラメータ–sendCoin関数には3番目のパラメータがなく、3番目のパラメータ{from:accounts[0]}が入力されます.もちろん、このパラメータはトランザクションパラメータと呼ばれる特殊なパラメータであり、常に最後のパラメータとして関数に渡すことができ、容易な関連詳細を設定するために使用できます.取引パラメータはまだたくさんありますが、ここでは詳しく説明しません.
    そしてtestContract.getBalance(accounts[0]) testContract.getBalance(accounts[1])文で2つの口座のbalance情報を検索し、ここは本物の振り替えではなく、mappingの中の振り替えであることに注意します.

    取引実行結果

    var result = testContract.sendCoin(accounts[1], 5) resultは多くの情報を返し、ここではresultの一部のみを記録する.tx–トランザクションのハッシュ値ID result.logs-トランザクションログresult.receipt–取引文書ですが、問題があります.菜鶏はresultに戻ることができますが、中の属性を取得できません.どういうことか分かりません.

    指定されたアドレス契約の契約抽象を取得


    すでに契約アドレスがある場合は、そのアドレスの契約を表す契約抽象を作成できます.const specificInstance = await MetaCoin.at("0x1234...");

    truffleは契約書にイーサを送信する

    instance.sendTransaction()instance.send()でいいです.