31/08/2018, 15:57

Blockchain cơ bản – Học lập trình Ethereum (P1)

Kì trước, tôi đã có bài viết Solidity cơ bản . Nó được thiết kế để dùng cho Ethereum Virtual machine (EVM). Trong bài này, chúng ta sẽ đi sâu hơn và dùng test environment cho contract của mình. Từ đó chúng ta sẽ hiểu được cách thức Ethereum hoạt động như thế nào. Ethereum là gì? ...

Kì trước, tôi đã có bài viết Solidity cơ bản. Nó được thiết kế để dùng cho Ethereum Virtual machine (EVM). Trong bài này, chúng ta sẽ đi sâu hơn và dùng test environment cho contract của mình. Từ đó chúng ta sẽ hiểu được cách thức Ethereum hoạt động như thế nào.

Ethereum là gì?

Ethereum (ETH) là một loại cryptocurrency được xây dựng vào năm 2013 bởi Vitalik Buterin, thường được gọi là Bitcoin 2.0. Đây không chỉ là một đồng tiền tệ mà nó còn là nền tảng tạo ra nhiều ứng dụng khác thông qua ngôn ngữ lập trình của mình.

Ethereum hoạt động trên một Blockchain tương tự như Bitcoin, chúng ta có thể khai thác ETH thông qua đơn vị tiền tệ Ether.

Ethereum còn là một nền tảng ứng dụng hữu ích và đã tạo ra được một hệ sinh thái tài chính phân tán cho riêng mình.

Lí do Ethereum ra đời là dựa trên ý tưởng Vitalik Buterin muốn khắc phục những nhược điểm của Bitcoin như phí thanh toán, thời gian thanh toán chậm và khuyến khích khai thác thông qua các mining-pool thay vì khai thác riêng lẻ như Bitcoin.

Các tool

Trong bài này, chúng ta sử dụng truffle và ganache-cli. Truffle là một framework của lập trình Ethereum, cho phép tạo test environment, viết test cho contract và nhiều thứ khác nữa. Bài viết này chúng ta chỉ dùng nó để tạo test environment.

ganache-cli sẽ được dùng kết hợp với truffle để tạo ra một test environment đầy đủ tính năng. Phần chúng ta chuẩn bị làm sẽ không thật sự giống với blockchain trên thực tế, nhưng sẽ phần nào hình dung được cách thức hoạt động của nó.

Install các tool

  • truffle: [sudo] npm install -g truffle
  • ganache-cli: [sudo] npm install -g ganache-cli

Chuẩn bị

Đầu tiên, chúng ta cần mở một truffle project. Để làm được, tạo một directory mới, và trong nó, hãy run truffle init.

Bây giờ bạn sẽ có khá nhiều folder. Mở truffle-config.js và dán đoạn này vào:

Đối với người Windows, bạn có thể remove file truffle.js để tránh conflict. Đối với những hệ điều hành khác, bạn có thể giữ lại cả hai, và bỏ đoạn code này vào truffle.js, hoặc cứ làm như người dùng Windows không sao cả.

File này thể hiện rằng development network của chúng ta sẽ chạy trên localhost:7545.

Tiếp theo, trong folder contracts, tạo một file DeveloperFactory.sol. Đây cũng là chỗ chúng ta sẽ viết contract của mình. Hãy bỏ đoạn code này vào:

Nếu bạn muốn biết chi tiết chuyện gì đang xảy ra hãy xem bài viết về Solidity của tôi. Nói ngắn gọn thì, contract này được call để tạo một Developer struct có name và tag. Trong ví dụ này, để tạo một Developer mới cần 5 ether (5000000000000000000 wei, hạng thấp nhất trên Ethereum).

Tiếp theo, vào folder migrations và tạo ra một file 2_deploy_contracts.js:

Trong file này, ta sẽ import contract và deploy nó trên blockchain.

Launch test environment

Mở một cửa sổ terminal mới và chạy ganache-cli -p 7545. Nó sẽ chạy ganache-cli trên  port 7545 (tương tự như cái chúng ta xác định trên file truffle-config.js) và tạo một vài accounts. Mỗi account có 100 ether mặc định. Bạn sẽ thấy trong console một cái giống thế này:

Dĩ nhiên, các address của account sẽ khác nhau, nhưng bạn sẽ có khoảng 10 giây để tìm hiểu.

Bây giờ, hãy quay lại cửa sổ terminal ban đầu. Hãy đảm bảo rằng bạn đã ở trong folder bạn tạo và chạy: truffle compile, và chạy truffle migrate --network development. Nó compile code chúng ta thành một ngôn ngữ mà Ethereum Virtual Machine (EVM) có thể hiểu được, ở đây ganache sẽ mô phỏng EVM.

Nếu mọi thứ suôn sẻ thì terminal của bạn sẽ trông như sau:

Chú ý ganache-cli output mà contract đã tạo ra:

Console

Hãy chạy truffle console --network development ngay trên terminal window mà bạn đã chạy các truffle command. Nó sẽ launch truffle console và cho phép bạn tương tác với blockchain của mình. Chúng ta sẽ dùng Web3 Javascript API cho dễ. Đầu tiên, hãy dùng một account và bỏ nó vào 1 variable:

Rồi chạy command sau:

Nó sẽ assign contract vào Factory variable. Nhớ rằng account có 100 ether:

Method getBalance sẽ trả về kiểu BigNumbertoNumber() sẽ đưa balance về cho account trong Wei. Sau đó ta sẽ covert nó về ether bằng fromWei().

  • Tạo một Developer

Hãy gọi function này là createRandomDeveloper. Như bạn thấy, function này cần 2 parameter, một string _name và một uint _age. Vì chúng ta cần đến 5 ether để call function này, ta phải làm rõ nó trong function call:

Factory là một contract instance. Chúng ta đưa vào 3 parameters vào function. Damien là _name, 26 là _age. Cái thứ ba là một object có key from để biết được account nào đang call nó, và một key value để xác định value được gửi bởi account đó. Ở đây, from value là account, variable chúng ta đã tạo trước đó. Chúng ta sẽ covert 5 ether Wei để tương thích với value cần trong contract.

Terminal của bạn sẽ hiện như sau:

Việc chuyển đổi đã thành công. Có rất nhiều info ở đây. Chúng ta có thể thấy event ‘NewDeveloper’ đã bị bỏ đi như dự kiến, có thêm hash, block hash, lượng gas đã dùng,… Còn balance của account là như sau:

Chứ ý rằng nó không phải 95 ether. Đó là do khi bạn tương tác với contract, bạn cũng phải trả thêm ether để thực hiện chuyển đổi. Chúng ta có cumulativeGasUsed (148160) trong thông tin của giao dịch, có nghĩa là 148160 Wei đã được dùng để thực hiện giao dịch này. Chúng ta lấy số này nhân với gasPrice. Mọi giao dịch đều có gasPrice. Chúng ta có thể lấy giá trị này bằng transactionHash, rồi nhân nó với cumulativeGasUsed để biết chi phí giao dịch bằng đơn vị ether: