Categories
Dev's Corner

Cách tương tác với Smart Contract từ một web app

Juan Cruz Martinez sẽ hướng dẫn chúng ta tạo một smart contract (hợp đồng thông minh) nhỏ để lưu trữ và truy xuất dữ liệu trên Ethereum blockchain và tạo một web app cho phép truy cập và thay đổi dữ liệu trên smart contract này.

Hãy thực hành cùng Gambaru nhé!

Smart Contract

Đầu tiên, tôi sẽ trình bày về smart contract mà ta sẽ sử dụng để xây dựng các ứng dụng web.

Vì bài viết tập trung vào việc liên kết JavaScript với blockchain, nên tôi tạo contract càng đơn giản càng tốt:

Tạo một Smart Contract đơn giản
Tạo một Smart Contract đơn giản. Xem code gốc ở đây

Hợp đồng CoolNumberContract chứa một biến trên blockchain được gọi là coolNumber với giá trị ban đầu là 10.

Biến này là public, nghĩa là ta có thể truy cập giá trị của nó từ blockchain mà không cần tạo hàm getter.

Ngoài ra, contract này chứa một hàm publicsetCoolNumber, sẽ thay đổi giá trị của biến trên blockchain.

Điều quan trọng cần nhớ ở đây là bất kỳ thay đổi nào trong dữ liệu blockchain đều cần được thể hiện bằng một giao dịch.

Có nghĩa là việc gọi phương thức setCoolNumber sẽ yêu cầu một giao dịch và giao dịch đó sẽ có phí gas đi kèm.

Hãy triển khai hợp đồng trên một test network trước khi tiếp tục.

Thiết lập project và dependency

Để tương tác với bất kỳ Ethereum blockchain nào từ JavaScript, bạn sẽ cần một library.

Trong trường hợp này, hãy sử dụng web3 https://web3js.readthedocs.io/en/v1.3.0/

Web3 sẽ cho phép tương tác với bất kỳ Ethereum network nào thông qua MetaMask hoặc provider của web3 như Ganache.

Hãy bắt đầu một project mới. Tôi sẽ sử dụng JavaScript HTML, nhưng mọi người có thể sử dụng bất kỳ framework nào mình muốn như React hoặc Vue.

Tất cả code sẽ đi vào một file là index.html và hãy bắt đầu với cấu trúc sau:

Thiết lập project và dependency
Thiết lập project và dependency. Xem code gốc ở đây

Hãy xem thử thẻ body.

Đây là một giao diện người dùng đơn giản với hai button và một khoảng biểu thị trạng thái.

Cả hai button đều gọi các hàm JavaScript mà hiện tại vẫn chưa được định nghĩa.

Trên thẻ head, thẻ quan trọng là script ta đang import. Đó là thành phần phụ thuộc vào web3.

Hãy thêm thành phần phụ thuộc này vào code như tôi đã làm hoặc nếu đang sử dụng một framework, chỉ cần import package này với:

Import Package
Import Package

Nếu chưa cài đặt library, bạn có thể thông qua NPM:

Cài thông qua NPM
Cài thông qua NPM

Cuối cùng, trước khi tiếp tục, lời khuyên là hãy cài đặt tiện ích mở rộng MetaMask.

Nếu muốn sử dụng bất kỳ provider nào khác, bạn có thể phải thay đổi các phần của code cho phù hợp, vì các sample được cung cấp sử dụng provider web3 được MetaMask đưa vào.

Kết nối web app với Ethereum Blockchain

Khi cấu trúc cơ bản và các thành phần phụ thuộc sẵn sàng, ta có thể thêm code để kết nối ứng dụng với blockchain.

Bên trong script tag ở body, hãy thêm:

Kết nối web app với Ethereum Blockchain
Kết nối web app với Ethereum Blockchain. Xem code gốc ở đây

Các đoạn code trên khá đơn giản ngoại trừ hàm loadWeb3.

Chức năng này chịu trách nhiệm thiết lập kết nối và cấp quyền tương tác với blockchain.

Để làm việc với smart contract này, ta sẽ cần một instance Web3 mới. Khi tạo instance này, cần chỉ định provider ta muốn sử dụng.

Vì đang sử dụng MetaMask làm proxy nên hãy dùng provider window.ethereum được đưa vào bởi tiện ích mở rộng MetaMask.

Khi truy cập trình duyệt và tải trang (bằng file hoặc trình duyệt web), ta sẽ thấy luồng ủy quyền MetaMask như sau:

Cấp quyền kết nối cho app thông qua MetaMask
Cấp quyền kết nối cho app thông qua MetaMask

Hãy nhấn Next Connect.

Truy cập vào smart contract

Đến lúc này, code đã có quyền truy cập để tương tác với blockchain.

Tạo một chức năng mới để tạo một contract instance phù hợp với giao diện contract.

Tạo Contract Instance
Tạo Contract Instance

Để có được một instance của bất kỳ contract nào trên blockchain, tất cả những gì chúng ta cần là: thông số ABI của contract và địa chỉ contract, cả hai đều có thể trích xuất từ ​​Remix.

Để có thông số kỹ thuật ABI của contract, hãy đến Remix trên tab Compile. Compile và nhấp vào ABI.

Sao chép ABI specification của contract
Sao chép ABI specification của contract

Nút này sẽ sao chép thông số ABI cho contract dưới dạng một JSON array trên clipboard mà ta có thể sử dụng trực tiếp như một phần của tham số đầu tiên.

Tham số thứ hai là địa chỉ contract đã triển khai, có thể lấy từ Remix tại thời điểm triển khai hoặc Etherscan.

Sao chép địa chỉ contract từ Remix
Sao chép địa chỉ contract từ Remix
Sao chép địa chỉ contract từ Remix
Sao chép địa chỉ contract từ Remix

Code chức năng hoàn chỉnh cho contract này sẽ như sau:

Code chức năng hoàn chỉnh cho Contract
Code chức năng hoàn chỉnh cho Contract. Xem code gốc ở đây

Sau khi hoàn tất, ta có thể chỉ cần gọi loadContract từ hàm loader:

Gọi loadcontract từ hàm loader
Gọi loadcontract từ hàm loader

Đọc các giá trị từ smart contract

Nay ta đã sẵn sàng để bắt đầu gọi các chức năng của smart contract và sẽ bắt đầu bằng cách lấy coolNumber từ contract này.

Có thể lấy dữ liệu từ contract rất nhanh nhờ web3. Đây là một ví dụ để lấy giá trị của biến public coolNumber:

Lấy giá trị của biến public coolNumber
Lấy giá trị của biến public coolNumber. Xem code gốc ở đây

Siêu dễ đúng không?

Sử dụng instance contract từ phần trước, hãy lấy các phương thức và gọi một hàm với tên biến (đây là getter đã được đề cập ở phần đầu), và cuối cùng, sử dụng lệnh call để bắt đầu yêu cầu từ xa.

Cập nhật các giá trị vào smart contract

Cuối cùng, cần đảm bảo rằng ta cũng có thể giao dịch với smart contract.

Do đó, hãy hiển thị một instance bằng cách truy cập hàm setter để thay đổi coolNumber được lưu trữ trong contract.

Chức năng change sẽ chỉ định một số ngẫu nhiên mới và lưu nó trên blockchain:

Truy cập hàm setter để thay đổi coolNumber
Truy cập hàm setter để thay đổi coolNumber. Xem code gốc ở đây

Có hai điều cần chú ý:

  • Đầu tiên, chúng ta đề cập đến một hàm getCurrentAccount() hiện chưa được định nghĩa. Ta sẽ làm việc này sau.
  • Thứ hai là cách gọi setter. Hãy chú ý đến dòng gọi phương thức setCoolNumber từ contract, nó trông hơi khác so với những gì đã làm cho caller:
Cách gọi setter
Cách gọi setter

Thay vì sử dụng phương thức call, ta đang sử dụng phương thức send. Ta cần xác định tài khoản người gửi. Tại sao? Phải cần một giao dịch để thay đổi các giá trị trên blockchain. Như đã nói, một giao dịch yêu cầu tài khoản từ và đến phải hợp lệ – từ người khởi tạo giao dịch và trong trường hợp này, là địa chỉ của smart contract này.

Có thể sử dụng bất kỳ tài khoản nào làm từ giá trị không? Không! Đó phải là tài khoản bạn có quyền truy cập (và trong trường hợp này, tài khoản được đăng ký trên ví MetaMask của bạn), vì bạn sẽ cần ủy quyền giao dịch và xác nhận hóa đơn tiền gas.

Vấn đề đã được giải quyết, hãy xây dựng phương thức getCurrentAccount():

Xây dựng phương thức getCurrentAccountxây dựng phương thức getCurrentAccount
Xây dựng phương thức getCurrentAccount

Web3 thực sự tuyệt vời. Mọi người có thể tương tác với blockchain và ví của mình, vì vậy có thể thông qua Web3 để yêu cầu thông tin về các tài khoản đã đăng ký trên ví. Trong trường hợp này, chỉ cần lấy tất cả và sử dụng tài khoản đầu tiên để thực hiện các giao dịch.

Vận dụng những gì đã học

Tôi đã tải code lên GitHub gist để bạn so sánh và tham khảo. Hãy thử xây dựng dự án nhỏ nhưng thú vị này nào!

Application Flow
Application Flow

Nếu thành công, bạn hãy comment phía dưới cho Gambaru biết nhé!

Theo Juan Cruz Martinez

Categories
Dev's Corner

8 Extension Visual Studio Code mọi developer phải có

Visual Studio Code là một trong những trình soạn thảo code phổ biến và được sử dụng rộng rãi nhất. Nó cũng đi kèm với rất nhiều tính năng miễn phí so với các code editor khác.

Hãy thử tải về các tiện ích mở rộng trên VS Code và bạn sẽ thấy thêm một khía cạnh khác ở các tính năng tuyệt vời này.

8 Extension Visual Studio Code

1. Turbo Console Log

Turbo Console Log là một tiện ích mở rộng xuất sắc cho việc debug.

Tiện ích mở rộng này giúp debug dễ dàng hơn bằng cách tự động hóa quá trình viết log message có ý nghĩa.

Tự động chèn log message có ý nghĩa với hai bước sau:

  • Chọn biến là chủ đề debug
  • Nhấn Ctrl + Alt + L
Turbo Console Log
Turbo Console Log. Ảnh: Medium

2. Import cost

Tốc độ là yếu tố quan trọng cho trang web. Nếu trang web hoặc ứng dụng không thể tải nhanh, thì chẳng phải có cũng như không sao.

Tiện ích mở rộng này hiển thị kích cỡ import. Bằng cách này, bạn sẽ biết khối lượng sẽ tải xuống và tìm ra nguyên nhân ứng dụng hoạt động chậm.

Với tiện ích mở rộng này, bạn có thể quyết định xem mình nên viết một function hay import toàn bộ bundle.

Import cost
Import cost

3. Prettier

Prettier dành cho tất cả mọi dev viết Python, JavaScript hoặc bất kỳ ngôn ngữ lập trình nào khác.

Cái tên nói lên tất cả, tiện ích này làm cho code đẹp hơn lên.

Cá nhân tôi rất tệ trong việc giữ cho các dòng, khoảng cách và tab bằng nhau. Do vậy, code của tôi nhìn rất lộn xộn.

Với Prettier, ngay sau khi nhấn tổ hợp lệnh + S, bạn sẽ chứng kiến điều kỳ diệu xảy ra. Tất cả code sẽ có khoảng cách chính xác và đều tăm tắp, khoảng cách các dòng cũng sẽ thống nhất.

Không ai có thể nhận ra bạn là người lộn xộn như thế nào 😐.

Prettier
Prettier. Ảnh: Medium

4. Bracket pair colorizer

Đã bao nhiêu lần xảy ra trường hợp khi chỉnh sửa code JavaScript, bạn luôn gặp khó khăn khi tìm dấu đóng mở ngoặc?

Đừng lãng phí thêm thời gian nữa chứ! Dùng tiện ích này, các dấu mở và đóng ngoặc sẽ được tô màu giống nhau và mọi việc sẽ dễ thở hơn hẳn.

Bracket pair colorizer
Bracket pair colorizer. ẢNh: Medium

5. Live share

Live share là một tiện ích mở rộng tuyệt vời để code cùng bạn bè và team.

Live share cho phép điều khiển từ xa trình soạn thảo VS code, các tệp đã mở. Một người khác có thể thay đổi và lưu code; vì vậy, giờ đây bạn có thể nhận được mọi trợ giúp từ xa.

Một tính năng khác là bạn có thể code real-time, biết ai đang type và type gì. Bên cạnh đó, nó cũng cấp quyền truy cập vào localhost và thiết bị đầu cuối.

Bonus: Bạn còn có thể tải xuống tiện ích mở rộng âm thanh Live share, bổ sung khả năng gọi âm thanh cực đỉnh. Với các dự án làm việc từ xa, đây quả là một extension miễn phí không thể hoàn hảo hơn!

6. Projects

Nếu bạn đang làm nhiều dự án cùng một lúc thì việc chuyển đổi giữa các folder quả rất khó, khi phải điều hướng đến folder cần thiết phải không.

Projects có thể hoạt động như một tab yêu thích của bạn.

Ví dụ: bạn có thể lưu trữ CSS và bootstrap tùy chỉnh trong một folder và sử dụng Projects để điều hướng giữa các folder một cách nhanh chóng.

Projects
Projects. Ảnh: Medium

7. Settings Sync

Tiện ích mở rộng này giúp lưu trữ tất cả bản sao lưu cài đặt của bạn trong GitHub. Bằng cách này, bạn có thể có các cài đặt giống nhau cho nhiều thiết bị hoặc các thiết bị mới của mình. Bất kỳ thay đổi nào đều được đồng bộ hóa liền mạch.

Setting Sync cho phép đồng bộ hóa hầu như là mọi thứ bạn tùy chỉnh trên VS Code sang Github, từ việc cài đặt phím tắt cho đến các tiện ích mở rộng VS Code khác.

8. JavaScript (ES6) Code Snippets

VS Code đi kèm với JS IntelliSense tích hợp sẵn, nhưng JS Code Snippets nâng cao trải nghiệm này hơn nữa bằng cách thêm các đoạn JavaScript snippet được tạo sẵn, chứa các đoạn code được sử dụng phổ biến nhất. Hãy nói tạm biệt việc liên tục lặp lại đoạn code! 🙌

Tiện ích mở rộng này hỗ trợ JS, TypeScript, JS React, TS React, HTML và Vue.

JavaScript (ES6) Code Snippets
JavaScript (ES6) Code Snippets. Ảnh: Medium

Còn extension nào mà bạn thấy hữu ích nữa không nhỉ? Hãy comment cho cộng đồng Gambaru biết nhé!

Theo Ali Haider