
Giao dịch trùng lặp của Bitcoin: Một lỗi thú vị với rủi ro cực kỳ nhỏ
Tuyển chọn TechFlowTuyển chọn TechFlow

Giao dịch trùng lặp của Bitcoin: Một lỗi thú vị với rủi ro cực kỳ nhỏ
Việc giao dịch lặp lại có thể gây ra sự nhầm lẫn, và các nhà phát triển Bitcoin đã đấu tranh chống lại điều này trong nhiều năm bằng nhiều cách khác nhau.

Tổng quan
Một giao dịch Bitcoin bình thường sử dụng ít nhất một đầu ra từ giao dịch trước đó bằng cách tham chiếu đến ID giao dịch (TXID) của giao dịch trước. Những đầu ra chưa chi tiêu này chỉ có thể được chi tiêu một lần duy nhất; nếu chúng có thể bị chi tiêu hai lần, bạn có thể thực hiện việc thanh toán kép trên Bitcoin, khiến nó trở nên vô giá trị. Tuy nhiên, trong Bitcoin thực tế tồn tại đúng hai cặp giao dịch hoàn toàn giống nhau. Tình huống này có thể xảy ra vì các giao dịch coinbase không có đầu vào giao dịch nào, mà thay vào đó tạo ra đồng mới. Do đó, hai giao dịch coinbase khác nhau có thể gửi cùng một lượng tiền đến cùng một địa chỉ và được xây dựng theo cách hoàn toàn giống nhau, dẫn đến việc chúng hoàn toàn giống nhau. Vì các giao dịch này giống hệt nhau, TXID cũng trùng khớp, bởi vì TXID là bản tóm tắt băm của dữ liệu giao dịch. Cách duy nhất khác để TXID bị sao chép là va chạm băm (hash collision), điều này được coi là gần như không thể và không thể thực hiện được đối với các hàm băm an toàn về mặt mật mã. Va chạm băm như SHA256 chưa từng xảy ra trong Bitcoin hay bất kỳ nơi nào khác.
Cả hai bộ giao dịch trùng lặp đều xảy ra trong khoảng thời gian gần nhau, từ 08:37 UTC ngày 14 tháng 11 năm 2010 đến 00:38 UTC ngày 15 tháng 11 năm 2010, kéo dài khoảng 16 giờ. Bộ giao dịch trùng lặp đầu tiên nằm giữa bộ thứ hai. Chúng tôi phân loại d5d2….8599 là giao dịch trùng lặp đầu tiên vì nó xuất hiện đầu tiên dưới dạng bản sao, mặc dù kỳ lạ thay, nó xuất hiện lần đầu tiên trên chuỗi khối sau giao dịch trùng lặp khác e3bf….b468.
Chi tiết về các giao dịch trùng lặp
Trong hình ảnh bên dưới, bạn có thể thấy hai ảnh chụp màn hình từ trình duyệt khối mempool.space, cho thấy giao dịch trùng lặp đầu tiên xuất hiện lặp lại trong hai khối khác nhau.


Điều thú vị là khi nhập URL liên quan vào trình duyệt web, trình duyệt khối mempool.space mặc định hiển thị khối sớm hơn trong trường hợp d5d2….8599, nhưng lại hiển thị khối muộn hơn trong trường hợp e3bf….b468. Blockstream.info và Btcscan.org hành xử giống như mempool.space. Mặt khác, theo thử nghiệm cơ bản của chúng tôi, Blockchain.com và Blockchair.com hành xử khác biệt, luôn hiển thị phiên bản mới nhất của giao dịch trùng lặp khi nhập URL vào trình duyệt.
Trong bốn khối liên quan, chỉ có một khối (khối 91.812) chứa các giao dịch khác. Giao dịch này đã gộp đầu ra 1 BTC và 19 BTC thành một đầu ra 20 BTC.
Các đầu ra này có thể được chi tiêu không?
Vì có hai cặp TXID giống nhau, điều này tạo ra vấn đề tham chiếu cho các giao dịch tiếp theo. Mỗi giao dịch trùng lặp có giá trị 50 BTC. Do đó, tổng cộng có 4 x 50 BTC = 200 BTC liên quan đến các giao dịch trùng lặp này, hoặc theo cách hiểu khác, có thể là 2 x 50 BTC = 100 BTC. Về cơ bản, có 100 BTC thực tế không tồn tại. Cho đến nay, cả 200 BTC đều chưa được chi tiêu. Theo những gì chúng tôi biết (chúng tôi có thể sai ở đây), nếu ai đó sở hữu khóa riêng liên quan đến các đầu ra này, họ có thể chi tiêu số Bitcoin đó. Tuy nhiên, một khi đã chi tiêu, UTXO sẽ bị xóa khỏi cơ sở dữ liệu, do đó 50 BTC trùng lặp sẽ không thể chi tiêu được nữa và bị mất, nghĩa là chỉ có thể lấy lại 100 BTC. Còn việc nếu các đồng tiền này được chi tiêu thì chúng sẽ đến từ khối nào — khối sớm hơn hay khối gần đây hơn — thì có thể là chưa xác định hoặc không thể xác định được.
Người này có thể đã chi tiêu tất cả Bitcoin trước khi tạo ra các giao dịch trùng lặp, sau đó tạo ra các đầu ra trùng lặp, tạo mục mới trong cơ sở dữ liệu đầu ra chưa chi tiêu. Điều này có nghĩa là không chỉ có giao dịch trùng lặp, mà còn có thể có giao dịch trùng lặp của các đầu ra đã chi tiêu. Nếu điều này xảy ra, khi các đầu ra này được chi tiêu, có thể tạo ra thêm nhiều giao dịch trùng lặp, hình thành một chuỗi trùng lặp. Người ta phải cẩn thận về thứ tự sự kiện, luôn chi tiêu trước khi tạo bản sao, nếu không Bitcoin có thể bị mất vĩnh viễn. Các giao dịch trùng lặp mới này sẽ không phải là giao dịch coinbase, mà là các giao dịch "bình thường". May mắn thay, tình huống này chưa từng xảy ra.
Vấn đề của các giao dịch trùng lặp
Các giao dịch trùng lặp rõ ràng là không tốt. Chúng gây rối loạn cho ví và trình khám phá khối, cũng làm mờ nguồn gốc của Bitcoin. Nó còn mở ra nhiều lỗ hổng và tấn công. Ví dụ, bạn có thể dùng hai giao dịch trùng lặp để thanh toán cho ai đó hai lần. Sau đó, khi bên nhận quyết định thử sử dụng khoản tiền này, họ có thể phát hiện chỉ có một nửa số tiền có thể thu hồi. Ví dụ, đây có thể là một cuộc tấn công vào sàn giao dịch nhằm khiến nó phá sản, trong khi kẻ tấn công thì không mất gì cả vì họ có thể rút tiền ngay sau khi gửi tiền.
Cấm giao dịch sử dụng TXID trùng lặp
Để giảm thiểu vấn đề giao dịch trùng lặp, vào tháng 2 năm 2012, nhà phát triển Bitcoin Pieter Wuille đã đề xuất phương án nâng cấp mềm BIP30, cấm giao dịch sử dụng TXID trùng lặp trừ khi TXID trước đó đã được chi tiêu. Nâng cấp mềm này áp dụng cho tất cả các khối sau ngày 15 tháng 3 năm 2012.
Tháng 9 năm 2012, nhà phát triển Bitcoin Greg Maxwell đã sửa đổi quy tắc này, khiến kiểm tra BIP30 áp dụng cho tất cả các khối, chứ không chỉ các khối sau ngày 15 tháng 3 năm 2012. Ngoại lệ là hai giao dịch trùng lặp được đề cập ở phần trước của bài viết. Điều này khắc phục một số lỗ hổng DOS. Về mặt kỹ thuật, đây lại là một đợt nâng cấp mềm, mặc dù việc thay đổi quy tắc chỉ áp dụng cho các khối cũ hơn 6 tháng trở lên, do đó nó không mang rủi ro liên quan đến các thay đổi quy tắc giao thức thông thường.
Việc kiểm tra BIP30 này tốn nhiều chi phí tính toán. Nút cần kiểm tra tất cả các đầu ra trong các giao dịch của khối mới và xác minh xem các điểm đầu ra này đã tồn tại trong UTXO hay chưa. Có lẽ đây là lý do tại sao Wuille chỉ kiểm tra đối với các đầu ra chưa sử dụng; nếu kiểm tra tất cả đầu ra thì chi phí sẽ cao hơn và không thể cắt tỉa (pruning).
BIP34
Tháng 7 năm 2012, nhà phát triển Bitcoin Gavin Andresen đã đề xuất phương án nâng cấp mềm BIP34, được kích hoạt vào tháng 3 năm 2013. Thay đổi giao thức này yêu cầu giao dịch coinbase phải chứa chiều cao khối, đồng thời cũng cho phép quản lý phiên bản khối. Chiều cao khối được thêm vào như phần tử đầu tiên trong scriptSig của giao dịch coinbase. Byte đầu tiên trong scriptSig coinbase là số byte dùng để biểu diễn con số chiều cao khối, các byte tiếp theo chính là con số chiều cao khối. Trong khoảng 160 năm đầu tiên (223 / (144 khối mỗi ngày * 365 ngày mỗi năm)), byte đầu tiên nên là 0x03. Đây là lý do tại sao scriptSig coinbase (HEX) ngày nay luôn bắt đầu bằng 03. Đợt nâng cấp mềm này dường như đã giải quyết triệt để vấn đề giao dịch trùng lặp, giờ đây mọi giao dịch đều nên là duy nhất.
Vì BIP34 đã được áp dụng, vào tháng 11 năm 2015, nhà phát triển Bitcoin Alex Morcos đã gửi một yêu cầu kéo (pull request) vào kho lưu trữ phần mềm Bitcoin Core, thay đổi này có nghĩa là các nút sẽ ngừng thực hiện kiểm tra BIP30. Dù sao đi nữa, vì BIP34 đã sửa lỗi này, việc kiểm tra tốn kém này không còn cần thiết nữa. Mặc dù lúc đó chưa ai biết, nhưng về mặt kỹ thuật đây là một đợt phân nhánh cứng (hard fork) trong tương lai dành cho một số khối rất hiếm gặp. Hiện tại, đợt phân nhánh tiềm năng này không còn quan trọng nữa, vì hầu như không ai còn chạy phần mềm nút trước tháng 11 năm 2015. Trên forkmonitor.info, chúng tôi vẫn đang chạy Bitcoin Core 0.10.3 phát hành vào tháng 10 năm 2015. Do đó, đây là một quy tắc trước phân nhánh cứng, máy khách vẫn đang thực hiện kiểm tra BIP30 tốn kém.
Vấn đề khối 983.702
Hóa ra, trong các khối trước khi kích hoạt BIP34, có một số giao dịch coinbase sử dụng byte đầu tiên trong scriptSigs trùng khớp với chiều cao khối hợp lệ trong tương lai. Do đó, mặc dù BIP34 thực sự đã sửa vấn đề này trong hầu hết mọi trường hợp, nhưng nó không phải là biện pháp khắc phục hoàn chỉnh 100%. Năm 2018, nhà phát triển Bitcoin John Newbery đã in ra danh sách đầy đủ các khả năng trùng lặp tiềm tàng, như trong bảng dưới đây.


*Ghi chú: Các khối này đã tạo ra giao dịch Coinbase không phải là bản sao vào năm 2012 và 2017. Khối 209.921 (cách lần giảm thưởng đầu tiên chỉ 79 khối) không thể là bản sao vì BIP30 đã được thực thi trong giai đoạn này.
Nguồn: https://gist.github.com/jnewbery/df0a98f3d2fea52e487001bf2b9ef1fd
Số lượng giao dịch Coinbase có khả năng trùng lặp tiềm tàng theo năm

Nguồn: https://gist.github.com/jnewbery/df0a98f3d2fea52e487001bf2b9ef1fd
Do đó, khối tiếp theo có thể tạo ra giao dịch trùng lặp là khối 1.983.702, dự kiến được tạo vào khoảng tháng 1 năm 2046. Giao dịch Coinbase trong khối 164.384 được tạo vào tháng 1 năm 2012 đã gửi 170 BTC đến bảy địa chỉ đầu ra khác nhau. Do đó, nếu thợ đào năm 2046 muốn thực hiện cuộc tấn công này, họ không chỉ cần may mắn đủ để tìm thấy khối này, mà còn phải đốt cháy chi phí chưa đến 170 BTC, tổng chi phí hơi vượt quá 170 BTC, bao gồm cả chi phí cơ hội là 0,09765625 BTC từ trợ cấp khối. Với giá Bitcoin hiện tại là 88.500 USD, chi phí sẽ vượt quá 15 triệu USD. Hiện tại chưa rõ bảy địa chỉ từ giao dịch coinbase năm 2012 thuộc về ai, rất có thể các khóa đã bị mất. Hiện tại, cả bảy địa chỉ đầu ra từ giao dịch Coinbase này đã được sử dụng, trong đó ba địa chỉ được sử dụng trong cùng một giao dịch này. Chúng tôi cho rằng số tiền này có thể liên quan đến vụ lừa đảo Ponzi Pirate40, nhưng đây chỉ là suy đoán của chúng tôi. Do đó, cuộc tấn công này không chỉ tốn kém mà còn gần như vô ích đối với kẻ tấn công. Việc chi một khoản lớn để loại bỏ các nút từ tháng 11 năm 2015 trong một hard fork cách đây 31 năm là điều không hề nhỏ.
Khối dễ bị tổn thương tiếp theo có thể bị sao chép là khối 169985 vào tháng 3 năm 2012. Giao dịch Coinbase này chỉ chi tiêu vừa trên 50 BTC, thấp hơn nhiều so với 170 BTC. Tất nhiên, 50 BTC là trợ cấp vào thời điểm đó, và khi giao dịch Coinbase này có thể bị sao chép vào năm 2078, trợ cấp sẽ thấp hơn nhiều. Do đó, để khai thác điều này, thợ đào sẽ cần đốt cháy phí khoảng 50 BTC, mà họ sẽ không thể lấy lại, vì các phí này phải được gửi đến các đầu ra cũ từ năm 2012. Không ai biết giá Bitcoin vào năm 2078 sẽ là bao nhiêu, nhưng chi phí cho cuộc tấn công này cũng có thể rất cao. Vì vậy, vấn đề này có thể không phải là rủi ro lớn đối với Bitcoin, nhưng vẫn đáng lo ngại.
Kể từ khi nâng cấp SegWit năm 2017, các giao dịch Coinbase cũng có thể chứa lời hứa về tất cả các giao dịch trong một khối. Các khối trước BIP34 này không chứa lời hứa chứng kiến (witness commitment). Do đó, để tạo ra một giao dịch Coinbase trùng lặp, thợ đào cần loại bỏ bất kỳ giao dịch chuộc lại SegWit nào khỏi khối, điều này làm tăng thêm chi phí cơ hội của cuộc tấn công, vì khối có thể không chứa được nhiều giao dịch trả phí khác.
Kết luận
Xét đến độ khó và chi phí cao để sao chép giao dịch, cùng với cơ hội khai thác cực kỳ hiếm, lỗ hổng giao dịch trùng lặp này không giống như một vấn đề an ninh nghiêm trọng đối với Bitcoin. Tuy nhiên, xét về quy mô thời gian liên quan và tính độc đáo của các giao dịch trùng lặp, thật thú vị để suy ngẫm. Dù sao đi nữa, trong nhiều năm qua, các nhà phát triển đã dành rất nhiều thời gian cho vấn đề này, và ngày 2046 có thể là hạn chót để sửa chữa lỗi này trong tâm trí một số nhà phát triển. Có nhiều cách để sửa lỗi này, có thể cần một đợt nâng cấp mềm. Một cách sửa chữa khả thi là thực thi bắt buộc lời hứa SegWit.
Chào mừng tham gia cộng đồng chính thức TechFlow
Nhóm Telegram:https://t.me/TechFlowDaily
Tài khoản Twitter chính thức:https://x.com/TechFlowPost
Tài khoản Twitter tiếng Anh:https://x.com/BlockFlow_News














