Tự viết và deploy smart contract lên Testnet - Phần 1
Blockchain
25
Ethereum
13
smart contract
5
White

Derek Nguyen viết ngày 09/08/2018

Như các bạn đã biết thì cuối năm vừa rồi và đầu năm nay thì BTC , ETH và các altcoins lên giá chóng mặt. Và rồi sau đó rớt phải nói là sấp mờ lờ :sob: .
alt text

Và mình cũng không phải là ngoại lệ nhưng trading hay holding chỉ là phụ việc chính vẫn là coding :smile: . Blockchain nói chung và smart contract nói riêng đã và luôn là một thứ luôn hot. Mình cũng không nằm ngoài xu thế đó. Làm thể nào để tiếp cận với blockchain? Mình có background là Ruby nên mình quyết định chọn javascript cũng như nodejs để tiếp cận với Smart Contract (SC) :joy: . Ở bài viết này mình chỉ xin chia sẽ lại các bạn các bước mình tìm hiểu viết và deploy một SC đơn giản mà thôi.

Trước tiên các bạn cần phải hiểu một số khái niệm cơ bản:

Để viết một SC ta cần phải hiểu thêm một số khái niệm nữa:

  • Ethereum Virtual Machine (EVM): Hãy tưởng tượng nó giống như một siêu máy tính để chạy tất cả các SC (Smart contract). Giống như tên của nó, nó là ảo và không phải là một máy tính vật lý. Đọc thêm: https://nulltx.com/what-is-the-ethereum-virtual-machine.

  • Tiếp theo chúng ta cần hiểu thế nào là gas . Trong EVM thì gas chính là đơn vị đo lường để định phí phí cho mỗi giao dịch với SC. Mỗi tính toán xảy ra EVM đều cần gas. Hợp đồng các phức tạp thì càng cần nhiều gas. Ta có công thức: Fee for transaction = Total gas used * gas price . Đọc thêm về gas: https://ethereum.stackexchange.com/questions/3/what-is-meant-by-the-term-gas

1. Viết Smart Contract

1.1 Cài đặt môi trường development

  • Phải chắc chắn rằng đã cài đặt node trên máy (ở đây là macOS) hoặc có thể cái đặt theo hướng dẫn tại đây: http://blog.teamtreehouse.com/install-node-js-npm-mac.

  • Cài đặt Truffle. Đây là một framework để phát triển Ethereum Smart Contract : https://github.com/trufflesuite/truffle . Nó giúp xây dựng cấu trúc và một số lệnh để viết SC. Chạy lệnh: npm install -g truffle.

  • Cài đặt một local blockchain với Ganache.
    Ganache sẽ cho 10 địa chỉ ETH ảo để test . Các bạn cũng lưu ý URL máy chủ RPC như trong hình:

alt text

1.2 Bắt đầu viết SC

Tạo một thư mục để viết SC của bạn ở đây mình đặt là first_contract. mkdir first_contractcd first_contract . Sau đó chạy lệnh: truffle init. Ta có được một cấu trúc project như sau:
alt text

  • Thư mục contracts là nơi chứa các hợp đồng thông minh của bạn.

  • Thư mục migrations sẽ nơi bạn sẽ viết các đoạn script để deploy hợp đồng thông minh.

  • Thư mục test là nơi chứa các đoạn script để kiểm tra tính đúng đắn của hợp đồng thông minh.

  • SC thì được viết bằng Solidity. Đọc thêm: http://solidity.readthedocs.io/en/v0.4.24

Ở đây tôi viết một SC đơn giản contracts/Fcontracts.sol :

pragma solidity ^0.4.24;

contract Fcontracts {

  mapping (address => uint) fcontracts;

  function updateFcontracts(uint fcontract) public {
    fcontracts[msg.sender] = getFcontracts(msg.sender) + fcontract;
  }

  function getFcontracts(address addr) public view returns(uint) {
    return fcontracts[addr];
  }

}

Giải thích:

pragma solidity ^0.4.24;

Chúng ta sử dụng solidity version 0.4.24 để viết SC.

contract Fcontracts

Mọi thứ liên quan đến Fcontracts đều nằm trong hợp đồng này. Về cơ bản một SC là tập hợp các chức năng và trạng thái (mã và dữ liệu) tại một địa chỉ trong Ethereum blockchain.

 mapping (address => uint) fcontracts;

Trong Solidity, một ánh xạ được gọi là một bảng băm, bao gồm các loại khóa và cặp kiểu giá trị.
Ở đây, chúng ta tạo một ánh xạ, nó chấp nhận kiểu khóa đầu tiên (trong trường hợp của chúng ta, nó sẽ là một kiểu địa chỉ), và kiểu giá trị sẽ là unit.

function updateFcontracts(uint fcontract) public {
    fcontracts[msg.sender] = getFcontracts(msg.sender) + fcontract;
}

function getFcontracts(address addr) public view returns(uint) {
    return fcontracts[addr];
}

Ở SC này có 2 public methods: gettersetter. Thật dễ hiểu phải không nào :stuck_out_tongue: .

Sau khi viết xong SC, ta cần viết thêm test để kiểm tra nó hoạt động . Tạo test/FconFcontracts.js. Chúng ta sẽ viết test bằng Mocha testing framework:

// web3 is a global variable, injected by Truffle.js
const BigNumber = web3.BigNumber

// artifacts is a global variable, injected by Truffle.js
const Fcontracts = artifacts.require("./Fcontracts.sol")

require('chai')
  .use(require('chai-as-promised'))
  .use(require('chai-bignumber')(BigNumber))
  .should()

contract('Fcontracts', function(walletAddresses) {
  let me = walletAddresses[0]
  let contract

  beforeEach(async function () {
    contract = await Fcontracts.new()
  })

  it('should create contract', async function () {
    contract.should.exist

    const fcontracts = await contract.getFcontracts(me)
    fcontracts.should.be.bignumber.equal(new BigNumber(0))
  })

  it('should updateFcontracts and getFcontracts correctly', async function () {
    // initially i have 0 shares
    let fcontracts = await contract.getFcontracts(me)
    fcontracts.should.be.bignumber.equal(new BigNumber(0))

    await contract.updateFcontracts(1, { from: me })

    fcontracts = await contract.getFcontracts(me)
    fcontracts.should.be.bignumber.equal(new BigNumber(1))
  })

})

Ở đây tôi viết test có 2 phương thức getFcontractsupdateFcontracts. Chạy truffle test để chắn chắc test passed.

alt text

Sau khi chắc chắn mọi thứ đã ổn ta cần deploy SC này lên testnet. Ở đây là môi trường development.

1.3 Deploy SC lên local blockchain

Chúng ta cần phải mở app Ganache lên trươc tiên sau đó cài đặt cấu hình truffle để deploy local blockchain.

Như các bạn đã thấy trong thư mục project của chúng ta có 2 file: truffle.jstruffle-config.js . Vì mình sử dụng mac nên mình sẽ xoá đi file truffle-config.js. Sau đó sửa lại như sau:

module.exports = {
  networks: {
    development: {
      host: 'localhost',
      port: 7545,
      network_id: '*' // Match any network id
    }
  }
}

7545 chính là port của Ganache RPC .

À khoan để deploy SC ta cần phải viết thêm deploy migration. Ta tạo thêm 1 file: migrations/2_deploy_contracts.js với nội dung:

var Fcontracts = artifacts.require('Fcontracts')

module.exports = function (deployer, network, accounts) {
  deployer.deploy(Fcontracts)
}

Chúng ta sẽ chạy lệnh để deploy SC:

truffle migrate --network development

Đây là màn hình console khi deploy:

alt text

Khi deploy thành công chúng ta sẽ có các transactions:
alt text

Transaction được khoanh đỏ trong hình chính là transaction khi chúng ta deploy SC. Sau khi deploy xong thì chúng ta sẽ bị trừ đi một số ETH cái này gọi là fee. Cái fee này được trả cho toàn mạng. Giao dịch khởi tạo cho hợp đồng này có thể gọi là mắc :joy:

Như vậy các bạn đã tạo được một Smart Contract và deploy nó lên local blockchain cực kì đơn giản phải không. Ở phần 2 mình sẽ hướng dẫn các bạn deploy lên các Testnet thật. Toàn bộ source code mình sẽ để lại trong phần 2 nhé. Happy Coding :smile:

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Derek Nguyen

11 bài viết.
20 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
31 6
Nếu bạn muốn xây dựng một website mà chỉ bao gồm HTML, CSS và Javascript. Bạn có thể xây dựng 1 static web hoàn toàn miễn phí phục vụ cho việc học ...
Derek Nguyen viết hơn 1 năm trước
31 6
White
8 0
Nội dung của bài viết này có thể đã có rất nhiều người đã biết, nhưng mình cũng xin được chia sẽ lại cho những ai chưa biết. Hoàn Cảnh Data cons...
Derek Nguyen viết gần 2 năm trước
8 0
White
7 0
Hello React Native Chắc hẳn các bạn không còn xa lạ với React Native (RN) nên mình sẽ không giới thiệu nó là cái gì nữa mà sẽ bắt tay vào làm một ...
Derek Nguyen viết hơn 1 năm trước
7 0
Bài viết liên quan
White
11 5
Tạm xóa
Giaosucan viết 6 tháng trước
11 5
White
0 0
Webpack Webpack là một module loader khá phổ biến trong phát triển web phía front end. Trong project xây dựng DApps trên Ethereum, ta hoàn toàn co...
Vani viết 6 tháng trước
0 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
11 bài viết.
20 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!