Một trong những mục tiêu chính mà các dự án dựa trên blockchain hướng tới là xác minh dữ liệu. Đối với các ví dụ trực tiếp, bạn có thể xem danh tính kỹ thuật số và lưu trữ và kiểm tra tài liệu trực tuyến. Thật vậy, bất kỳ trường hợp nào trong số này đều yêu cầu xác minh người khởi xướng hành động / giao dịch để xác nhận cá nhân hoặc tổ chức. Ví dụ: nếu một người có dạng tài liệu ID kỹ thuật số, thì điều quan trọng là phải đảm bảo quyền sở hữu. Vì vậy, nó là một ví dụ tuyệt vời về vấn đề khả năng xác minh dữ liệu. Chúng ta hãy xem xét dạng đơn giản nhất của giải pháp - chữ ký điện tử, mà thử nghiệm của nó là một trong những điểm quan trọng trong quá trình phát triển hợp đồng thông minh.
Cách tiếp cận rất đơn giản:
1) hệ thống tạo ra một thông báo theo các quy tắc đã biết cho tất cả mọi người
2) người ký nhận được thông điệp và thêm một bộ ký hiệu cụ thể - chữ ký điện tử, mã được xây dựng từ thông điệp bằng khóa riêng
3) chữ ký đã tạo bây giờ được gửi đến hợp đồng, nơi nó được phân tách để lấy địa chỉ của người ký.
Solidity cung cấp cho bạn thuật toán ECDSA để tạo chữ ký và phân rã thêm. Chúng tôi không cần phải đi sâu vào chính thuật toán (bạn có thể tìm thấy thông tin cần thiết trong các nguồn thích hợp). Tất cả những gì chúng ta cần biết là ECDSA là một ví dụ về mật mã không đối xứng, trong đó người dùng đầu tiên tạo chữ ký bằng khóa riêng của họ và người dùng thứ hai áp dụng một thuật toán tiêu chuẩn để truy xuất khóa công khai của người ký. Do đó, nó có thể xác minh nguồn gốc của chữ ký. Thay vào đó, hãy tập trung vào phần thực hành - sử dụng và kiểm tra chữ ký.
Trước hết, chúng ta cần nhìn nhận một vấn đề. Ví dụ: hợp đồng cần thực hiện một số hành động, giả sử lưu trữ địa chỉ của người gọi. Mặc dù hợp đồng sẽ chỉ thực hiện lưu trữ nếu người gọi được xác minh, nhưng chúng tôi cần đảm bảo rằng không ai có thể sử dụng địa chỉ của họ mà không được phép. Để truy xuất người gọi đích thực, chúng ta cần tạo một số tin nhắn, ký tên và phân tách nó trong hợp đồng.
Bạn có thể tìm thấy dung dịch tiêu chuẩn trong tài liệu Solidity (ví dụ, trong 0.8.4 - phiên bản ổn định mới nhất tại thời điểm của bài viết). Tài liệu cung cấp cho chúng tôi hợp đồng, hợp đồng này cần có chức năng tích hợp sau: tạo thông báo, tách chữ ký và mã lắp ráp để truy xuất người ký. Ví dụ cho thấy tất cả các phương pháp cần thiết và khá đơn giản, mặc dù nó có hai nhược điểm: nó thiếu tính phổ biến và không có ví dụ tốt về thử nghiệm giải pháp. Đó là lý do tại sao tôi cung cấp phiên bản mã của mình và (mục tiêu thực tế) - chiến lược thử nghiệm của hợp đồng.
Chắc chắn, bạn có thể sử dụng thư viện OpenZeppelin tiêu chuẩn đối với các hoạt động của ECDSA, nhưng bạn sẽ lại gặp phải các vấn đề tương tự - thiếu sự linh hoạt và các phương pháp thử nghiệm. Vì vậy, hãy đi sâu vào ví dụ của tôi về logic dựa trên chữ ký. Bạn có thể tìm thấy đầy đủ ví dụ làm việc trong GitHub của tôi, nhưng có vài chỗ mà tôi muốn thể hiện đầy đủ.
Trước hết, chúng tôi sẽ chuẩn bị thông điệp. Như bạn có thể thấy, nó được hình thành từ hai địa chỉ ví được đóng gói và băm:
Đoạn mã quan trọng thứ hai là băm thông điệp cùng với thông điệp Ethereum tiêu chuẩn:
Nó cho thấy rằng tin nhắn được gửi trong mạng Ethereum và có độ dài 32 byte, đây không phải là một số ngẫu nhiên. Sau các thao tác trước đó, chúng ta có hàm băm, có độ dài 32 byte. Điều cần thiết là phải có hàm băm bổ sung ở dạng như vậy, và chúng ta sẽ thảo luận về lý do sau một chút.
Các mẩu mã khác khá chuẩn. Chức năng tách chữ ký như sau:
và đây là chức năng để truy xuất người ký:
Đối với giao diện bên ngoài, chúng tôi sẽ sử dụng chức năng tùy chỉnh, chức năng này nhận chữ ký và các đối số cần thiết, kiểm tra xem người dùng đã được đăng ký chưa, tạo thông báo và xác minh chữ ký:
Đầu tiên, chúng tôi sẽ bắt chước thông điệp cần được ký. Chúng tôi sẽ sử dụng ethers.js thư viện, là (cùng với web3) thư viện được sử dụng nhiều nhất và tiện lợi nhất. Vì nó là một thư viện mã nguồn mở, bạn có thể tự do khám phá mã và tài liệu của nó. Ngoài ra, thư viện này cung cấp cho chúng ta giao diện hoàn hảo để xây dựng thông báo sau:
Một trong những nhược điểm của cả hai web3 và ete thư viện là chúng không có tất cả các chức năng cho môi trường Ganache cục bộ vì cả hai thư viện đều nhằm mục đích hoạt động với các nút Ethererum đầy đủ. Tuy nhiên, có một cách tiếp cận để kiểm tra cục bộ bằng cách sử dụng chức năng tài khoản web3. Mặc dù bạn cần tạo một tài khoản bổ sung, tài khoản này sẽ triển khai chức năng ca sĩ và cung cấp kết nối với nhà cung cấp web3 hiện tại:
Vì vậy, bây giờ chúng tôi có thông báo được tạo và ký. Nhưng, đó không phải là tất cả; có một số điều còn lại để nói về. Cả hai thư viện (web3 và ete) đều cung cấp hàm băm bổ sung cho thông điệp trước khi tạo chữ ký. Ngoài ra, thông báo không chỉ được băm mà được kết hợp với thông báo Ethereum tiêu chuẩn mà chúng ta đã thấy trước đó:
Và đó là lý do tại sao chúng tôi đã thêm phương thức bổ sung vào hợp đồng. Vì vậy, nếu bạn muốn sử dụng thông báo tùy chỉnh, bỏ qua băm bổ sung, v.v., bạn cần tạo phiên bản tùy chỉnh của chức năng ký. Chúng ta đã thảo luận lý do ở trên - cả hai thư viện tiêu chuẩn đều triển khai cách tiếp cận điển hình để ký thông báo, chỉ có thể thay đổi bằng cách ghi đè chức năng.
Bước cuối cùng, hãy chạy thử nghiệm và kiểm tra xem nó có hoạt động chính xác hay không:
Chúng tôi đã thử nghiệm việc tạo chữ ký, thông báo được tạo, phê duyệt chữ ký và từ chối. Vì vậy, nó là một tập hợp các bài kiểm tra khá hoàn chỉnh cho chức năng xác minh.
- Tài khoản
- Hoạt động
- thêm vào
- thuật toán
- Tất cả
- đối số
- bài viết
- Authentic
- Một chút
- trường hợp
- Séc
- mã
- hợp đồng
- mật mã
- Current
- dữ liệu
- Phát triển
- kỹ thuật số
- sắc kỹ thuật số
- tài liệu
- Môi trường
- ethereum
- mạng ethereum
- Đối mặt
- Tên
- Linh hoạt
- Tập trung
- hình thức
- Miễn phí
- Full
- chức năng
- tốt
- băm
- băm
- HTTPS
- ia
- Bản sắc
- thông tin
- IP
- IT
- Key
- mới nhất
- Thư viện
- địa phương
- trung bình
- mạng
- các nút
- cung cấp
- Cung cấp
- Trực tuyến
- mở
- mã nguồn mở
- Hoạt động
- riêng
- Key Private
- dự án
- công khai
- chính công
- xem xét
- chạy
- định
- Đơn giản
- So
- sự vững chắc
- chia
- là gắn
- hàng
- Chiến lược
- hệ thống
- thử nghiệm
- Kiểm tra
- kiểm tra
- Nguồn
- us
- Xác minh
- ví
- Wikipedia
- ở trong
- Công việc
- công trinh