Ai kiểm soát Bitcoin, có phải bạn không? Hay ví? Phân tích địa chỉ BTC và nguyên tắc giao dịch
安比(SECBIT)实验室
2018-09-29 02:58
本文约7152字,阅读全文需要约29分钟
Nếu bạn đang sử dụng ví Bitcoin, thì bài viết này là dành cho bạn.

chữ

  • Lưu ý của biên tập viên: Bài viết này là của Ambi Lab, tác giả: Ambi Lab, và được xuất bản với sự cho phép.

  • Địa chỉ bitcoin có địa chỉ bắt đầu bằng 1 và địa chỉ bắt đầu bằng 3. Có sự khác biệt nào giữa hai địa chỉ này không?

  • Trong trường hợp nào bitcoin trên địa chỉ sẽ bị khóa?

  • Ai chính xác có quyền kiểm soát Bitcoin, bạn? Hay ví của bạn?

    Nếu bạn đang sử dụng ví Bitcoin và không thể trả lời ba câu hỏi trên, thì bài viết này là dành cho bạn.

    Khi phòng thí nghiệm SECBIT kiểm tra mã nguồn của ví kỹ thuật số, họ đã phát hiện ra rằng một thư viện nguồn mở ví bitcoin có tên pywallet chứa một lỗ hổng nghiêm trọng. Nếu bạn chuyển đến địa chỉ nhận OmniLayer được tạo bởi pywallet, tài sản sẽ bị mất vĩnh viễn.

    Theo zer0to0ne, một chuyên gia công nghệ chuỗi khối tại phòng thí nghiệm SECBIT, giao thức OmniLayer cho phép phát hành các tài sản tùy chỉnh (chẳng hạn như USDT) trên chuỗi khối Bitcoin. Bản chất của giao dịch tài sản OmniLayer là giao dịch bitcoin. Có nhiều cơ sở mã cho các giao dịch bitcoin và pywallet là một trong số đó. Nó có thể thuận tiện xây dựng các giao dịch Bitcoin tuân theo định dạng OmniLayer. Hiện tại, pywallet đã được áp dụng trong một số phần mềm ví kỹ thuật số.

    Tuy nhiên, khi thư viện mã nguồn mở pywallet tạo địa chỉ ví OmniLayer, nó đã đảo ngược nhầm tiền tố của địa chỉ và một số nội dung đã bị khóa trong địa chỉ không hợp lệ!

    Sau đây là ảnh chụp màn hình các mã lỗi liên quan đến pywallet:https://github.com/ranaroussi/pywallet/commit/eb784ea4dd62fe2a50e1352e7d24438fc66a4ac0#diff-ca3a8be6f2ab4be3bfd69a49f5f4122a

    Địa chỉ tệp:

    Nhảy vào hàng đợi và phổ biến khoa học: Có ba loại địa chỉ phổ biến nhất trên mạng Bitcoin: địa chỉ khóa công khai thông thường (1-địa chỉ), địa chỉ hàm băm tập lệnh (3-địa chỉ) và địa chỉ nhân chứng bị cô lập (địa chỉ bc1). phân biệt. Trong số đó, tiền tố của 1 địa chỉ là 0x00 và tiền tố của 3 địa chỉ là 0x05.

    • 1-Địa chỉ: Đây là địa chỉ Bitcoin phổ biến nhất, thường được sử dụng cho chuyển khoản và thanh toán thông thường. 1-Địa chỉ thực sự là mã hóa của khóa công khai Hash. Sau khi xác minh chữ ký của 1 địa chỉ, thanh toán có thể được mở khóa.

    • 3-Địa chỉ: Địa chỉ này là địa chỉ băm tập lệnh. Loại địa chỉ này thực sự tương ứng với mã của Bitcoin script Hash.

    • bc1-address: địa chỉ được mã hóa bech32, được sử dụng cho các giao dịch nhân chứng tách biệt.

    Thư viện mã nguồn mở pywallet đảo ngược tiền tố địa chỉ, đặt không chính xác địa chỉ 1 thành địa chỉ 3. Do đó, tài sản ban đầu dự định chuyển đến địa chỉ 1 sẽ bị chuyển nhầm sang địa chỉ 3. Khi chủ tài khoản sử dụng phương thức xác minh 1 địa chỉ, tức là chữ ký khóa riêng để rút tài sản, mạng chuỗi khối sử dụng tập lệnh thực thi 3 địa chỉ để thực hiện xác minh, dẫn đến việc người dùng không thể rút tài sản bình thường!

    Vui lòng sử dụng thư viện mã nguồn mở pywallet một cách thận trọng! !

    Sự thật: Bitcoin chưa bao giờ thực sự thực hiện chức năng chuyển tiền

    Điều này nằm ngoài dự đoán của nhiều người, bởi vì việc triển khai Bitcoin dựa trên mô hình UTXO, khác với mô hình tài khoản mà chúng ta hiểu bằng trực giác. zer0to0ne giải thích rằng, trên thực tế, Bitcoin chưa bao giờ thực sự thực hiện chức năng chuyển giao theo nghĩa thông thường. Satoshi Nakamoto chỉ thiết kế một loạt trình khai thác tập lệnh Bitcoin và trình thực thi tập lệnh Bitcoin cho Bitcoin, và cái gọi là quá trình chuyển giao thực sự được mô phỏng bằng quy trình khóa và mở khóa tập lệnh Bitcoin. Điều này khác với khái niệm sổ cái (hay mô hình tài khoản) trong cuộc sống hàng ngày.

    Để dễ hiểu, chúng ta có thể so sánh các giao dịch tài sản trên chuỗi khối Bitcoin với việc khóa tài sản trong két sắt và chỉ người giữ chìa khóa két sắt (tức là người nhận tiền) mới có thể lấy tài sản trong két ra để giao dịch. Ví dụ: nếu Alice muốn trả cho Bob một tài sản, Alice sẽ khóa tài sản đó trong két sắt và chỉ Bob mới có chìa khóa két sắt, tức là chỉ Bob mới có thể lấy tài sản ra. Nếu Bob muốn lấy tài sản ra thì đồng thời Bob phải tiêu tài sản đó (nghĩa là khóa nó vào một két sắt khác). Trước khi Bob lấy tài sản, tài sản không thực sự thuộc về Bob. Hãy tưởng tượng rằng nếu Bob mất chìa khóa thì sẽ không thể rút tài sản được nữa. Nói cách khác, khi tài sản vẫn được giữ trong két, nó không thuộc về Alice cũng như không hoàn toàn thuộc về Bob. Tất nhiên, Alice cũng có thể đặt tài sản vào két an toàn mà bất kỳ ai cũng có thể mở, đây còn được gọi là giao dịch Bất kỳ ai cũng có thể chi tiêu.

    Do các địa chỉ nhận khác nhau trên chuỗi khối Bitcoin nên có nhiều loại két khác nhau. Các loại két sắt khác nhau yêu cầu các loại chìa khóa khác nhau để mở. Người trả tiền tự làm két sắt cho người được trả tiền, cho tài sản vào két và khóa lại, sau đó vứt két ra nơi công cộng. Có hai cách để mở két sắt:

    • Nếu người nhận thanh toán là 1 địa chỉ, chúng tôi gọi két là két 1 loại. Khóa tương ứng phải là khóa riêng tương ứng với địa chỉ nhận được chỉ định. Quy trình mở khóa két sắt là xác minh khóa công khai 1 địa chỉ và chữ ký số tương ứng với khóa công khai, đây cũng là quy trình xác minh mà chúng ta thường hiểu đối với việc chuyển tiền vào địa chỉ tài khoản thông thường.

    • Nếu người nhận tiền là địa chỉ 3, chúng tôi gọi đó là loại két 3. Khóa mở khóa phải là tập lệnh Bitcoin có thể thực thi được. Quá trình mở khóa két sắt là: giá trị Hash của tập lệnh Bitcoin tương ứng với địa chỉ 3 và trình thực thi tập lệnh Bitcoin trả về thành công sau khi chạy tập lệnh. Điều đó có nghĩa là, chỉ những người có tập lệnh gốc và có thể thực thi thành công mới có thể trích xuất tài sản trong két sắt này.

    Quay lại câu hỏi trong phần này: Tại sao lại nói Bitcoin chưa bao giờ thực hiện chức năng chuyển giao theo đúng nghĩa. Câu trả lời rất đơn giản, bởi vì khái niệm tài khoản không tồn tại trong hệ thống Bitcoin và việc chuyển giữa các tài khoản là không cần thiết. Cũng không biết một người có thể mở bao nhiêu két trong tương lai.

    Qua giải thích trên ta thấy khi thư viện mã nguồn mở pywallet nhận nhầm địa chỉ 1 thành địa chỉ 3 thì cũng giống như biến két loại 1 ban đầu thành két loại 3 và chủ tài khoản vẫn giữ 1 - dùng chìa khóa két mở được thì tự nhiên két không mở được. Vì vậy, các tài sản kỹ thuật số OmniLayer bị khóa nhầm bởi zer0to0ne có thể được phục hồi không?

    Có khả năng sử dụng khóa 1 địa chỉ để mở két 3 không?

    zer0to0ne sau đó đã giải thích cho chúng tôi thông tin chi tiết về hai khái niệm quan trọng, P2PKH (Trả cho Băm khóa công khai) và P2SH (Trả cho Băm tập lệnh). Hai danh từ này đại diện cho hai loại giao dịch Bitcoin khác nhau.

    Sau đây là một phân tích chi tiết kỹ thuật tuyệt vời của zer0to0ne

    P2PKH - phát minh vĩ đại của Satoshi Nakamoto

    Base58(0x00 + + Checksum)

    Pay to Public Key Hash, đúng như tên gọi, là đưa Bitcoin vào một nơi an toàn, và lỗ khóa chính là Hash khóa công khai (Public Key Hash). Địa chỉ 1 phổ biến nhất mà chúng tôi thấy về cơ bản là mã hóa của Băm khóa công khai. 1- Quá trình tạo địa chỉ cũng rất đơn giản, public key được tính toán thông qua Hash160 để lấy Public Key Hash, tiền tố 0x00 được thêm vào phần đầu của Public Key Hash, checksum được thêm vào cuối Hash, và Bitcoin ở đầu số 1 được lấy thông qua địa chỉ Base58.

    Hãy cùng xem quy trình xây dựng an toàn của loại giao dịch P2PKH Alice gửi Bitcoin cho Bob làm ví dụ:

    OP_DUP 

    OP_HASH160 

    Người trả tiền Alice cần thiết lập tập lệnh khóa khi xây dựng két sắt:

    OP_EQUALVERIFY 

    OP_CHECKSIG

    (Public Key Hash có trong địa chỉ nhận của Bob)

    Lưu ý: Chúng ta có thể hiểu bước này là Alice tùy chỉnh két sắt cho Bob, đặt bitcoin vào két và khóa nó bằng khóa công khai PubKey Hash của Bob. Bây giờ không ai có thể mở khóa này ngoại trừ Bob, người giữ khóa riêng.

    Khi Bob cần tiêu số bitcoin mà Alice đã đưa cho anh ta, anh ta cần cung cấp các tham số cần thiết: chữ ký giao dịch + khóa công khai (biệt ngữ kỹ thuật: scriptSig) để mở két, để tập lệnh khóa trả về True sau khi thực hiện. Bước này thường là được thực hiện tự động bởi ví.

    Chúng ta hãy xem cách nút Bitcoin xác minh tính hợp pháp của scriptSig.

    (Hình ảnh từ Mastering Bitcoin) Quá trình thực thi tập lệnh được hiển thị trong hình, dữ liệu mà Bob thu được sau khi ký giao dịch (thực tế bao gồm thông tin về độ dài dữ liệu), scriptSig thực phải là

    , trình thực thi tập lệnh Bitcoin bắt đầu từ dữ liệu PUSH, thao tác PUSH sẽ đọc byte đầu tiên để lấy thông tin về độ dài của dữ liệu sẽ được đẩy vào ngăn xếp, sau đó tiếp tục thực thi tập lệnh Bitcoin cho đến khi hoàn thành việc thực thi để kiểm tra kết quả thực hiện.Ngăn xếp đầu tiên là,Sau đó, HASH160 pop top stack và tính Hash, đẩy kết quả về stack, sau đó dùng EQUALVERIFY bật Hash lên để so sánh xem có bằng nhau không, nếu bằng thì trả về True, nếu không bằng nhau thì giao dịch bị coi là vô hiệu. Ở bước này, khóa chung được hiển thị để đảm bảo tính chính xác của danh tính người ký, nhưng tin tặc hoặc người khai thác có thể sử dụng khóa chung bị lộ để tạo giao dịch mới thay thế giao dịch ban đầu, điều này không thể đảm bảo tính bảo mật, vì vậy bước tiếp theo là bắt buộc Các giao dịch được đảm bảo không thể bị giả mạo. Lúc này vẫn còn

    , Thực thi CHECKSIG sẽ xác minh tính chính xác của chữ ký điện tử, đảm bảo rằng người ký có khóa riêng tương ứng với địa chỉ.

    Không ai có thể giả mạo chữ ký điện tử ngoại trừ người nắm giữ khóa cá nhân. Cho đến nay, một giao dịch Bitcoin P2PKH đã được hoàn thành một cách an toàn.

    Giải thích lại: Khi Bob muốn tiêu số bitcoin mà Alice đã đưa cho anh ta, Bob chỉ có thể mở chiếc két do Alice để lại bằng chìa khóa chính xác và bỏ tiền vào một chiếc két mới được xây dựng cho Bob.

    Tại thời điểm này, một số độc giả thông minh sẽ chú ý đến một chi tiết: nếu Bob lấy chìa khóa ra, bất kỳ người khai thác nào trên chuỗi khối cũng có thể nhìn thấy hình dạng của chiếc chìa khóa trước khi mở két và về mặt lý thuyết, họ có thể sao chép ngay một chiếc chìa khóa để mở và tiêu xài của Alice. an toàn với Bob (thường được gọi là Tấn công chạy trước). Có thực sự có thể làm điều này? Rõ ràng Satoshi Nakamoto đã xem xét vấn đề này, chữ ký giao dịch trong khóa này là chữ ký hoàn chỉnh của giao dịch do Bob khởi tạo. Giả sử rằng Bob muốn đặt bitcoin trong két sắt do Alice xây dựng vào một két sắt mới (dành cho Charlie). Tại thời điểm này, khóa do Bob đưa ra chứa khóa công khai Hash của Charlie. Mặc dù người khai thác có thể sao chép khóa của Bob, nhưng khóa này chính là chìa khóa thông tin của két mới tiếp theo đã bị ẩn, vì vậy những người khai thác không thể sử dụng khóa trùng lặp này để hoàn thành các hành động khác (không thể biển thủ chữ ký số).

    P2SH - một sự đổi mới lớn trong thời kỳ hậu Satoshi

    Satoshi Nakamoto đã thiết kế một hệ thống tập lệnh mạnh mẽ như vậy, nếu chỉ sử dụng nó để xây dựng các giao dịch chuyển nhượng thì có vẻ quá lãng phí.Chúng ta hãy thử xây dựng một số tập lệnh khóa đặc biệt với các hướng dẫn khác và sử dụng các phương pháp khác để mở khóa chúng.

    OP_HASH160

    OP_EQUAL

    Ví dụ: chúng ta có thể xây dựng một tập lệnh sử dụng hình ảnh trước Hash để mở khóa các giao dịch:Ý nghĩa của tập lệnh này là: khi Hash160(Pre-image)== được thỏa mãn

    Khi điều kiện này được đáp ứng, tập lệnh có thể được mở khóa thành công.

    Chúng tôi tiếp tục với ví dụ về két sắt và đặt tên cho loại két sắt này là két sắt loại 3. Bây giờ bitcoin của Alice cho Bob được khóa trong két an toàn được bảo vệ bởi Hash160 ở trên, hãy gọi nó là khóa băm.

    Ổ khóa này vẫn yêu cầu hình dạng chính xác để mở nhưng tính bảo mật yếu hơn nhiều, việc thiếu cơ chế chữ ký điện tử khiến thông tin khóa bị ẩn bởi chìa khóa không thể thay đổi với chiếc két sắt mới của Bob. Bất kỳ người khai thác nào cũng có thể sao chép chính xác cùng một khóa vào thời điểm Bob đưa chìa khóa, nhanh chóng mở két sắt (Chạy trước) do Alice để lại cho Bob và chuyển tiền cho người khác, Eve, để những đồng tiền ban đầu thuộc về Bitcoin của Bob sẽ bị cướp bóc.

    Mặc dù tập lệnh này rất không an toàn, nhưng nó có hai chức năng rất kỳ diệu:

    1. Đầu ra của cấu trúc giao dịch đủ ngắn, điều đó có nghĩa là không gian bị chiếm dụng bởi bộ đệm UTXO được duy trì bởi nút Bitcoin sẽ giảm đáng kể

    2. Hình ảnh trước luôn được tham chiếu làm đầu vào khi giao dịch được chi tiêu và sẽ không xuất hiện ở phía đầu ra của giao dịch. UTXO vẫn được sắp xếp hợp lý và gánh nặng phí xử lý có thể được chuyển cho người nhận.

    Vì tập lệnh đầu ra được mô tả có nhiều lợi ích, nên có cách nào để chúng tôi có thể thực hiện giao dịch này an toàn không? Điều này đòi hỏi phải nói về P2SH là gì.

    Nhà phát triển Bitcoin Core, Gavin Adresen, đã đề xuất một kỹ thuật có tên là Pay to Script Hash (P2SH).