2.4. Hashcash
2.4.1. Khái niệm
Hashcash được đề xuất lần đầu tiên vào năm 1997 bởi Adam Back. Hashcash là biện pháp dùng để ngăn chặn thư rác và các tấn công từ chối dịch vụ,
gần đây Hashcash còn được sử dụng trong hệ thống tiền điện tử Bitcoin và một số Cryptocurrency khác.
Nguyên lý hoạt động của Hashcash: trong mơ hình u cầu (Requester) và cung cấp (Provider) dịch vụ, Provider lựa chọn một công việc hoặc một bài tốn khó để yêu cầu bên Requester thực hiện và Provider có thể kiểm tra dễ dàng minh chứng cơng việc của Requester. Ví dụ về hashcash trong hệ thống email: mỗi lần gửi thư, người gửi phải tính tốn một giá trị nhãn theo u cầu của người nhận sau đó gắn nhãn vào phần đầu của thư rồi mới gửi đi để chứng minh mình khơng phải là kẻ gửi thư rác. Người nhận sẽ kiểm tra được nhãn có thỏa mãn hay khơng để lọc thư không hợp lệ [15].
2.4.2. Hashcash ngăn chặn thƣ rác
Adam Back đề xuất phiên bản Hashcash đầu tiên sử dụng để ngăn chặn thư rác như sau [3]:
a. Về phía ngƣời gửi
Trước khi gửi thư, người gửi chuẩn bị phần đầu của thư (header) có định dạng tương tự như ví dụ sau:
X-Hashcash: 1:20:060408:adam@cypherspace.org::1QTjaYd7niiQA/sc:ePa
Trong đó:
- X-Hashcash là phần mặc định. - 1:20:060408 là mốc thời gian gửi.
- adam@cypherspace.org là địa chỉ hòm thư người nhận - 1QTjaYd7niiQA/sc:ePa là phần giá trị ngẫu nhiên hợp lệ.
Để tính tốn giá trị ngẫu nhiên hợp lệ, người gửi tạo ra một giá trị ngẫu nhiên sau đó tính giá trị băm của header (ngoại trừ phần mặc định) sử dụng hàm băm SHA-1 (độ dài của giá trị băm là 160 bits). Nếu 20 bits đầu tiên của giá trị băm là bit 0 thì header được chấp nhận, nếu khơng thì người gửi tăng giá trị ngẫu nhiên lên và thử lại.
b. Về phía ngƣời nhận
Máy tính của người nhận tính tốn giá trị băm của header (ngoại trừ phần mặc định) sử dụng hàm băm SHA-1.
Ví dụ băm chuỗi:
1:20:060408:adam@cypherspace.org::1QTjaYd7niiQA/sc:ePa Thu được chuỗi: 00000a4a8bd07bddbdb0c4ea9ddb2d29b8d1cc5e (hệ 16) - Bước 1: Người nhận kiểm tra 20 bit đầu tiên của giá trị băm là bit 0 thì tiếp tục sang bước 2.
- Bước 2: Người nhận kiểm tra ngày trên header có nằm trong phạm vi hai ngày đối với thời gian hiện tại (hai ngày là độ trễ trong mức cho phép để bù cho lệch múi giờ và thời gian định tuyến gói tin trên mạng).
- Bước 3: Người nhận kiểm tra địa chỉ thư có nằm trong danh sách thư mà người nhận chấp nhận hay không?!
- Bước 4: Người nhận tiếp tục kiểm tra chuỗi băm chưa hề tồn tại trong Cơ sở dữ liệu.
Nếu các điều kiện trên thỏa mãn thì người nhận chấp nhận thư. Ngược lại, người nhận không chấp nhận thư.
2.4.3. Hashcash chống lại tấn công từ chối dịch vụ
Năm 2002, Adam Back đưa ra giải pháp Hashcash giúp hệ thống máy chủ chống lại các cuộc tấn công từ chối dịch vụ. Hashcash có hai loại là Hashcash có tương tác (Interactive Hashcash) và Hashcash khơng tương tác (Non-interactive
Đối với Interactive Hashcash:
- Khi nhận được yêu cầu dịch vụ từ phía Requester, Provider lựa chọn một chuỗi bit c. Provider gửi bài toán yêu cầu Requester sử dụng c và hàm băm H (SHA-1) để tìm ra chuỗi bit x sao cho w-bits đầu tiên của chuỗi H(s||c||x) là w-bits 0. Trong đó chuỗi bit s là chuỗi bit biểu diễn thông tin định danh duy nhất của dịch vụ mà Requester yêu cầu (có thể là tên miền, địa chỉ email…)
- Requester cố gắng giải bài toán trên bằng cách thử liên tiếp nhiều lần cho tới khi tìm được chuỗi bit x thỏa mãn yêu cầu thì gửi lại x cho Provider.
- Provider xác minh phương án của Requester bằng cách kiểm tra xem w-bits đầu tiên của H(s||c||x) có phải là w-bits 0 hay không?! Nếu đúng, phương án được chấp nhận và Provider bắt đầu phản hồi yêu cầu dịch vụ cho Requester. Ngược lại, phương án bị từ chối.
Đối với Non-interactive Hashcash:
- Provider và Requester thỏa thuận trước u cầu của bài tốn khó và các tham số: hàm băm H (SHA-1), chuỗi bit s là chuỗi bit biểu diễn thông tin định danh duy nhất của dịch vụ mà Requester yêu cầu (có thể là tên miền, địa chỉ email…) và số nguyên dương w.
- Requester tìm chuỗi bit x sao cho w-bits đầu tiên của chuỗi H(s||x) là w-bits 0, sau đó gửi phương án x tới Provider.
- Provider xác minh phương án của Requester bằng cách tính H(s||x) và kiểm tra xem w-bits đầu tiên của H(s||x) có phải là w-bits 0 hay không?! Nếu đúng, phương án được chấp nhận và Provider cung cấp dịch vụ cho Requester. Ngược lại, phương án bị từ chối.
2.4.4. Đánh giá chi phí tính tốn của Hashcash
Vấn đề mấu chốt của các Hashcash là tạo ra một chuỗi bit mà giá trị băm của nó là một chuỗi bit được bắt đầu với w-bits 0 (w là số nguyên dương). Do tính chất
của hàm băm nên phương pháp duy nhất để giải quyết vấn đề trên là băm thử liên tiếp các chuỗi bit khác nhau cho tới khi tìm được chuỗi bit thỏa mãn yêu cầu.
Giả sử k (k ≥ w) là độ dài chuỗi bit đầu ra của hàm băm H. Trong số tất cả 2k giá trị băm có thể nhận được thì có 2k-w giá trị băm thỏa mãn điều kiện bắt đầu bằng w-bits 0. Vì vậy xác suất để tìm được giá trị ngẫu nhiên hợp lệ trong một lần thử là 1/2w. Do đó để tìm ra giá trị ngẫu nhiên hợp lệ, người dùng sẽ phải thử trung bình 2w
lần. Như vậy, thời gian để tìm ra giá trị ngẫu nhiên thỏa mãn điều kiện tỷ lệ với 2w. Vì thế giá trị w sẽ được lựa chọn tùy theo mục đích sử dụng của Hashcash đối với hệ thống, bên cạnh đó w cũng sẽ tăng tỷ lệ thuận cùng với sự phát triển tốc độ xử lý của CPU để đảm bảo độ khó của bài tốn trong Hashcash.
Ví dụ: đối với hashcash sử dụng vào mục đích lọc thư rác hoặc chống lại tấn công từ chối dịch, giá trị w thường được chọn là 20. Để tìm ra giá trị ngẫu nhiên hợp lệ, người gửi sẽ phải thử trung bình 220
. Đối với người dùng bình thường thì cơng việc này khơng tiêu tốn q nhiều chi phí về mặt thời gian và tài nguyên hệ thống nhưng đối với kẻ tấn cơng thì chi phí này sẽ rất lớn tỷ lệ thuận với số lượng thư/yêu cầu dịch vụ mà chúng gửi đi.
Tuy nhiên, chi phí về thời gian và tài nguyên hệ thống để kiểm tra lời giải của bài tốn khó trong Hashcash thường rất thấp và không phụ thuộc vào giá trị w bởi chỉ cần sử dụng một lần hàm băm để tính tốn và kiểm tra điều kiện đối với giá trị băm. Công việc này tốn rất ít chi phí về thời gian và tài nguyên hệ thống [15].
2.5. TimeStamp
Nhãn thời gian-TimeStamp là công cụ được sử dụng để ghi nhận sự tồn tại của dữ liệu hoặc sự kiện xảy ra tại một thời điểm nhất định hoặc tuân theo một thứ tự duy nhất. Thuật ngữ này được xuất phát từ khái niệm tem nhãn được ứng dụng trong các cơng việc văn phịng.
Tuy nhiên, hiện nay thuật ngữ này được mở rộng để chỉ đến việc gắn nhãn thời gian dưới dạng số lên dữ liệu hoặc sự kiện. Nhãn thời gian số thường là thời gian mà một sự kiện hoặc dữ liệu được ghi lại bởi một máy tính hoặc hệ thống nhất
định. Nhãn thời gian số được biểu diễn theo định dạng phù hợp, cho phép dễ dàng so sánh của hai sự kiện khác nhau về thứ tự được ghi nhận.
TimeStamp tồn tại ở rất nhiều dạng khác nhau tùy theo mục đích và các điều kiện ràng buộc khi sử dụng. TimeStamp đơn giản nhất là công cụ tem thư dùng trong lĩnh vực bưu chính để đánh dấu thời điểm mà bưu điện nhận thư của người gửi. Trong hệ thống quản lý tệp tin, TimeStamp là công cụ ghi lại thông tin về thời điểm lưu trữ / tạo hoặc thay đổi một tệp tin [17].
2.6. Base 58
Base58 là bảng mã được sử dụng để biểu diễn những số nguyên lớn dưới dạng ký tự. Base58 cũng tương tự như Base64 nhưng đã được lược bỏ bớt những ký tự dễ gây nhầm lẫn khi in ấn. Các ký tự có trong Base64 mà khơng cịn xuất hiện trong Base58 là: 0, I, O, l (chữ L thường), +, / [14].
Bảng 2.1– Bảng mã Base58
Giá trị Ký tự Giá trị Ký tự Giá trị Ký tự Giá trị Ký tự
0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 A 10 B 11 C 12 D 13 E 14 F 15 G 16 H 17 J 18 K 19 L 20 M 21 N 22 P 23 Q 24 R 25 S 26 T 27 U 28 V 29 W 30 X 31 Y 32 Z 33 a 34 b 35 c 36 d 37 e 38 f 39 g 40 h 41 i 42 j 43 k 44 m 45 n 46 o 47 p 48 q 49 r 50 s 51 t 52 u 53 v 54 w 55 x 56 y 57 z (Nguồn: Wikipedia)
Nguyên tắc biểu diễn số nguyên lớn x dưới dạng ký tự dựa trên bảng mã Base58 như sau:
- Bƣớc 1: kiểm tra x > 0 + Nếu x = 0 thì kết thúc.
+ Nếu x > 0 thì chuyển sang bước 2. - Bƣớc 2:
+ r = x%58 (0≤ r ≤ 57). Tra ký tự tương ứng với giá trị r trong Base58. Đẩy ký tự này vào ngăn xếp S.
+ x = x/58.
+ Quay lại bước 1.
CHƢƠNG 3: NGUYÊN LÝ HOẠT ĐỘNG CỦA HỆ THỐNG TIỀN ĐIỆN TỬ NGANG HÀNG BITCOIN
3.1. Mô tả hoạt động của hệ thống tiền điện tử ngang hàng Bitcoin 3.1.1. Định nghĩa các thành phần của hệ thống 3.1.1. Định nghĩa các thành phần của hệ thống
- A: là người sử dụng tiền điện tử Bitcoin để thanh toán khi mua hàng.
- B: là người bán hàng chấp nhận hình thức thanh tốn bằng tiền điện tử Bitcoin
- Địa chỉ số: là một chuỗi các ký tự được sử dụng để lưu trữ đồng tiền điện tử Bitcoin. Mỗi địa chỉ lưu trữ một đồng tiền với một giá trị nhất định.
- Ví: là tệp dữ liệu trên máy tính cho phép người dùng lưu trữ các địa chỉ số và sử dụng đồng tiền điện tử Bitcoin được lưu trong các địa chỉ số này để thanh toán.
- Node mạng: là các máy tính trong hệ thống mạng ngang hàng, tham gia vào quá trình ghi nhận lịch sử giao dịch dùng chung.
3.1.2. Quy trình thực hiện thanh tốn trong hệ thống tiền điện tử ngang hàng Bitcoin Bitcoin
- Bƣớc 0: A mua hàng của B và đề nghị thanh toán cho B bằng tiền điện tử
Bitcoin.
- Bƣớc 1: B tạo địa chỉ số rồi gửi cho A để A chuyển đồng tiền vào đó.
- Bƣớc 2: A sử dụng ví lưu trữ địa chỉ số của đồng tiền mà A muốn dùng để
thanh toán cho B rồi tạo ra một giao dịch chứa các thông tin về bản thân và địa chỉ số mà B đã gửi. A cơng khai giao dịch này cho tồn bộ hệ thống.
- Bƣớc 3: Các node mạng tập hợp giao dịch của A và các giao dịch mới khác
trong cùng thời điểm vào một khối Block rồi cố gắng thực hiện việc ghi nhận khối Block này vào lịch sử giao dịch dùng chung.
- Bƣớc 4: Khi node mạng X là node đầu tiên ghi nhận thành công khối Block
này vào lịch sử giao dịch dùng chung thì X sẽ được hệ thống thưởng cho một đồng tiền Bitcoin mới vào địa chỉ số của X.
- Bƣớc 5: B nhận thấy giao dịch giữa A và B đã tồn tại trong lịch sử giao dịch dùng chung và tin rằng đó là giao dịch tin cậy thì chấp nhận thanh tốn của A.
Tuy nhiên, để hiện thực hóa quy trình thanh tốn trên, hệ thống tiền điện tử Bitcoin cần phải giải quyết triệt để năm vấn đề đã được đặt ra ở trên. Nội dung tiếp theo của luận văn sẽ trình bày các giải pháp mà Satoshi sử dụng để giải quyết năm vấn đề này.
3.2. Những giải pháp cho các vấn đề của tiền điện tử Bitcoin 3.2.1. Vấn đề tạo ra đồng tiền điện tử Bitcoin 3.2.1. Vấn đề tạo ra đồng tiền điện tử Bitcoin
Weidai đưa ra ý tưởng cơ bản đầu tiên để tạo ra tiền điện tử CryptoCurrency: “Bất kỳ ai trong hệ thống đều có thể tạo ra đồng tiền bằng cách tìm ra phương án
giải quyết một vấn đề tính tốn mà trước đó chưa ai tìm được và truyền phát phương án này tới mọi người trong hệ thống. Tuy nhiên cơng việc tính tốn này phải khó hoặc tiêu tốn một lượng tài nguyên nào đó và cũng dễ dàng xác định được chi phí trung bình bỏ ra để tính tốn. Lượng tiền mới được tạo ra tương ứng với chính chi phí trung bình kể trên” [13]. Satoshi dựa trên ý tưởng này đưa ra phương
thức tạo ra/phát hành đồng tiền Bitcoin mới bằng cách sử dụng Hashcash.
Hashcash được sử dụng trong hệ thống tiền điện tử Bitcoin bao gồm một chuỗi các bài tốn khó liên tiếp mà kết quả của bài tốn này được sử dụng làm dữ liệu để giải bài tốn kế tiếp. Bài tốn khó của Hashcash trong hệ thống tiền điện tử Bitcoin được Satoshi phát biểu như sau:
- Dữ liệu bài toán: hàm băm H (SHA-256); chuỗi bit s là chuỗi bit kết quả
của bài tốn khó liền trước; chuỗi bit c là giá trị node gốc của cây băm Merkle lưu trữ thông tin các giao dịch mới tại thời điểm đang xét; một số nguyên dương w.
Hình 3.1-Node gốc của cây băm Merkle lƣu trữ thông tin các giao dịch mới
- u cầu bài tốn: tìm giá trị ngẫu nhiên hiện thời nonce (được biểu diễn
dưới dạng nhị phân là chuỗi bit x) sao cho w-bits đầu tiên của chuỗi bit kết quả H(H(s||c||x)) là w-bits 0 và nhỏ hơn một giá trị target cho trước. Chuỗi kết quả
H(H(s||c||x)) sẽ là chuỗi bit làm dữ liệu cho bài tốn khó kế tiếp.
Như đã phân tích, giá trị w và target quyết định độ khó của bài tốn trong
Hashcash, độ khó của bài tốn ảnh hưởng tới thời gian trung bình để các node tìm ra lời giải cho bài tốn. Do đó trong hệ thống tiền điện tử Bitcoin, hoạt động điều tiết quá trình phát hành tiền dựa trên việc lựa chọn và điều chỉnh giá trị w và target
theo quy tắc như sau:
- Đảm bảo thời gian trung bình một Block được ghi nhận vào chuỗi lịch sử giao dịch là 10 phút. Con số này chỉ đơn giản là chính sách lựa chọn của Satoshi vì Satoshi cho rằng nó phù hợp với thời gian các node mạng tìm hiểu về lời giải của bài tốn khó và các đặc tính của mạng ngang hàng như: băng thơng và độ trễ... Trên thực tế có những Block mất ít hơn 10 phút và có những Block mất hơn 10 phút để được ghi nhận vào chuỗi lịch sử giao dịch. Các loại Cryptocurrency khác nhau lựa
Hash(Tx0) Hash(Tx1)) ............. Hash(Txn-2) Hash(Txn-1)
Hash01 Hash n-2, n-1
……………………………………………..
Hash Hash
chọn thời gian trung bình kể trên là khác nhau. Ví dụ: NameCoin: 10 phút; LiteCoin: 2.5 phút; Ripple: 3-5 giây; Terracoin: 2 phút…
- Sau 2016 Blocks thì hệ thống tổng kết lại lượng thời gian để ghi nhận 2016 Blocks. Nếu như lượng thời gian này ít hơn 2016*10 phút (khoảng 2 tuần) thì độ khó của bài tốn trong Hashcash được điều chỉnh tăng lên: tăng giá trị w và giảm giá trị target; còn ngược lại thì độ khó của bài tốn trong Hashcash giảm đi tức là giảm giá trị w và tăng giá trị target [6].
Mỗi đồng tiền Bitcoin mới được phát hành khi một bài tốn khó trong Hashcash được giải quyết. Người được thưởng đồng tiền điện tử Bitcoin mới là người đầu tiên tìm ra lời giải của bài tốn khó trên và truyền phát lời giải của mình cho các node mạng trong hệ thống, đồng thời các node này chấp nhận lời giải đó. Cơ chế xác định người đầu tiên tìm ra lời giải, phương thức thưởng đồng tiền Bitcoin mới cho người này và sự thể hiện của các node mạng chấp nhận đối với lời giải này sẽ được trình bày trong nội dung sau.
3.2.2. Vấn đề xác định quyền sở hữu đồng tiền điện tử Bitcoin