Ethereum 101: Smart Contract, ERC20 Token, ICO (Vietnamese)

Hồ Tiến Vũ
dltvn
Published in
9 min readJan 28, 2018

Chắc hẳn ai trong số chúng ta khi tìm hiểu về Bitcoin, blockchain hay cryptocurrency đều đã từng nghe qua những cái tên như Ethereum(ETH), Smart Contract (SC), ETC20 Token, ICO. Đây là những khái niệm gắn liền với Ethereum, một công nghệ blockchain đột phá trong những năm gần đây. Nếu như Bitcoin làm một cuộc cách mạng trong giao dịch điện tử phân tán (decentralized e-payment)bằng công nghệ blockchain thì Ethereum đã mở ra một kỉ nguyên mới cho phép các ứng dụng Internet hoạt động trên nền tảng blockchain mà không bị ràng buộc (trustless) bởi bất kì một tổ chức hay cá nhân nào. Các ứng dụng này được vận hành bởi những Smart Contract mà mình sẽ giải thích trong bài viết này.

Bitcoin Script (BCS)

Như các bạn đã biết, một trong những ứng dụng của Bitcoin đó là hệ thống thanh toán phân tán điện tử(nguyên gốc: peer-to-peer Electronic Cash System). Các giao dịch trong Bitcoin network luôn được chứng thực bởi các miner sử dụng phương thức đồng thuận Proof of Work (POW). Các miner có nhiệm vụ sau đây:

  1. Chứng thực các giao dịch, nhưng giao dịch ko khớp với lịch sử của sổ cái (distributed Ledger), hoặc ko phải do chính chủ thực hiện sẽ bị loại bỏ
  2. Khi 1 trang giao dịch đầy, tìm mã niêm phong (nonce) trang giao dịch (block), mã này sau khi tìm ra sẽ được thông báo cho cả network cùng với nội dung của trang giao dịch. Trang giao dịch sẽ được thêm vào block chain, các giao dịch trong block sẽ được coin là vĩnh viễn.

Một trong những tính năng của Bitcoin là cho phép ngươì dùng (ở đây là lập trình viên) thực thi một số logic nhất đinh trên mỗi giao dịch. Tính năng này được gọi là Bitcoin Script. Trên khía cạnh lập trình, Bitcoin script là một phương thức(method) luôn trả về 1 trong 2 giá trị Success or Failure. Những phương thức này cho phép những miner thực hiện 1 số việc vd như:

  1. Kiểm tra signature với public key của sender xem giao dịch có thuộc chính chủ hay ko
  2. Kiểm tra multisig (giao dịch cần sự đồng thuận của nhiều chính chủ)
  3. Pay-to-Script-Hash (đẩy quá trình kiểm thử giao dịch này đến người nhận thay vì người gửi, lưu trữ hash của BCS thay vì nội dung)
  4. errors, proof of burn, vv

Ví dụ để kiểm tra giao dịch có được gửi bằng chính chủ hay không, ta thực hiện dòng lệnh sau

<sig> <pub_key> OP_DUP OP_HASH160 <pub_key_hash?> OP_EQUALVERIFY OP_CHECKSIG

Bạn ko cần hiểu cụ thể về dòng lệnh trên, chỉ cần chú ý những điểm sau

  • Dòng lệnh được thực hiện theo trình tự tứ trái sang phải
  • các giá trị sẽ được lưu trong vùng nhớ theo thứ tự stack (ngăn sếp)
  • Các mã lệnh bắt đầu bằng OP_, Bitcoin có hơn 100 mã lệnh lưu dưới dạng HEX, chi tiết có thể xem thêm ở đây https://github.com/bitcoin/bitcoin/blob/master/src/script/script.h

So với các ngôn ngữ phổ biến khác BCS có nhiều điểm hạn chế:

  • Không có vòng lặp, mục đích để đảm bảo method luôn kết thúc trong 1 số bước hữu hạn (ko lặp vô hạn). Điều này làm cho BCS mất tính Turing-complete của một ngôn ngữ. Hiểu nôm na ta không thể dùng BCS để viết một chương trình để giải quyết một bài toán bất kì.
  • Các giá trị gói gọn trong một giao dịch. Bạn không thể sử dụng lại cái giá trị này trong những giao dịch sau đó cũng như không thể lập trình giải quyết nhiều bài toán theo mô hình Finite State Machine.

Ethereum

Ethereum là một công nghệ Blockchain được phát minh bởi Vitalik Buterin, một lập trình viên người Canada. Ethereum là một nền tảng (platform) cho phép xây dựng những ứng dụng phân tán (decentralized app hay viết tắt là ...Đapp) trên nền blockchain. Điểm khác biệt mấu chốt và cũng là cách mạng hoá của Ethereum so với Bitcoin đó chính là Smart Contract (SC). Vậy Smart Contract là gì?

Smart Contract là một chương trình máy tính được viết bởi một ngôn ngữ lập trình Turing-complete (đây là điểm khác biệt với BCS). Chương trình này được thông dịch thành bytecode và được lưu trên blockchain dưới dạng Contract đi kèm với 1 địa chỉ duy nhất. Ta có thể dùng địa chỉ này để tương tác với SC cũng như thực thi các phương thức (method) được cung cấp bởi SC. Việc thực thi các phương thức này được thực hiện bởi máy ảo EVM (Ethereum Virtual Machine) được đi kèm với Ethereum client mà miner sử dụng. Mỗi SC có thể lưu trữ những giá trị của riêng (state) và việc thay đổi các giá trị này phải được đồng thuận bởi cả blockchain (một thay đổi tương đương với một giao dịch)

Việc khởi tạo (deploy) một SC cũng tương tự như ta thực hiện một giao dịch. Bitcoin và Ethereum cho phép ta truyền dữ liệu vào cuối mỗi giao dich. Dữ liệu này có thể bao gồm mã biên dịch (bytecode)của SmartContract. Sau khi SC được khởi tạo và được thêm vào blockchain, ta có thể gọi các phương thức(method) mà SC đó cung cấp như ta gọi một chương trình máy tính thông thường. Đọc đến đây bạn có thể có thắc mắc:

  • Nếu như ai đó vì lí do vô tình hay cố ý viết một phương thức lặp vô hạn Điều này sẽ làm treo máy ảo EVM và tê liệt luôn cả hệ thống Ethereum
  • Hacker có thể tấn công từ chối dịch vụ (DOS) hoặc spam network bằng cách lạm dụng việc thực thi các method 1 cách tuỳ tiện.

Để chống lại 2 rủi ro trên, mỗi phương thức cần sự đồng thuận của toàn hệ thống sẽ được thực thi trong một giao dịch tương tự như giao dịch Bitcoin. Giao dịch này sẽ được thực hiện giữa người gọi(caller) với SC. Đây là lí do vì sao mỗi SC cần có 1 địa chỉ riêng trong blockchain. Giao dịch này sẽ được tính phí dựa vào khối lượng tính toán mà phương thức phải thực hiện. Mỗi giao dịch bao gồm:

  • Địa chỉ người nhận (trong trường hợp SC thì đây là địa chỉ của SC được tương tác)
  • Signature của người thực hiện giao dịch (sender/caller)
  • Khối lượng Ether muốn gửi(có thể bằng 0)
  • Dữ liệu cần gửi (bao gồm phương thức và tham số của SC cần thực thi)
  • STARTGAS: GAS được dùng như nhiên liệu cung cấp cho mỗi giao dịch. Nhiên liệu này được dùng cho việc lưu trữ dữ liệu cũng như thực thi các mã lệnh của SC. STARGAS quy định số lượng tối đa nhiên liệu dùng cho mỗi giao dịch
  • GASPRICE: giá GAS cho mỗi đơn vị tính toán. Đơn vị WEI (1 WEI = 10^-18 ETHER)

Như vậy nếu giao dịch cuả bạn quy định tối đa 10 GAS đơn vị tính toán, GASPRICE là 10 WEI cho mỗi GAS . Phí giao dịch sẽ là 10 x 10 = 100 WEI. Sau khi giao dịch kết thúc, 1 lượng phí tương đương với lượng GAS đã xử dụng sẽ được trả cho miner, phần còn lại sẽ được gửi lại cho người thực hiện giao dich. Nếu vì một lí do nào đó giao dịch cần nhiều GAS hơn STARTGAS, giao dịch này sẽ ngay lập tức chấm dứt, trạng thái của SC sẽ được rollback về trạng thái trước khi giao dịch xảy ra. Tuy nhiên bạn sẽ không nhận lại được bất kì một WEI nào vì số lượng này đã đươc tiêu hết trong giao dịch.

ERC20 Token

Nếu bạn vẫn còn kiên trì đọc đến đây thì xin chúc mừng, bạn đã sẵn sàng gia nhập clb ICO triệu đô :P. Chắc hẳn thuật ngữ Token đã không còn xa lạ với những ai quan tâm đến cryptocurrency. Token về cơ bản là một văn bản tượng trưng cho quyền sở hữu của một hay nhiều cá nhân với một tài sản (asset). Tài sản ở đây có thể là rất nhiều thứ ví dụ như điểm thưởng, cổ phiếu, vật dụng số hay thậm chí là vàng, bất động sản, vv. Token này có thể được trao đổi giữa nhiều cá nhân.

Trong hệ thống Ethereum blockchain, Token là một Smart Contract. Để cho việc chuyển giao, trao đổi cũng như mua bán Token được thuận lợi, Ethereum quy định một chuẩn giao thức (protocol) chung cho các Token. Giao thức này bao gồm các phương thức mà 1 Token phải thực hiện. Mọi Token tuân theo giao thức này được gọi chung là ERC20 Token. Các công nghệ khác như NEO có chuẩn riêng gọi là NEP-5 vv.

  1. TotalSupply [Tổng số Token được phát hành]
  2. BalanceOf (address _owner) constant returns (uint256 balance) [truy vấn số lượng Token 1 cá nhân sở hữu]
  3. transfer(address _to, uint256 _value) returns (bool success) [gửi số lượng _value Token của người thực hiện giao dịch (caller) tới một địa chỉ _to]
  4. transferFrom(address _from, address _to, uint256 _value) returns (bool success)[Gửi Token _value Token từ caller thông qua địa chỉ _from đến địa chỉ _to, cần sự đồng thuận của caller cho địa chỉ _from, xem phương thức approve() ở dưới]
  5. approve(address _spender, uint256 _value) returns (bool success) [Cho phép _spender tiêu 1 lượng Token tối đa là _value từ account của caller.
  6. allowance (address *_owner*, address *_spender*) constant returns (uint256 remaining) [Trả về số lượng Token địa chỉ _owner uỷ quyền cho _spender ]

Chi tiết về các phương thức này bạn có thể xem thêm ở

Một ERC20 Token sau khi được deploy sẽ như một cuốn sổ cái phân tán (distributed ledger) với nội dung chỉ có thể được thay đổi bởi các giao dịch được đồng thuận của cả network. Trong 1 ERC20 Token ta thường có 2 bảng giá trị

Tên: XYZ  
Số lượng tối đa: 1,000,000,000
Balance: Bảng giá trị lưu số lượng Token được sở hữu bởi các cá nhân trong mạng Ethereum (bao gồm các SC). Balance được update khi SC thực thi các phương thức như transfer, transferFrom
╔═════════╦═════════╗
║ Địa chỉ ║ Số lượng║
╠═════════╬═════════╣
║ 0x1 ║ 10000 ║
║ 0x2 ║ 20000 ║
║ 0x3 ║ 30000 ║
╚═════════╩═════════╝
Allowance: Bảng giá trị cho quy đinh số lượng Token được một địa chỉ cấp phép cho một địa chỉ khác sử dụng. Thường được dùng khi chuyển Token lên sàn giao dịch. Allowance được update khi SC thực thi phương thức approve ╔═════════╦═════════════════╦═════════╗
║ Địa chỉ ║Đỉa chỉ uỷ quyển ║Số lượng ║
╠═════════╬═════════════════╬═════════╣
║ 0x1 ║0x2 ║200 ║
║ ║0x3 ║100 ║
║ 0x2 ║0x4 ║300 ║
╚═════════╩═════════════════╩═════════╝
Ở đây, 0x2 và 0x3 được sự cho phép của 0x1 có được quyền giao dịch với số lượng Token tương ứng là 200& 100 Token. Lượng Token này khi được giao dịch sẽ bị trừ vào lượng Token mà 0x1 nắm giữ.

Một điều cần lưu ý đó là tất cả các giao dịch cho một Token đều được thực hiện trên hệ thống blockchain của Ethereum vì vậy bạn sẽ phải có 1 lượng Ether tối thiểu để có thể giao dịch. Ether, đơn vị trao đổi chính của Ethereum cũng có thể coi là 1 Token với đia chỉ 0x0.

ICO

ICO (viết tắt của Initial Coin Offerring) là một cách thức gọi vốn crowd funding bằng cryptocurrency. Đây là cách mà các startup về Blockchain hay DLT (Distributed Ledger Technology) thường dùng để gọi vốn. Thay vì đóng góp bằng tiền thật (fiat), các nhà đầu tư sẽ đóng góp bằng Ether hay các cryptocoin khác để đổi lại một phần sở hữu của dự án. Một crowd funding trên nền tảng Ethereum bao gồm các thành phần sau:

  • White paper: miêu tả dự án, sản phẩm
  • Yellow paper: tuỳ dự án, miêu tả khía cạnh kĩ thuật, lí thuyết, phương trình, chứng minh toán học của sản phẩm
  • Sáng lập viên, đội ngũ vận hành, những người cố vấn (advisor)
  • Roadmap của dự án, minimum viable product (MVP)
  • ERC20 Token: Như miêu tả ở trên, đây là một Smart Contract. Smart Contract này sẽ chứng thực cho quyền sở hữu của nhà đầu tư với 1 phần của dự án. Sau khi dự án chính thức đưa vào hoạt động, Token này sẽ được tách khỏi Ethereum network và chuyển sang một hệ quy chiếu tương ứng.
  • ICO Contract: quy đổi tiền đầu tư (Ether) sang lượng Token nhất định và xác nhận quyền sở hữu lượng Token này cho nhà đầu tư đồng thời định mức soft-cap& hard-cap của crowd sale.

Với sự bùng nổ của Blockchain và cryptocurrencies, việc gọi vốn bằng ICO đã trở thành một phương thức gọi vốn cực kì hiệu quả. Tuy nhiên rủi ro đi kèm cũng rất lớn khi mà hiện nay có hàng chục ICO và ERC20 Token mọc ra như nấm sau mưa mỗi ngày. Thêm vào đó, các nước như Trung Quốc, Hàn Quốc cũng đã bắt đầu thắt chặt thậm chí cấm hoàn toàn mọi hình thức ICO đối với công dân các nước này. Tuy vậy cũng có những ICO khá thành công và đang dần khẳng định tầm quan trọng của công nghệ blockchain nói riêng cũng như DLT nói chung.

Trong bài tiếp theo mình sẽ đề cập đến một ứng dụng nữa của Smart Contracts đó là các ứng dụng phân tán hay còn gọi là Đapp.

Tài liệu tham khảo:

  1. https://en.bitcoin.it/wiki/Script
  2. https://github.com/ethereum/wiki/wiki/White-Paper
  3. https://www.ethereum.org/token
  4. https://theethereum.wiki/w/index.php/ERC20_Token_Standard
  5. https://www.ethereum.org/crowdsale

--

--

Hồ Tiến Vũ
dltvn
Editor for

Programmer. Geek. Tolkien fan. Vi user. Made in Vietnam