131 lượt xem

Smartcontract: Bản chất là các phần mềm, source code, script


Smartcontract bản chất là các “phần mềm”/”source code”/”script” có thể thực thi được trên blockchain. Vậy “phần mềm” này được lưu và thực thi ở đâu: Đương nhiên là trên blockchain rồi. Ở tất cả các node ( trừ các blockchain sharding)
Mỗi nền tảng blockchain khác nhau thì cơ chế hoạt động sẽ khác nhau. Bài viết này sẽ tập trung vào thảo luận smart contract trên ETH (và các blockchain fork/clone từ ETH). Và sẽ cố gắng mapping nó với các công việc thường ngày của dân IT để các bạn dễ hình dung.

Smartcontract của Ethereum “thường” được viết bằng solidity. Là 1 ngôn ngữ lập trình được sinh ra để viết smartcontract cho Ethereum. Trước khi deploy lên blockchain thì sẽ được biên dịch sang bytecode.

Solidity=>bytecode=>deploy lên blockchain thông qua 1 transaction==>run trên EVM

Trên 10k node Ethereum đều có chạy 1 máy ảo. gọi là EVM (ETHEREUM VIRTUAL MACHINE). Máy ảo này có hầu hết các đặc tính của 1 máy ảo thông thường. Bao gồm 1 bộ xử lý logic và tính toán, bộ nhớ…(EVM thuộc loại stack machine)

Mỗi smartcontract tương tự như 1 object (đối tượng) trong các ngôn ngữ lập trình khác. Nó có state và function.

Cùng 1 định nghĩa contract(1 source code) có thể tạo ra nhiều smartcontract khác nhau(có địa chỉ khác nhau, context khác nhau).

Cú pháp là address newContract = new ContractName(parameter). (Giống như khi bạn tạo object mới từ 1 class trong các ngôn ngữ lập trình khác)

Tại mỗi block, mỗi contract sẽ có 1 trạng thái xác định (Block của ETH sẽ lưu stateRoot) .(State bao gồm giá trị của các biến được lưu trong smartcontract,….).

Chỉ có 1 cách để thay đổi giá trị các biến này: Thông qua các function.

Có 2 loại function chính:

  • Function chỉ view (query được thoải mái từ bên ngoài thông qua RPC)
  • Function làm thay đổi state của contract (có update).

Function có update có thể được gọi đến thông qua 3 cách

  • Gọi từ 1 function khác của chính contract đó
  • Gọi tử 1 function khác của contract khác (nếu nó được chỉ định là public hoặc external). Function này cũng cần phải được bắt nguồn từ 1 transaction nào đó (Tốn phí gas)
  • Gọi từ user, bằng cách thực hiện 1 transaction(Tốn phí gas) (nếu nó được chỉ định là public hoặc external)

Số gas được tính theo số phép tính/hành động/dữ liệu mà EVM phải xử lý cho transaction đó.

Một function càng xử lý nặng thì càng tốn nhiều gas. Giá mỗi gas thì do user tự chỉ định khi thực hiện transaction. Giá mỗi gas cao thì được xác nhận nhanh (hấp dẫn các thợ mỏ hơn)

Vậy nếu muốn tạo smartcontract thì làm như thế nào:

Viết code solidity==>Biên dịch ra bytecode==>Deploy (triển khai) nó lên blockchain, thông qua 1 transaction
Mỗi khi muốn thay đổi state của smartcontract thì gọi đến 1 function của smartcontract đó

Mỗi smartcontrac khi đã deploy thì đều có 1 địa chỉ , nó cũng là 1 account, có có thể có số dư ETH, có số dư các token khác,.. giống như các ví bình thường

Giải thích về các loại smartcontract mà mọi người hay nghe

ERC20/BEP20: là 1 chuẩn chung để triển khai smartcontract token. Miễn sao các smartcontract có đầy đủ các function như chuẩn thì được gọi là ERC20 (thuật ngữ quen thuộc là interface. Các smartcontract có interface theo chuẩn ERC20.) Ngoài ra thì các smartcontract erc20 khác nhau thì logic có thể khác nhau, chỉ cần đẩy đủ các fucntion như balanceOf, totalSupply, tranfer, tranferFrom,….
Các con số như totalSupply(tổng cung) hay số dư token(balance) của 1 tài khoản là giá trị của 1 biến (hay trạng thái, thuộc tính) của 1 smartcontract. Khi A chuyển token B, nghĩa là gọi đến function tranfer, trong function tranfer thực hiện việc tăng số dư của B và giảm số dư của A. hết.

Tại sao smartcontract lại có thể bị hack:

Code nào cũng có thể có lỗi(bug) và lỗ hổng, smartcontract cũng không ngoại lệ.

Lỗi, lỗ hổng sinh ra khi lập trình viên không hiểu sâu về nền tảng, công nghệ, hoặc không lường trước được hết các trường hợp có thể xảy ra⇒ hacker sẽ sử dụng các luồng thực thi, các trường hợp mà lập trình viên không lường trước để thu lợi và phá hoại.

Việc tấn công vào các phần mềm chạy trên các máy tính truyền thống hay máy ảo evm vẫn diễn ra hàng ngày, như từ xưa đến giờ vẫn như vậy. Và sau này vẫn thế, KHÔNG CÓ CÁCH NÀO GIẢI QUYẾT TRIỆT ĐỂ.

Vậy phần mềm chạy trên các node blockchain có thể sửa được không?

Mindset chung là code không thể sửa, nhưng solidity có một số công cụ để lập trình viên làm điều tương tự: chỉnh sửa logic của 1 smartcontract.

Solidity có 1 function là “delegateCall”. Sử dụng function này thì toàn bộ các trạng thái(sate, biến,.), địa chỉ, vẫn là của smartcontract gốc, nhưng logic thực thi là của smartcontract mà nó call đến.==> khi thay đổi contract mà nó delegateCall thì logic thay đổi.

Các smartcontract proxy chính là sử dụng cách này.

(Fb Nguyễn Việt Dinh)

Thẻ tìm kiếm:

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *