Tác giả: Jameson Lopp
Nguồn: https://blog.lopp.net/running-bitcoin-core-v0-7-and-earlier/
Bài viết này là trong đó những kết quả nghiên cứu của tôi về hiệu suất đồng bộ hóa lịch sử của tất cả các bản phân phối Bitcoin Core, cũng như những thách thức khi xây dựng các phiên bản thực sự cũ (khó tìm thấy các tệp nhị phân đã biên dịch).
Lưu ý rằng nếu bạn dự định sử dụng các phiên bản Bitcoin Core này để đồng bộ hóa blockchain, bạn sẽ gặp khó khăn. Tôi không phải là người đầu tiên khám phá vấn đề này: trong quá trình nghiên cứu của mình, tôi phát hiện ra rằng Sjors Provoost đã thực hiện một thí nghiệm tương tự vào năm 2017 và cũng đã ghi lại nó.
Hiệu suất của các khách hàng Bitcoin Core cũ hơn – Sjors Provoost
Khám phá lỗi trong quá trình đồng bộ hóa
Không có phiên bản nào trước v0.8.0 có thể được đồng bộ hóa lên đầu chuỗi hiện tại vì nhiều lý do.
v 0.3 : Đã dừng đồng bộ hóa ở Block Height 12 4275, gửi lỗi này:
ERROR: ConnectInputs() : fb0a1d8d34 VerifySignature failedInvalidChainFound: invalid block=0000000000004939267fheight=124276 work=6613870563198902508
Thoạt nhìn, đây không phải là một thỏa thuận đặc biệt kỳ lạ. Tuy nhiên, nếu kiểm tra lịch sử chi tiêu của địa chỉ Bitcoin này , chúng ta có thể thấy rằng người chi tiêu đã thực hiện một số giao dịch kỳ lạ với hàng trăm kết quả đầu ra "0 giá trị". Không quá khi cho rằng đây là một kỹ thuật viên đang cố gắng phá hoại mạng.
Cuối cùng, điều làm tôi ngạc nhiên là kích thước của chữ ký đầu vào này. 75 byte là giới hạn tối đa cho chữ ký và chữ ký của hầu hết các giao dịch P2PKH là 71 ~ 73 byte.
Bạn có thể đọc về lịch sử chữ ký giao dịch Bitcoin trong bài viết sau; lưu ý rằng nếu bạn cố gắng sử dụng phiên bản OpenSSL mới hơn (1.0.0p / 1.0.1k) để theo dõi các chữ ký xuất hiện trên chuỗi trước đó, bạn Sẽ xảy ra lỗi do quá trình xác thực DER nghiêm ngặt hơn và từ chối một số loại mã hóa nhất định.
Thay đổi kích thước chữ ký trong Bitcoin
Phương pháp là sử dụng phiên bản OpenSSL cũ hơn để xây dựng Bitcoin Core hoặc áp dụng bản vá mã này theo cách thủ công trước khi bắt đầu quá trình xây dựng. Lúc đầu, tôi hơi bối rối, vì trình tạo gitian sử dụng máy ảo Ubuntu 10.04 làm hoàn cảnh xây dựng và tôi nghĩ nó nên được ghép nối với phiên bản OpenSSL cũ hơn (tương thích)... Tuy nhiên, Andrew Chow đã chỉ ra rằng họ đã nhập lại nó vào năm 2015 (backport) bản vá OpenSSL này .
Cả v0.4 và v0.5 đều ngừng đồng bộ hóa ở Block Height 25 8354, gửi lỗi:
EXCEPTION: 11DbExceptionDb::put: Cannot allocate memorybitcoin in ProcessMessage()ProcessMessage(block, 901212 bytes) FAILEDreceived block 0000000000000023e872REORGANIZE
Điều này rất đáng chú ý vì có vẻ như 25 8355 là khối đầu tiên đạt kích thước 900 KB; trước đó, hầu hết tất cả các khối được khai thác chỉ đạt đến “softcap” mặc định là 250 KB.
v0.6 dừng đồng bộ hóa ở Block Height 36 4670 và phát sinh lỗi:
EXCEPTION: 11DbExceptionDb::put: Cannot allocate memorybitcoin in ProcessMessages()ProcessMessage(block, 999787 bytes) FAILEDreceived block 000000000000000001d3
Có những điểm tương đồng ở đây, vì có vẻ như khối 36 4671 là khối đầu tiên đạt tới 1MB.
v0.7 dừng đồng bộ hóa trong cùng một khối, nhưng nhật ký lỗi thì khác:
received block 00000000000000000221ERROR: ConnectBlock() : UpdateTxIndex failedInvalidChainFound: invalid block=00000000000000000221 height=364671ERROR: SetBestChain() : SetBestChainInner failedERROR: AcceptBlock() : AddToBlockIndex failedERROR: ProcessBlock() : AcceptBlock FAILED
Tôi đoán v0.4 ~ v0.7 đều bị dừng vì lý do tương tự, nhưng lý do đó là gì? Đây có phải là "sự cố khóa BDB" (gây ra sự chia tách chuỗi không mong muốn vào năm 2013)?Dựa trên những hướng dẫn này , tôi cố gắng tạo một tệp ~/.bitcoin/DB_CONFIG
:
set_lg_dir databaseset_lk_max_locks 537000
Nhưng mọi phiên bản vẫn bị kẹt ở cùng một Block Height. Hóa ra bạn cũng cần định cấu set_lk_max_objects
và giá trị được đề xuất ban đầu (537000) không đủ cao (nếu bạn muốn đồng bộ hóa với khối 70 0000). Giá trị ~/.bitcoin/DB_CONFIG
sau hoạt động trên máy của tôi:
set_lg_dir databaseset_lk_max_locks 1000000set_lk_max_objects 1000000
Kết quả thực hiện
Bạn có thể thấy kết quả đồng bộ hóa thô của tôi.
Bạn khó có thể nhìn thấy dữ liệu về v0.3 vì nó gần giống với v0.4 và v0.5, cuối cùng bị lỗi ở Block Height 12 4000. Dưới đây là phiên bản logarit để thấy rõ hơn một chút.
Điều đáng nói là có một bước ngoặt ở khối 19 0000, từ đó v0.4 bắt đầu hoạt động tốt hơn v0.5. Dự đoán tốt nhất của tôi là đây là kết quả của một "điểm kiểm tra". Bitcoin 0.3.2 đã giới thiệu một cơ chế gọi là "điểm kiểm tra" để đảm bảo rằng nút đầy đủ mới không tốn lượng lớn thời gian trong quá trình tải xuống khối ban đầu để xác minh các khối cạnh tranh không nằm trên chuỗi tốt nhất đã biết, từ đó ngăn chặn cuộc tấn công từ chối dịch vụ.
Bitcoin 0.5.0 được xây dựng trên các điểm kiểm tra này để tăng tốc độ đồng bộ hóa bằng cách bỏ qua xác minh chữ ký trên blockchain trước điểm kiểm tra gần đây nhất. Bạn có thể nói, "Bạn không nhầm sao? Bạn không thể buộc nút xác minh tất cả chữ ký bằng cách định cấu hình assumevalid=0
?" Điều đó đúng, nhưng cài đặt này không có hiệu lực trên Bitcoin Core sớm hơn v0.14. (v0.14 là lần đầu tiên thông số cấu hình này được giới thiệu .)
Do đó, tôi cho rằng rằng v0.5 nhìn chung chậm hơn v0.4 và các thử nghiệm hiệu suất đồng bộ hóa ban đầu thực sự là những so sánh gian lận/không công bằng.
Phiên bản cũ so với phiên bản mới
Vậy phiên bản v22 mới nhất có cải thiện hiệu năng bao nhiêu so với các phiên bản cũ này?
Đồng bộ vào khối 12 4000:
- v22 nhanh hơn 17 lần so với v0.3
Các khối này đều trống, do đó, sự khác biệt về hiệu suất không đáng chú ý nhưng sẽ trở nên đáng chú ý nếu có nhiều blockchain hơn được đồng bộ hóa.
Đồng bộ hóa với Block Height 25 8000:
- v22 nhanh hơn 77 lần so với v0.4
- v22 nhanh hơn 83 lần so với v0.5
Đồng bộ vào khối 36 4000:
- v22 nhanh hơn 40 lần so với v0.6
- v22 nhanh hơn 38 lần so với v0.7
Khả năng tương thích về phía trước là khó khăn
Bạn có thể thường xuyên nghe thấy tuyên bố rằng bạn có thể chạy phiên bản phần mềm Bitcoin rất cũ và nó vẫn tương thích với mạng hiện tại. Tất nhiên, câu trả lời thực sự phức tạp và nhiều sắc thái hơn nhiều. Để đồng bộ hóa phiên bản cũ của phần mềm Bitcoin với đầu chuỗi hiện tại, bạn cần thực hiện một số thay đổi đối với phần mềm. Một điều khó khăn nữa là nếu bạn giảm bớt nó, không phải tất cả các mã quan trọng về sự đồng thuận đều được viết bởi các nhà phát triển Bitcoin- đôi khi đó là các thư viện của bên thứ ba và các thư viện này có thể thay đổi theo thời gian, khiến chính quá trình xây dựng phần mềm trở thành một nguyên nhân có thể xảy ra của sự đồng thuận thất bại!
(qua)