CHƯƠNG 3: THỰC NGHIỆM MÔ PHỎNG VÍ ĐA CHỮ KÝ
3.1. Phát biểu bài toán
Bài toán đặt ra là tạo một ví Bitcoin dựa trên kịch bản đa chữ ký để thực hiện giao dịch. Ban đầu sẽ sinh ra N ví ngẫu nhiên với N cặp khóa bí mật/công khai, cụ thể N=5, nghĩa là sẽ có 5 ví với 5 cặp khóa bí mật/công khai tương ứng.
Sau đó sẽ tạo ví mới yêu cầu M chữ ký (M ≤N) dựa trên N cặp khóa tạo trước đó, ở bài toán này ngưỡng dành cho M sẽ là: 2≤ M<N.
Trong phạm vi đồ án, sẽ thực hiện kịch bản khóa với M=2, để tạo ra địa chỉ bitcoin với kịch bản này đồng thời cần 2 chữ ký để thực hiện giao dịch. Chi tiết kịch bản như sau:
OP_2 <Khóa công khai 1> <Khóa công khai 2> <Khóa công khai 3> <Khóa công khai 4> <Khóa công khai 5> OP_5 OP_CHECKMULTISIG
Thực khi kịch bản trên thu được giá trị redeemScript. Sau đó mã hóa redeemScript được địa chỉ ví đa chữ ký P2SH được mô tả như chương 2 hình 2- 11.
Để chi tiêu giao dịch từ địa chỉ P2SH được tạo ở trên cần tạo một giao dịch thô chưa được ký Unsigned TX từ đầu ra chưa chi tiêu UTXO tương ứng với địa chỉ P2SH. Sau đó dùng M=2 chữ ký từ khóa bí mật để ký lên giao dịch Unsigned TX được hai giá trị là <sig 1><sig 2>. Hai giá trị này sẽ được đưa vào kịch bản cùng với redeemscript để kết hợp thành kịch bản mở khóa. Giao dịch lúc này sẽ có đầy đủ kịch bản mở khóa và kịch bản khóa. Kết hợp 2 kịch bản này được mô tả như sau:
<sig 1><sig 2><redeemscript> DUP HASH160 <redeemscript hash>
EQUALVERIFY CHECKMULTISIG
Quá trình xác thực kịch bản sẽ diễn ra như mô tả chương 2 hình 2-14. Sau khi xác thực, giao dịch sẽ được broadcast lên mạng bitcoin để xác thực lần nữa bởi các thợ đào.
3.1.1. Lựa chọn công nghệ
Ngôn ngữ được sử dụng để phát triển là Python.
Để giao tiếp với blockchain thì ứng dụng này sử dụng BlockCypher API.
BlockCypher cung cấp thông tin đầy đủ cơ sở dữ liệu Blockchain miễn phí và cung cấp mã nguồn thư viện miễn phí hỗ trợ lập trình. Ngoài ra sẽ sử dụng cơ sở dữ liệu blockchain bitcoin testnet.
Môi trường phát triển được tổng hợp lại trong bảng sau:
Môi trường Tên môi trường
Ngôn ngữ lập trình Python
Hệ điều hành Windows
Dịch vụ API BlockCypher
Blockchain Bitcoin Testnet
3.1.2. Triển khai thực nghiệm
Với phạm vi đồ án, ứng dụng triển khai sẽ mô phỏng quá trình tạo địa chỉ và giao dịch với địa chỉ đa chữ ký 2 trong 5 khóa.
3.1.2.1. Tạo địa chỉ đa chữ ký
Người dùng sẽ được yêu cầu nhập số địa chỉ ví cần tạo (N) và số chữ ký yêu cầu khi giao dịch (M). Mô tả được thể hiện qua hình 3-1:
Hình 3- 1. Giao diện nhập số địa chỉ và số yêu cầu khóa
Với phạm vi đồ án, giá trị N=5, M=2, ứng dụng sẽ tạo ra 5 địa chỉ với các thông tin bao gồm cặp khóa công khai/khóa bí mật, địa chỉ ví. Thông số M=2 được dùng làm số lượng chữ ký đầu vào cho kịch bản redeemscript rồi mã hóa thành địa chỉ đa chữ ký P2SH.
Kết quả thu về được địa chỉ đa chữ ký P2SH Bitcoin testnet có dạng như hình 3-2:
Hình 3- 2. Tạo địa chỉ đa chữ ký 2 trong 5 khóa 3.1.2.2. Tạo và chi tiêu giao dịch
Để chi tiêu sẽ cần 2 trong 5 khóa bí mật được tạo ra từ địa chỉ P2SH.
Khóa thứ nhất và khóa thứ ba sẽ được sử dụng làm ví dụ (tất nhiên 2 trong 5 khóa bất kì vẫn sẽ làm việc). Gọi 2 khóa bí mật này lần lượt là khóa bí mật A và khóa bí mật C.
Để tạo giao dịch, cần có đầu vào là các đầu ra chưa chi tiêu UTXO trước đó, số tiền giao dịch và địa chỉ đích đến. Ứng dụng sẽ yêu cầu người dùng nhập số tiền giao dịch, địa chỉ gửi và địa chỉ nhận, sau đó sẽ lấy dữ liệu từ blockchain bitcoin testnet các đầu ra chưa chi tiêu UTXO gắn với địa chỉ gửi. Tiếp theo, ứng dụng sẽ tìm các đầu ra chưa chi tiêu UTXO hợp lý để làm đầu vào cho giao dịch và tạo một giao dịch thô chưa được ký. Mô tả được thể hiện như hình 3-3.
Hình 3- 3. Giao diện yêu cầu nhập thông tin giao dịch
Giao dịch thô này có đầu vào input là đầu ra chưa chi tiêu UTXO trước đó. Mô tả giao dịch chưa chi tiêu như hình 3-4.
Hình 3- 4. Giao diện hiển thị thông tin giao dịch chưa ký Unsigned TX Trong thông tin giao dịch chưa chi tiêu, các thông số chính bao gồm:
Địa chỉ (addresses): gồm địa chỉ gửi và địa chỉ nhận.
Mảng inputs: gồm các thông tin chính như mã băm UTXO trước đó (prev_hash), giá trị UTXO (output_value), loại kịch bản (script_type)
Mảng outputs: gồm 2 đầu ra đến địa đích và trả tiền thừa về địa chỉ người gửi.
Một số thông tin khác như: block_heigh, block_index, hash,…
Giao dịch thô này được băm 2 lần với mã băm SHA256 sau đó được ký lần lượt với 2 khóa bí mật riêng biệt bằng thuật toán ECDSA. Sơ đồ ký được mô tả ở chương 2 hình 2-12.
Sau khi có đủ 2 chữ ký, áp dụng chữ ký vào kịch bản giao dịch, lúc này mảng Input sẽ xuất hiện script mô tả kịch bản scriptSig dưới dạng mã hóa như hình 3-5.
Hình 3- 5. Giao dịch sau khi được ký
Sau khi xác thực kịch bản cũng như xác thực hai chữ ký với kịch bản khóa, giao dịch sẽ được phát tán lên mạng bitcoin. Nếu như việc xác thực kịch bản thất bại sẽ trả về thông báo lỗi như hình 3-6.
Hình 3- 6. Giao dịch lỗi
Mỗi giao dịch sẽ có một hàm băm mật mã để định danh giao dịch, hàm băm giao dịch này gọi là Transaction ID. Định danh này được mô tả như hình 3-7.
Hình 3- 7. Mã băm Transaction ID
Giao dịch sau đó sẽ được các thợ đào xác thực và trở thành một giao dich hợp lệ có thể kiểm tra trên các BlockExplorer. Kiểm tra giao dịch được mô tả như hình 3-8 trên website www.live.blockcypher.com