Hướng Dẫn Tạo Ethereum Smart Contract Với Solidity

huong dan lap trinh smart contract
Nếu bạn đang có hứng thú tạo ra một smart contract cho riêng mình hoặc đang tìm hiểu xem một smart contract hoạt động như thế nào ? Hạy đang muốn tạo ra một crypto currency trị giá hàng trăm triệu usd 😀

Với mục đích nào đi nữa thì việc tìm hiểu cách hoạt động của một smart contract là vô cùng giá trị . Ethereum là một nện tản có tiềm năng khổng lồ trong tương lai cho việc xây dựng những hệ thống voting , gọi vốn ,crypto currency

Smart Contract Là Gì ? Ví Dụ Về Smart Contract.

Smart Contract giúp bạn trao đổi, giao dịch mọi thứ một cách minh bạch mà không cần qua trung gian.

Smart contract là một loại hợp đồng giữa bên A và bên B được tạo ra bằng code. Smart Contract liên tục kiểm tra và đưa ra quyết định rằng 2 bên đã thỏa mãn điều kiện của hợp đồng hay chưa.

Ví Dụ:
Bạn muốn thuê một căn hộ của tôi và thanh toán bằng cryptocurrency, tôi sẽ tạo ra một smart contract, nội dung của smart contract như sau: bạn phải gửi cho tôi 1 bitcoin được xem là tiền đặt cọc và tôi sẽ gửi chìa khóa căn hộ cho bạn vào một ngày sau đó, nếu chìa khóa được chuyển đến trễ hẹn thì blockchain sẽ tự trả lại tiền đặt cọc cho bạn. Nếu tôi gửi chìa khóa đến sớm hơn ngày hẹn blockchain sẽ giữ chìa khóa và sẽ chuyển cho bạn khi đến ngày. Smart contract hoạt động theo nguyên tắc if-then và được theo dõi bởi rất nhiều người trên thế giới vì vậy nếu bạn đã gửi tiền cho tôi thì chắc chắn bạn sẽ nhận được chìa khóa.

Bạn Sẽ Học Được Gì Trong Bài Hướng Dẫn Này

Bài hướng dẫn này sẽ tổng hợp tất cả các kiến thức cơ bản để bắt đầu lập trình tạo ra một smart contract cơ bản trong hệ Ethereum.

Chúng ta sẽ tìm hiểu những kiến thức sau đây :

  • Ethereum Nodes
  • Tạo ra  một Private Ethereum Network
  • Mist Browser
  • Ví Ethereum
  • Web3 Ethereum JavaScript API
  • Remix Web Browser IDE
  • Geth (Go Ethereum) Command Line Interface
  • Lập trình với ngôn ngữ Solidity

Ethereum Node Là Gì ? Cách Tạo Ethereum Node

Đa số các hệ thống hiện tại trên thể giới phát triển theo mô hình tập trung (centrailize), tất cả các user sẽ gửi request và nhận response từ một server chung , database sẽ được lưu trên server chung đó .

Ethereum xây dựng theo mô hình phân tan (decentralized) peer-to-peer có nghĩa các user sẽ gửi request và nhận response lẫn nhau mà không cần thông qua một server chung nào hết , database sẽ được lưu trên máy tính của tất cả các user. Mỗi user được xem là một Ethereum Node , các node này liên kết với nhau tạo thành một Ethereum Network, xem hình bên dưới để hiểu rõ hơn.

Kết quả hình ảnh cho centralized and decentralized clipart

 

Như hình trên bên trái là mô hình hoạt động tập trung (centralized) , bên trái là mô hình hoạt động phân tán(decentralized)

Nói một cách đơn giản, Ethereum node là một phần mềm tên là Geth chạy máy tính cá nhân hay laptop , hiện tại vẫn chưa có phiên bản giành cho mobile. Khi  Geth khởi động nó sẽ tự động kết nối vào Mainnet ethereum network từ đó máy tính của bạn sẽ trở thành một node trong Mainnet ethereum network. Sau khi đã trở thành một node trong mạng lưới của Ethereum bạn có thể mine blocks, tạo transactions, và deploy smart contracts…

Lưu ý, có 2 loại ethereum network:

  1. Mainnet Ethereum Network: Là mạng lưới Ethereum chung đang chạy thực tế của mọi người trên toàn thế giới , chúng ta sẽ không nói đến nó trong bài viết này.
  2. Private Ethereum Network: Là mạng lưới Ethereum của riêng bạn , chúng ta sẽ tìm hiểu cách tạo ra nó để code và test smart contract trong bài viết này.

Geth được viết bằng ngôn ngữ Go (Go Ethereum/Geth), C++, và Python . Lưu ý khi bạn chạy Geth nó sẽ tự động download toàn bộ dữ liệu của mainnet ethereum network về máy tính nên hãy chắc chắn bạn có hơn 35G ổ cứng (Trong bài này chúng ta sẽ tạo ra một private ethereum network nên không cần quan tâm đến điểm này). Hãy làm theo các bước sau đây để download và cài đặt Geth:

  1. Vào Ethereum website : https://geth.ethereum.org/downloads/
  2. Download Geth cho windows phiên bản mới nhất hiên tại là version  1.7.3Geth phien ban moi nhat
  3. Sau khi download hoàn tất , chạy file .exe để bắt đầu cài đặt cai dat geth buoc 1
  4. Bước tiếp theo hãy chắc chắn Geth checkbox đã được chọncai dat geth buoc 2
  5. Tiếp theo hãy chọn đường dẫn mà bạn muốn  lưu Geth 
  6. Đóng cửa sổ cài đặt sau khi cài đặt hoàn tất 
  7. Mở cmd và di chuyển vào folder bạn đã lưu Geth bằng lệnh Di chuyen vao geth folder
  8. Bắt đầu download dữ liệu của Ethereum network về máy tính của bạn bằng lệnh  “Geth” ,  do đây là lần đầu tiên bạn download hay còn gọi là đồng bộ dữ liệu của Ethereum network về máy tính nên rất mất thời gian. Hãy bỏ qua bước này nếu bạn chỉ muốn tạo Private Ethereum Network.
    chay geth download data ethereum networkMặc định dữ liệu của Ethereum network được download về sẽ  lưu trong thư mục C:\Users\<your user name>\AppData\Ethereum\geth\chaindata , sau khi việc đồng bộ dữ liệu hoàn tất thì máy tính của bạn đã trở thành một node của Ethereum network và cuộc chơi bắt đầu từ đây.

Bắt Đầu Tạo Ra Private Ethereum Network

Nếu đã hoàn tất bước 7 và bước 8 ở trên thì máy tính của bạn đã trở thành một node và có quyền truy suất vào Mainnet Ethereum Network thông qua Geth.

Như đã nói ở trên nhiều Ethereum Node kết nối với nhau tạo thành Ethereum Network , nên chúng ta sẽ bắt đầu tạo ra Node đầu tiên trong Private Ethereum Network.

  1. Tạo 1 folder trên desktop đặt tên là “Private Blockchain”
  2. Trong folder “Private Blockchain” tạo một folder đặt tên là “chaindata”
  3. Tiếp theo, trong folder “Private Blockchain” tạo 1 file JSON đặt tên là “genesis.json”  
  4. Mở file “genesis.json”  bằng notepad , copy và paste đoạn code dưới đây và save file này lại
    	
    {
      "coinbase"   : "0x0000000000000000000000000000000000000001",
      "difficulty" : "0x20000",
      "extraData"  : "",
      "gasLimit": "0x8000000", 
       "alloc": {},
      "config": {
            "chainId": 15,
            "homesteadBlock": 0,
            "eip155Block": 0,
            "eip158Block": 0
        }
    }
    
    - chainId:id blockchain của bạn, nó dúng để ngăn chặn replay attack 
    - homesteadBlock: Homestead là bản release thứ hai của Ethereum (bản release đầu tiên là Frontier). Giá trị 0 có nghĩa là bạn đang sử dụng bản release này.
    - eip155Block / eip158Block: epi  viết tắt của Ethereum Improvement Proposal, nơi các developer đề xuất các ý tưởng để cải tiến Ethereum.
    - difficulty: Giá trị này được sử dụng để kiểm soát thời gian mining 1 block trong ethereum blockchain. Giá trị càng cao độ khó càng cao.
    - gasLimit: Gas tối đa sẽ được tiêu tốn trong quá trình thực hiện một giao dịch hay thực thi smart contract.
    - alloc: Cho phép bạn nạp trước một lượng ether vào account.
    

    blockchain folder overview

  5. Yêu cầu Geth hãy tạo ra một Private Ethereum Network từ file “genesis.json” đã được định nghĩa ở bước 4.
    1. Mở cmd, di chuyển vào thư mục “Private Blockchain” và nhập đoạn code dưới đây vào cmd
       geth --datadir=./chaindata/ init ./genesis.json --networkid 4568

      Đoạn code trên có nghĩa là chúng ta sẽ tạo ra node đầu tiên của private blockchain network dựa trên file config “genesis.json” và data sẽ được lưu vào folder “chaindata”
      --networkid 4568 đây là network id của bạn, những người khác có thể kết nối với bạn thông qua network id này. Bạn có thể thay đổi bằng một số khác để chắc chắn rằng không ai có kết nối vào private ethereum network của bạn.

    2. Nếu thành công bạn sẽ thấy dòng sau đây xuát hiện trên cmd cai dat node dau tien trong blockchain
  6. Sau khi tạo node đầu tiên thành công chúng ta sẽ khởi động Geth và kết nối  Geth vào private blockchain network bằng đoạn code dưới đây
    geth --datadir=./chaindata/

    Khi khởi động và kết nối Geth thành công bạn sẽ thấy Geth tạo ra 1 cái IPC Endpoint và chạy ở port 30303.
    kết nối Geth vào blockchain
    Chúc mừng bạn đã tạo thành công một private blockchain network cho mình.

Mist là gì ?

Giải thích đơn giản Mist là một ứng dụng gồm 2 phần

  1.  Là một browser dùng để lướt  web giống như Firefox , Chrome
  2. Là một  ví Ethereum , chúng ta có thể sử dụng Mist để gửi và nhận Ether

Trong bài hướng dẫn này chúng ta sẽ dùng Mist để deploy và test smart contract

Hướng Dẫn Cài Đặt Mist .

Bây giờ chúng ta bỏ chút ít thời gian ra download và cài đặt Mist

    1. Vào  https://github.com/ethereum/mist/releases  download phiên bản installer mới nhất (hiên tại là Mist-installer-0-9-3.exe ) Mist download version
    2. Chạy file cài đặt và chọn “I Agree”

    3. Chọn thư mục cài đặt C:\Program Files\Mist (mặc định) và click “Next” mist install step 2
  1. Chọn thư mục  lưu data của blockchain mặc định là  ..\Roaming\Ethereum và click “Install” cài đặt mist data blockchain path

Kết nối Mist Với Private Blockchain

Chúng ta đã tạo ra 1 private blockchain và đã cài đặt hoàn tất Mist , bây giờ chúng ta sẽ kết nối Mist vào private blockchain

  1.  Khởi động private blockchain  đoạn code sau đây
     geth --datadir=./chaindata/

    nếu private blockchain của bạn đang chạy thì hãy bỏ qua bước này

  2. Khởi động Mist, Mist sẽ tự động kết nối vào private blockchain của bạn . Nếu thành công Mist sẽ xuất hiện chữ “Private Blockchain” bên góc phải
     khởi động mist
  3. Chọn “Launch Apllication” để bắt đầu

Cơ Bản Về Mist !

cơ bản về mist

  1. Ở trên cùng là thanh menu , dùng để quản lý mist
  2. Ở menu bên trái  chúng ta sẽ thấy nhiều tab khác, khi click vào tab màu xanh lá chúng ta sẽ mở ví Ethereum
  3. Như bạn thấy , chúng ta đã kết nối được vào ví Ethereum thông qua địa chỉ https://wallet.ethereum.org/ . Hãy nhớ rằng Mist đơn giản là một browser . Với Mist bạn có thể dùng để xem các giao dịch trong quá khứ, gửi ether, deploy contract …
  4. Chọn tab “Wallet”, chúng ta có thể xem thông ti chi tiết của tài khoản , tạo tài khoản mới, tạo smart contract và cũng  có thể kiểm tra các giao dịch trong quá khứ
  5. Bây giờ chúng ta sẽ tạo một tài khoản mới bằng cách click vào “Add Account” kế tiệp chọn “Create New Account ”  sau đó hãy nhập password và chọn “ok” tao account moi mistchọn tab “Send”  chúng ta thể gửi ether từ ví này sang ví khác hoặc thậm chí từ ví đến smart contract. Như bạn thấy bên dưới, trước khi nhấn gửi, chúng tôi sẽ có thể  tùy do đặt giá gas (phí) cho mỗi giao dịch. Tất cả các giao dịch trong Ethreum cần tiêu tốn số lượng “gas” được xem là một loại phí. Tùy thuộc vào tốc độ mà bạn muốn giao dịch được xử lý và chấp thuận bởi blockchain, bạn  có thể điều chỉnh lượng gas cho phù hợp ,lượng gas càng cao thì độ ưu tiên để xử lý càng cao.gui ether trong mist
    Cuối cùng, ở tab “Contract” chúng ta có thể deploy một smart contract mới, xem các smart contract hiện tại và xem các token đã được tạo ra. Đây là nơi chúng ta sẽ tạo và deploy 1 smart contract mới tên là “Hello World!” .
    Ngoài ra Mist cũng hỗ trợ các chức năng khác như “Watch Contract” và “Watch Token”. Nếu bạn  muốn xem lại các hợp đồng đã được deploy trước đó, bạn có thể nhấp vào “Watch Contracts” và nhập tên của hợp đồng, địa chỉ hợp đồng, và hợp đồng ABI (application binary interface).

Web3.js là gì ?

Tới đây , chắc nhiều bạn thắc mắc  “Làm thế nào mà Mist có thể kết nối ví  Ethereum và tương tác với blockchain Ethereum?”

Mist chỉ đơn thuần là một trình duyệt web sử dụng thư viện Web3.js và thư viện này có thể giao tiếp với Ethereum node hoặc tương tác với một smart contract đã được deploy trên blockchain.

Nếu bạn muốn tìm hiểu thêm về Web3.js, xem tài liệu tại đây: https://github.com/ethereum/wiki/wiki/JavaScript-API

Remix Web Browser IDE là gì ?

Bắt đầu viết code thôi 🙂 ! để tạo ra một smart contract chúng ta sẽ xài một ngôn ngữ lập trình tên là “Solidity ”  , thay vì  viết code “Solidity” trực tiếp trong Mist chúng ta sẽ code trên IDE online của Ethereum  https://remix.ethereum.org , tại sao nên sử dụng Remix IDE ? Remix hỗ trợ một số chức năng hỗ trợ lập trình viên code dễ dàng hơn. Remix IDE thích hợp để code những smart contract nhỏ , đơn giản. Remix hỗ trợ những tính năng sau đây:

  • Debugger
  • Cảnh báo những đoạn code không an toàn, tiêu tốn nhiều gas ,  kiểm tra tên biến  đã được khai báo
  • Môi trường Test  và  development
  • Syntax & error highlighting
  • Có thể gọi những Object của Web3.js
  • Deploy trực tiếp lên MetaMask hoặc Mist

ethereum IDE

Khung màu trắng ở giữa trang là chổ để viết code . Bên trái là thanh menu dùng để quản lý file. Bên phải  chúng ta thấy  rất nhiều những tính năng khác như “Compile” tab cho phép compile smart contract khi hoàn thành . Nếu click vào “Detail” Remix IDE sẽ hiển thị ra thông tin chi tiết của Smart Contract ví dụ như tên của smart contract, metadata, bytecode , ABC …

thông tin chi tiết smart contract

Bên cạnh đó còn các menu khác như  “Settings”, “Debugger”, “Analysis”, và “Support” mỗi menu đều có tính năng riêng và rất hay, mình sẽ tìm hiểu về nó ở những bài sau, ở bài này chúng ta sẽ sử dụng về “Run” tab. Nếu click vào “Run” tab các bạn sẽ thấy có rất nhiều tùy chọn khác nhau
 remix run tab

Environment: Remix hỗ trợ 3 loại môi trường khác nhau. Hai môi trường Web3 Provider và Injected Web3 yêu cầu chúng ta phải làm việc với các công cụ bên ngoài như MetaMask hoặc Mist. JavaScript VM thì cho phép thực thi ngay trên  trình duyệt của chúng ta mà không cần tới Mist hay MetaMask.

Account: Remix cung cấp 5 tài khoản khác nhau với 100 Ether trong mỗi tài khoản! Những tài khoản này sử dụng trong quá trình code và test smart contract.

Gas Limit: Đặt lượng gas (phí) tối đa sẽ phải tiêu tốn cho smart contract của bạn.

Gas Price: Đặt một lượng gas cần thiết  phải tiêu tốn khi gọi smart contract.

Value: deploy smart contract với X lượng Ether kèm theo.

Cuối Cùng, Solidity Là gì?

Nếu bạn  đã quên thuộc với javascript thì làm việc về Solitity rất dễ dàng . Giống như Javascript, Solidity là một ngôn ngữ cấp cao  được thiết kế để chạy được trên Ethereum Virtual Machine (EVM). Hỗ trợ thừa kế, thư viện và tạo ra các kiểu dữ liệu khác nhau.

Trong Smart Contract “Hello World!”, Chúng ta sẽ tạo ra một biến được gọi là counter và gán cho nó một giá trị khởi đầu là 5. Sau đó chúng ta sẽ tạo một hàm để tăng biến counter lên 1, một hàm làm giảm biến counter xuống 1, một hàm trả về biến counter 

Việc đầu tiên khi code với Solidity là phải khai báo version , version hiện tại của Solidity là 0.4.20 , để khai báo version trong solidity chúng ta sẽ code như sau :

 pragma solidity ^0.4.20;

Bạn có thể vào đây để xem chi tiết hơn về Solidity : https://solidity.readthedocs.io/en/develop/index.html

Xây Dựng Smart Contract “Hello World”

Bây giờ chúng ta sẽ bắt đầu tạo ra smart contract tên là “Hello World”

 
pragma solidity ^0.4.20;
contract HelloWorld {

}

Lưu ý contract là keyword bắt buộc khi tạo một contract , Hello World là tên của contract

Kế tiếp chúng ta sẽ thêm vào một biến tên là counter. Hãy nhớ rằng, chúng ta sẽ chỉ định biến counter này là một số nguyên unsigned 256 bit (unsigned nghĩa là kiểu dữ liệu này là số nguyên dương, chứ không phải dương hay số âm. 256 bit dung lượng trong Ethereum Virtual Machine). Và đặt cho nó một giá trị là 5.

pragma solidity ^0.4.20;
contract HelloWorld {
    uint256 counter = 5;
  
}

Tiếp tục chúng ta sẽ thêm 2 function . 1) function tăng biến counter lên 1 . 2) function giảm biến counter xuống 1.

 
pragma solidity ^0.4.20;
contract HelloWorld {
 
 uint256 counter = 5; 
 function add() public {  //tang bien counter len 1
  counter++;
 }
 
 function subtract() public { //giam bien counter xuong 1
  counter--;
 }
}

Bạn có thể thấy trong 2 function đã tạo ra ở trên đều có quyền truy xuất là public. Solidity hỗ trợ 4 loại quyền truy xuất (access modifier) khác nhau : external, public, private, internal , mặc định là public . Nếu bạn không chỉ ra quyền truy xuất cho một function , Remix IDE sẽ cảnh báo và ngầm hiểu hàm đó có quyền truy xuất là public.

Bây giờ giá trị của biến counter sẽ thay đổi khi chúng ta gọi hàm add và hàm subtract , để kiểm tra giá trị của biến counter chúng ta sẽ thêm vào 1 hàm tên là getCounter

 
pragma solidity ^0.4.20;
contract HelloWorld {
 
 uint256 counter = 5; 
 function add() public {  //tang bien counter len 1
  counter++;
 }
 
 function subtract() public { //giam bien counter xuong 1
  counter--;
 }
 function getCounter() public constant returns (uint256) {
     return counter;
 } 
 
}

Lưu ý : Chúng ta cần sử dụng một lượng gas nhất định khi gọi function trong smart contract được gọi , nếu function đó chỉ return một biến constant thì không cần tiêu tốn gas , như trên hàm add subtract sẽ tốn gas khi gọi, nhưng hàm getCounter thì cần.

Tuyệt vời! bây giờ chúng ta đã tạo xong một smart contract để thay đổi giá trị của biến counter. Chúng ta cũng có thể tăng nó lên 1, giảm nó xuống 1, và trả lại giá trị của counter bất cứ khi nào chúng ta muốn.

Bắt Đầu Test Smart Contract

Hãy chắc chắn bạn đã hoàn thành những bước sau đây

  • Code bạn đã có đầy đủ trên Remix IDE
  • “Auto Compile” trong compile tab đã được bật
  • Trên tab “Run” hãy chọn Environment là Javascript VM , sau đó chọn một account bạn muốn sử dụng .  Mặc định gas limit sẽ là 3000000, và  value là 0

Nhấp vào “Create” trên tab “Run” . Bây giờ, bạn sẽ thấy smart contract của bạn được tạo ra như bên dưới.

tạo smart contract

Như bạn có thể thấy 3 functions add, substract , getCounter chúng ta code đã được Remix IDE liệt kê ra, bên cạnh đó bạn cũng có thể thấy biến counter đã được assign giá trị là 5. Bây giờ hãy click vào add để tăng biến counter lên 1 . Kế tiếp click vào hàm getCounter để lấy giá trị của biến counter ,lúc này biến counter có giá trị là 6
gia tri smart contract

Deploy Smart Contracts Lên Mist

Chúng ta đã test và xác nhận rằng Smart Contract đã chạy đúng trên Remix IDE , bây giờ hãy deploy smart contract đó lên Mist (Mở Mist và kết nối Mist vào Private Blockchain)  . Di chuyển vào “Contract” tab trong Ethereum wallet , tiếp theo click vào “Deploy New Contract”  , sau đó copy và past code từ Remix Browser vào “solidity contract source code” trong Mist

mist code box

Trước khi qua bước tiếp theo, chúng ta cần phải có một lượng Ether trong ví . Chúng ta có thể khai thác cho Ether  trên “Private Blockchain”  bằng cách tạo ra các thợ khai khác thông qua “Geth”.

Mở một cmd khác  di chuyển vào folder của private blockchain “C:\Users\Window\Desktop\Private Blockchain” và gõ vào lệnh sau đây: geth attach . Sau đó Geth sẽ chuyển sang chế độ console . Hãy bắt đầu khai thác Ether bằng lệnh miner.start(1); , bạn sẽ thấy Geth Console trả về một giá trị null hoặc “true”. Bây giờ hãy mở Mist lên các bạn sẽ thấy Ether trong account sẽ tự động tăng lên. Để dừng khai thác Ether thì dùng lệnh miner.stop()

ether trong mist
Bạn có thể tham khảm nhiều lệnh khác tai đây: https://github.com/ethereum/go-ethereum/wiki/JavaScript-Console

Trở lại với “Contract” tab trong mist, hãy chắc chắn rằng bạn đã copy và past code vào Mist. Tại menu bên phải “SELECT CONTRACT TO DEPLOY” chọn tên contract bạn muốn deploy , sau click vào “Deploy”
deploy contract mist

Sau đó hãy nhập password vào để xác nhận bạn muốn deploy smart contract này
nhap password confirm transaction mist

Sau đó quay về tab “Wallet” các bạn sẽ được Mist thông báo rằng smart contract cần phải có 12 xác nhận từ các miner để deploy thành công
xac-nhan-tu miner de tao smart contract

Lý do smart contract chưa được deploy thành công là vì trên private network của chúng ta chưa có miner nào hoạt động để xác nhận tiến trình deploy smart contract. Bạn hãy vào Geth và chạy lệnh miner.start(); , sau khi chạy lệnh đó thì miner đã hoạt động và smart contract của chúng ta sẽ được xác nhận .

Sau khi smart contract đã được deploy thành công bạn hãy vào tab “Contract” chọn smart contract “Hello World” , bên tay phải sẽ có menu tên là “Select Function” hãy chọn function trong smart contract mà bạn muốn chạy và click execute

chay-function-trong-smart-contract-mist

Lưu ý: Mỗi lần gọi function trong smart contract đều phải có sự xác nhận của các miner nên hãy chắc chắn rằng bạn đã khởi động miner bằng lệnh miner.start();

Post Author: admin

Leave a Reply

Your email address will not be published. Required fields are marked *