Tải bản đầy đủ (.pdf) (17 trang)

BÁO cáo bài tập lớn môn mật mã học nâng cao cách xây dựng ứng dụng blockchain

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (351.69 KB, 17 trang )

HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THƠNG
KHOA CƠNG NGHỆ THÔNG TIN 1
a--- & ---b

BÁO CÁO BÀI TẬP LỚN
MÔN: Mật mã học nâng cao
Giảng viên: TS. Đỗ Xuân Chợ
Nhóm thực hiện: Nhóm 10
Họ tên

MSV

Vũ Lê Long

B17DCAT120

Đỗ Mạnh Hùng

B17DCAT087

Trần Việt Trinh

B17DCAT191

Hà Nội, 12/2020

1


Cách xây dựng ứng dụng Blockchain
1. Giới thiệu Blockchain


Blockchain là một mạng ngang hàng của các máy tính, hoặc các nút, nói
chuyện với nhau. Đó là một mạng phân tán, nơi tất cả những người tham gia
chia sẻ trách nhiệm điều hành mạng. Mỗi người tham gia mạng duy trì một
bản sao của mã và dữ liệu trên blockchain. Tất cả dữ liệu này được chứa trong
các gói bản ghi được gọi là "khối" được "xâu chuỗi với nhau" để tạo nên chuỗi
khối

2. Các bước thực hiện
2.1. Thiết lập project
Bây giờ chúng ta sẽ tạo project đầu tiên. Trước tiên sẽ tạo một thư mục project và
nhập nó vào như sau :

Sau đó, chúng ta sẽ khởi tạo một project truffle mới để phát triển project của mình
như sau:

Và rồi sau đó terminal output của bạn sẽ cho thấy rằng project đã được tạo thành
cơng. Chúng ta có thể mở trình soạn thảo văn bản của mình và thấy rằng một số
tệp và thư mục mới đã được tạo khi bạn chạy lệnh đó. Sau đó chúng ta hãy tạo một
package.json, tệp để cài đặt một số phụ thuộc phát triển sẽ cần cho project. Ta có
thể làm điều đó từ dịng lệnh như sau:

2


Bây giờ có thể khởi động project của mình bằng cách chỉ cần sao chép và dán đoạn
mã dưới đây vào tệp package.json của mình:

Bây giờ ta có thể cài đặt các phụ thuộc từ dòng lệnh như sau:

Bây giờ phần phụ thuộc đã được cài đặt, sau đó hãy kiểm tra cấu trúc thư mục dự

án mà chúng ta vừa tạo:

3


 Contracts directory: đây là nơi chứa tất cả các smart contacts. Chúng ta đã
có migrations contracts để xử lý migrations sang blockchain.
 Migrations directory: đây là nơi chứa tất cả các tệp migrations. Những
migrations tương tự các như các khuôn khổ phát triển web khác yêu cầu
migrations để thay đổi trang thái của cơ sở dữ liệu. Bất cứ khi nào ta cần
triển khai các smart contacts vào blockchain , và cần cập nhật trạng thái của
blockchain và vì vậy ta cần migration.
 Node_modules directory : đây là nơi chứa tất cả các node dependencies
chúng ta vừa cài đặt.
 Test directory: đây là nơi chúng ta viết các thử nghiệm cho smart contract
của mình
 Truffle-config.js file: đây là tệp cấu hình chính cho project Trufle của chúng
ta, nơi mà chúng ta sẽ xử lý những thứ cấu hình như cấu hình mạng.
Và bây giờ chúng ta bắt đầu phát triển các smart contracts sẽ quản lý danh sách
việc cần làm của chúng ta. Chúng ta có thể thực hiện việc này bằng cách tạo một
tệp mới trong contracts directory như sau:

Bên trong đây, hãy phát triển danh sách smart contract cần làm của chúng ta. Đầu
tiên, chúng ta sẽ bắt đầu bằng cách chỉ định phiên bản như sau:

Và giờ ta có thể khai báo smart contract như sau:

4



Chúng ta tạo một smart contract được được TodoList theo sau bởi dấu ngoặc
nhọn. Chúng ta sẽ thêm tất cả các mã cho smart contract bên trong chúng. Việc
chúng ta sẽ làm chỉ là theo dõi số lượng nhiệm vụ bên trong danh sách việc cần
làm. Điều này sẽ cho phép chúng tôi viết một số mã đơn giản sẽ giúp chúng tôi
đảm bảo rằng dự án được thiết lập đúng cách và mã của chúng tôi đang hoạt động
trên blockchain. Chúng tôi chỉ cần tạo một biến trạng thái được gọi taskCount để
theo dõi số lượng nhiệm vụ như sau:

Đây taskCount là một loại biến đặc biệt được gọi là "biến trạng thái". Bất kỳ dữ
liệu nào mà chúng tôi lưu trữ bên trong biến trạng thái này đều được ghi vào bộ
nhớ trên blockchain. Nó thay đổi trạng thái của hợp đồng thơng minh và có phạm
vi trong tồn bộ hợp đồng thơng minh, trái ngược với các biến cục bộ chỉ có
phạm vi bên trong các chức năng. Chúng ta có thể đặt giá trị mặc định cho biến
trạng thái này như sau:

5


Bây giờ, chúng ta có thể tạo một cách để truy cập giá trị của biến trạng thái này
bên ngoài hợp đồng. Chúng ta có thể làm điều này với một từ khóa bổ trợ đặc biệt
có tên là public Solidity. Khi chúng tôi làm điều này, Solidity sẽ tạo
một taskCount() hàm một cách kỳ diệu để chúng tơi có thể truy cập giá trị của
biến này bên ngồi hợp đồng thơng minh. Điều này sẽ hữu ích khi chúng tôi
tương tác với hợp đồng thông minh trong bảng điều khiển, từ ứng dụng phía máy
khách và bên trong các tệp thử nghiệm.
Bây giờ, biên dịch smart contract và đảm bảo rằng khơng có lỗi:

Ta nên chú ý rằng một tập tin mới được tạo ra bất cứ khi nào bạn biên soạn hợp
đồng thông minh tại đường dẫn sau: /build/contracts/TodoList.json . Tệp này là
tệp ABI hợp đồng thông minh, viết tắt của "Giao diện nhị phân trừu tượng". Tệp

này có nhiều trách nhiệm, nhưng tơi sẽ nhấn mạnh hai điều ở đây:



Nó chứa phiên bản bytecode đã biên dịch của mã hợp smart contract
Solidity có thể chạy trên Máy ảo.
Nó chứa bản trình bày JSON của các chức năng hợp đồng thơng minh có
thể được hiển thị cho các máy khách bên ngồi, như các ứng dụng
JavaScript phía máy khách.

Mục tiêu tiếp theo là truy cập hợp đồng thông minh bên trong bảng điều khiển
Truffle. Tuy nhiên, chúng ta không thể chạy bảng điều khiển Truffle vì ứng dụng
của chúng tôi chưa được kết nối với mạng blockchain cá nhân Ganache mà chúng
tơi thiết lập trong phần dependencies . Để nói chuyện với hợp đồng thông minh
trên mạng blockchain cá nhân bên trong bảng điều khiển Truffle, chúng ta phải
thực hiện một số điều sau:




Cập nhật tệp cấu hình project để chỉ định mạng blockchain cá nhân muốn
kết nối.
Tạo một tập lệnh di chuyển cho Truffle biết cách triển khai hợp đồng thông
minh vào mạng blockchain cá nhân.
Chạy tập lệnh di chuyển mới được tạo, triển khai hợp đồng thông minh vào
mạng blockchain cá nhân.

6



Tiếp theo, chúng ta sẽ tạo một tập lệnh di chuyển bên trong directory để triển
khai hợp đồng thông minh cho mạng blockchain cá nhân. Từ gốc project tạo một
tệp mới từ dòng lệnh như sau:

Bên trong tệp mới được tạo này, bạn có thể sử dụng mã này để triển khai smart
contract:

Đầu tiên, yêu cầu contract mà ta đã tạo và gán nó cho một biến có tên là
"TodoList". Tiếp theo, ta thêm nó vào tệp kê khai các contracts đã triển khai để
đảm bảo rằng nó được triển khai khi chúng tơi chạy q trình di chuyển.  Bây giờ
hãy chạy tập lệnh migrations này từ dòng lệnh như sau:

Bây giờ chúng ta đã di chuyển thành công hợp smart contract sang mạng
blockchain cá nhân, hãy mở bảng điều khiển để tương tác với smart contract. Ta
có thể mở bảng điều khiển truffle từ dòng lệnh như sau:

Bây giờ chúng ta đang ở bên trong bảng điều khiển, hãy lấy một ví dụ về smart
contract đã triển khai của chúng tôi và xem liệu chúng ta có thể đọc taskCount từ
hợp đồng hay không. Từ bảng điều khiển, chạy mã này:

7


chúng ta có thể lấy địa chỉ của smart contract đã được triển khai vào blockchain
như
sau:

2.2 List task
Để liệt kê task bên trong smart contract, chúng tôi sẽ cần một cách để lập mơ hình
nhiệm vụ một cách vững chắc. Solidity cho phép bạn xác định các kiểu dữ liệu

của riêng mình với các structs . Chúng tơi có thể mơ hình hóa bất kỳ dữ liệu tùy ý
nào với tính năng mạnh mẽ này. Chúng ta sẽ sử dụng một cấu trúc để lập mơ hình
như sau:

Đầu tiên, chúng tơi lập mơ hình nhiệm vụ với struct từ khóa theo sau là tên của
cấu trúc mới Task. Lưu ý rằng điều này không đại diện cho một trường hợp của
a Task mà chỉ đơn giản là định nghĩa của một Task cấu trúc. Các dòng chứa trong
dấu ngoặc nhọn xác định các thuộc tính của Taskcấu trúc:


uint id- đây là mã định danh duy nhất cho cấu trúc. Nó sẽ có một id, giống
như một bản ghi cơ sở dữ liệu truyền thống. Lưu ý, chúng tôi khai báo kiểu
dữ liệu cho số nhận dạng này là a uint, viết tắt của "số nguyên không
dấu". Điều này đơn giản có nghĩa là nó là một số ngun khơng âm. Nó
8





khơng có "dấu hiệu", tức là một -hoặc một +dấu hiệu, ở phía trước nó, ngụ
ý rằng nó ln ln tích cực.
string content - đây là văn bản của nhiệm vụ trong danh sách việc cần làm
được chứa trong một chuỗi.
bool completed- đây là trạng thái hộp kiểm của danh sách việc cần
làm true/false. Nếu đúng như vậy true, nhiệm vụ sẽ được "hoàn thành"
hoặc bị đánh dấu khỏi danh sách việc cần làm.

Bây giờ chúng ta đã lập mơ hình một nhiệm vụ, chúng ta cần một nơi để đặt tất cả
các nhiệm vụ vào danh sách việc cần làm! Chúng tôi muốn đưa chúng vào lưu trữ

trên blockchain để trạng thái của hợp đồng thông minh sẽ tồn tại lâu dài. Chúng
ta có thể truy cập kho lưu trữ của blockchain với một biến trạng thái, giống như
chúng ta đã làm với taskCount. Chúng tôi sẽ tạo một tasksbiến trạng thái. Nó sẽ
sử dụng một loại cấu trúc dữ liệu Solidity đặc biệt được gọi là ánh xạ như thế
này:

Bây giờ chúng ta hãy tạo một hàm để tạo các tác vụ. Điều này sẽ cho phép chúng
tôi thêm các nhiệm vụ mới vào danh sách việc cần làm theo mặc định để chúng ta
có thể liệt kê chúng trong bảng điều khiển.

9


Bây giờ chúng tôi muốn thêm một task vào todolist làm bất cứ khi nào hợp smart
contract được triển khai vào blockchain để nó có một task mặc định mà chúng ta
có thể kiểm tra trong bảng điều khiển. Chúng ta có thể làm điều này bằng cách
gọi createTask()hàm bên trong hàm khởi tạo của hợp đồng thông minh như sau:

Bây giờ hãy triển khai smart contract này vào blockchain. Để làm được điều này,
chúng ta phải triển khai một bản sao mã mới của mình. Mã smart contract là bất
biến! Nó khơng thể thay đổi. Do đó, chúng tơi phải tạo một smart contract mới
10


bất kỳ lúc nào chúng ta thực hiện thay đổi mã. Truffle cung cấp một phím tắt để
hỗ trợ việc này. Chúng tơi có thể chạy lại q trình di chuyển như sau:

Bây giờ chúng ta có thể nhận nhiệm vụ từ danh sách việc cần làm bằng cách
gọi tasks()hàm. Điều này sẽ cho phép chúng tôi truy cập các giá trị từ tasks ánh
xạ bằng id. Chúng ta sẽ chỉ cần chuyển id task đầu tiên trong danh sách khi chúng

ta gọi hàm này:

Bây giờ chúng ta đã chuyển smart contract này sang blockchain, hãy tạo mã phía
máy khách để tương tác với hợp đồng thơng minh danh sách việc cần làm. Bạn sẽ
cần tạo các tệp sau cho project:

Bây giờ hãy điền mã HTML cho todolist của chúng ta. Hướng dẫn này tập trung
chủ yếu vào công nghệ blockchain.Ta chỉ cần dán mã HTML vào đây:

11


Tệp này hỗ trợ tất cả HTML mà chúng tôi cần cho project. Tôi đã nhận xét mã
biểu mẫu mà chúng tôi sẽ bật trong phần sau. Tệp kéo tất cả các phụ thuộc cho
project như khuôn khổ tạo khuôn mẫu bootstrap sẽ cho phép tạo các phần tử giao
diện người dùng đẹp mắt mà khơng cần phải viết q nhiều CSS. Nó cũng sử
dụng thư viện Truffle Conract sẽ cho phép chúng ta tương tác với JavaScript của
todo list smart contract.
Bây giờ hãy điền mã JavaScript cho phần này. Chúng tôi sẽ thêm mã
vào app.jstệp mới được tạo như sau:

12


Bây giờ hãy khởi động máy chủ web và đảm bảo rằng project sẽ tải trong trình
duyệt.

2.3 Create task
Chúng ta đã tạo một hàm để tạo task, nhưng nó vẫn chưa hồn thành.  Đó là bởi vì
ta muốn kích hoạt một sự kiện bất kỳ lúc nào tác vụ mới đó được tạo. Sự vững

chắc cho phép chúng ta kích hoạt các sự kiện tùy ý mà người tiêu dùng bên ngồi
có thể đăng ký. Nó sẽ cho phép chúng ta lắng nghe các sự kiện này bên trong các
13


ứng dụng phía máy khách, v.v. Hãy tạo một TaskCreated() sự kiện và kích hoạt
nó bất cứ lúc nào một tác vụ mới được tạo trong createTask() hàm như sau:

Bây giờ, hãy tạo một bài kiểm tra để đảm bảo rằng sự kiện này được kích hoạt bất
cứ khi nào một tác vụ mới được tạo. Chúng tôi sẽ kiểm tra biên lai giao dịch khi
nhiệm vụ mới được tạo. Điều này sẽ chứa tất cả thông tin nhật ký sẽ chứa dữ liệu
sự kiện. Chúng tơi có thể kiểm tra dữ liệu này bên trong thử nghiệm của mình
như thế này để đảm bảo rằng sự kiện đã được kích hoạt đúng cách:
Bây giờ hãy chạy thử nghiệm:

14


Bây giờ chúng ta hãy triển khai một bản sao mới của hợp smart contract vào
blockchain vì mã đã thay đổi. Bây giờ hãy cập nhật mã phía máy khách.  Trước
tiên, chúng tôi sẽ bỏ nhận xét mã biểu mẫu trong index.htmltệp:

Bây giờ chúng ta sẽ thêm một createTask()hàm trong app.jstệp như sau:

Bây giờ bạn sẽ có thể thêm các tác vụ mới từ ứng dụng phía máy khách!  Lưu ý,
khơng có nút "gửi" trên biểu mẫu. Ta đã bỏ nó đi để đơn giản hóa giao diện người
dùng. Bạn phải nhấn phím "enter" trên bàn phím để gửi tác vụ. Sau khi thực hiện,
bạn sẽ thấy thông báo xác nhận Metamask bật lên. Bạn phải ký giao dịch này để
tạo task.
2.4 Complete task

Bây giờ, điều cuối cùng chúng ta sẽ làm trong hướng dẫn này là "đánh dấu" các
nhiệm vụ trong danh sách việc cần làm. Sau khi chúng tôi thực hiện, chúng sẽ
xuất hiện trong danh sách "đã hồn thành", mặc dù vậy. Đầu tiên, chúng tơi sẽ
cập nhật hợp đồng thông minh. Chúng tôi sẽ thêm một TaskComplted()sự kiện và
kích hoạt nó bên trong một toggleCompleted()chức năng mới như sau:

15


Bây giờ chúng ta sẽ viết một bài kiểm tra như thế này:

16


Bây giờ hãy chạy thử nghiệm:

Yay, nó trơi qua! 🎉 Bây giờ chúng ta hãy triển khai một bản sao mới của hợp
đồng thơng minh vào blockchain vì mã đã thay đổi:

Bây giờ hãy cập nhật mã phía máy khách. Đầu tiên, chúng tơi sẽ bỏ nhận xét trình
nghe sự kiện bên trong renderTasks()hàm:

Bây giờ chúng ta sẽ thêm một toggleCompleted()hàm trong app.jstệp như sau:

.

17




×