【Blockchain】 SmartContract를 수동 컴파일하여 로컬 환경 (Ganache)에 배포 및 테스트

SmartContract를 개발하기 위한 프레임워크Truffle.js 등이 있습니다만, 이번은, 구조를 이해하기 위해서 수동으로 컴파일해 BytecodeABI (Application Binary Interface)를 취득합니다.
그런 다음 로컬 환경의 Blockchain 네트워크에 배포 및 테스트합니다.

Bytecode와 ABI에 관하여


Bytecode (바이트 코드)는 블록 체인에 올리기 위한 SmartContract 바이너리 코드입니다. EVM (Ethereum Virtual Machine) 가상 시스템에서 실행됩니다.ABI (Application Binary Interface)는 Bytecode 기능 및 입력 및 출력과 같은 정보를 Json 형식으로 설명합니다. ABI를 보면 SmartContract에 어떤 기능을 가지고 있는지 알 수 있습니다.

컴파일하는 파일들


MyProkject/
├─ .vscode
│  └─ settings.json
├─ contracts
│  └─ SampleContract.sol
└─ scripts
   └─ compile.js
  • /.vscode/settings.json에 대한 자세한 내용은 이 기사을 참조하십시오.
  • /contracts/ 폴더에 개발할 SmartContract 프로그램을 넣습니다. 이 예에서는 SampleContract.sol를 넣었습니다.
  • /scripts/compile.js에는 컴파일을 위한 Javascript에 설명된 스크립트가 들어 있습니다.

  • compile.js
    // ライブラリのインポート
    const path = require('path');   // ファイルパスを操作するためのライブラリ
    const fs = require('fs');       // ファイルを読み書きするためのライブラリ
    const solc = require('solc');   // Solidity言語のプログラムをコンパイルするためのライブラリ
    const chalk = require('chalk'); // ログ出力に色をつけるためのライブラリ
    
    // プログラムファイルのパスを設定
    const contractPath = path.resolve(__dirname, "../contracts", "SampleContract.sol");
    
    // プログラムファイルを読み込む
    const source = fs.readFileSync(contractPath, 'utf8');
    
    // プログラムをコンパイルし、Bytecode と ABI を取得する
    const {abi, bytecode} = solc.compile(source, 1).contracts[':SampleContract'];
    
    // Bytecode と ABI をログ出力する
    console.log(chalk.green(bytecode));
    console.log(chalk.cyan(abi));
    

    컴파일



    터미널에서 프로젝트 경로를 열고 다음 명령을 실행합니다.
    node ./scripts/compile.js 
    

    그러면 컴파일이 수행되고 로그에 녹색으로 Bytecode와 청록색으로 ABI가 출력됩니다.
    하지만 이것이라면 BytecodeABI를 로그 출력 할 뿐이므로 다음은 로컬 환경에 Blockchain 개발용 네트워크 환경을 구축하고 거기에 개발한 SmartContract를 배포하고 싶다고 생각합니다.

    Ganache


    GanacheBlockchain 개발을 위한 네트워크 환경입니다.
  • 다음 주소에서 다운로드하여 설치합니다.
    h tps : // t 루 f ぇ 라메를 rk. 코 m / 가나치
  • 시작하면 다음 화면이 표시되므로 QUICKSTART를 클릭하십시오.


  • 네트워크를 구축하고 100ETH가 있는 10개의 계정을 제공합니다.


  • BLOCKS 탭을 클릭하면 네트워크에 유지되는 Blockchain가 표시됩니다. 처음에는 시작 블록BLOCK 0만 존재합니다. 이 블록은 Block Genesys라고도 합니다.



  • Deploy & Test


  • 테스트용 라이브러리를 설치합니다.
  • npm install --save-dev mocha@{バージョン}
    
  • /scripts/compile.js를 다음과 같이 변경합니다.

  • compile.js
    // ライブラリのインポート
    const path = require('path');   // ファイルパスを操作するためのライブラリ
    const fs = require('fs');       // ファイルを読み書きするためのライブラリ
    const solc = require('solc');   // Solidity言語のプログラムをコンパイルするためのライブラリ
    
    // プログラムファイルのパスを設定
    const contractPath = path.resolve(__dirname, "../contracts", "SampleContract.sol");
    
    // プログラムファイルを読み込む
    const source = fs.readFileSync(contractPath, 'utf8');
    
    // プログラムをコンパイルし、外部へ export する
    module.exports = solc.compile(source, 1).contracts[':SampleContract'];
    
  • 테스트용 스크립트/test/SampleContract.test.js를 만듭니다.

  • SampleContract.test.js
    // ライブラリのインポート
    const assert = require('assert');  // テスト assert をするためのライブラリ
    const Web3 = require('web3');      // ローカル環境(Ganache)と接続するためのライブラリ
    
    // ローカル環境(Ganache)と接続するためのオブジェクトを生成
    const provider = new Web3.providers.HttpProvider("HTTP://127.0.0.1:7545");
    const web3 = new Web3(provider);
    
    // コンパイルスクリプトからBytecodeとABIを取得する
    const {abi, bytecode} = require('../scripts/compile');
    
    // 変数定義
    let accounts;        // Ganacheで提供される10アカウントを保持する
    let sampleContract;  // デプロイしたSmartContractを保持する
    
    // 各テストを実行する前に実行する
    beforeEach(async() => {
        // アカウントを取得する
        accounts = await web3.eth.getAccounts();
        // ABIとBytecodeを一番最初のアカウントを使ってデプロイ
        usersContract = await new web3.eth.Contract(JSON.parse(abi))  // ABI
            .deploy({data: bytecode})                                 // Bytecode
            .send({from: accounts[0], gas: '1000000'});               // 一番最初のアカウント、GAS=1000000
    });
    
    // テスト 'The UsersContract' 開始
    describe('The UsersContract', async() => {
        // 1つ目のテスト: デプロイできたか?
        it('should deploy', () => {
            console.log(usersContract.options.address);
            assert.ok(usersContract.options.address);
        });
    });
    
  • /package.json"test": "mocha" 로 한다.
  • {
      "name": "myproject",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "test": "mocha"
      },
      "author": "",
      "license": "ISC",
      "devDependencies": {
        "chalk": "^2.4.2",
        "mocha": "^5.2.0",
        "solc": "^0.4.24",
        "web3": "^1.0.0-beta.35"
      }
    }
    
  • 다음 명령을 사용하여 테스트를 실행하여 배포를 확인합니다.
  • npm run test
    
  • 성공하면 로그에서 다음과 유사한 출력을 볼 수 있습니다.
  • > [email protected] test /myproject
    > mocha
    
      The UsersContract
    0xdabBD1955e2873bB498A6F1f149A8A0d74f48170
        ✓ should deploy
    
    
      1 passing (72ms)
    
  • 또한 GanacheTRANSACTIONS 탭에서 SmartContract를 배포했는지 확인할 수 있습니다.

  • 좋은 웹페이지 즐겨찾기