Tiêu đề gốc: "Thông tin khô khan | Giải thích chi tiết về Nhân chứng tách biệt"
Tác giả gốc: Magomed Aliev
Bản gốc biên soạn: Ajian, người đam mê Ethereum

Ví dụ: một ý tưởng là "Lightning Network" ; Tuy nhiên, các điều kiện dường như không được đáp ứng để triển khai Lightning Network trong mạng Bitcoin do bản thân Bitcoin có một số thiếu sót. Một giải pháp khác, Segregated Witness, cũng nhằm mục đích cải thiện khả năng mở rộng, nhưng nó cũng giải quyết được nhiều vấn đề, bao gồm một số sai sót cần được khắc phục trong quá trình triển khai Lightning Network. Trong bài viết này, chúng tôi sẽ giải thích những ưu điểm của Segwit và cách thức hoạt động của nó.
Segregated Witness (SegWit) được mô tả bởi nhiều BIP (141, 142, 143, 144 và 145) Phần mềm fork chủ yếu nhằm mục đích tối ưu hóa các giao dịch Bitcoin và cấu trúc của khối di chuyển chữ ký giao dịch (còn được gọi là "scriptSig", "nhân chứng" hoặc "tập lệnh mở khóa") từ giao dịch sang một cấu trúc riêng biệt. Nó không chỉ cho phép giảm kích thước dữ liệu của các giao dịch Bitcoin (do đó cho phép nhiều giao dịch được nhồi nhét vào một khối) mà còn giải quyết được vấn đề “dễ thay đổi giao dịch” (mà chúng tôi đã đề cập ở phần đầu gây cản trở việc triển khai Lightning Network) sai sót), cực kỳ quan trọng đối với các công nghệ dựa trên cấu trúc giao dịch Bitcoin như kênh thanh toán và Lightning Network.
Trước tiên chúng ta cần xem xét ngắn gọn hệ thống thanh toán Bitcoin. Nó không phải là danh sách các tài khoản và số dư như ngân hàng. Thay vào đó, số dư của mỗi địa chỉ Bitcoin được thể hiện bằng một loạt giao dịch được gửi đến địa chỉ đó; phần chính của cấu trúc dữ liệu giao dịch là đầu vào và đầu ra. Đầu vào là giao dịch trước đó mà chúng tôi muốn chi tiêu (nói chính xác, đầu vào sẽ không phải là một giao dịch hoàn chỉnh mà là đầu ra của một giao dịch nhất định, vì chúng tôi có thể chuyển tiền đến nhiều địa chỉ trong một giao dịch), Đầu ra của giao dịch là địa chỉ đích mà tiền của chúng tôi được gửi đến. Hình dưới đây cho thấy cấu trúc của giao dịch Bitcoin:

Trường Tập lệnh PubKey ở đầu ra (sau đây gọi là "scriptPubKey") là cái gọi là "kịch bản khóa" của chúng tôi. Nó được sử dụng để đảm bảo rằng chỉ chủ sở hữu của địa chỉ chấp nhận mới có thể sử dụng khoản thanh toán. Trường Chữ ký Chữ ký (sau đây gọi là "scriptSig") còn được gọi là "tập lệnh mở khóa" vì nó là khóa dùng để mở tập lệnh khóa và dùng để chứng minh quyền sở hữu địa chỉ.
(Ghi chú của biên tập viên: Đây là ảnh gif cho thấy cách thực thi ngăn xếp Bitcoin, nhưng tài khoản chính thức của WeChat thì không thể hiển thị trong tweet. Bạn nên xem nó trên trang web.)
Cập nhật về các giao dịch Bitcoin và tập lệnh khóa và tập lệnh mở khóa Chức năng Thông tin chi tiết có thể được tìm thấy ở đây.
Trên thực tế, Segregated Witness không chỉ thay đổi cấu trúc giao dịch mà còn thay đổi đầu ra của giao dịch. Tuy nhiên, điều này không có nghĩa là không thể sử dụng UTXO loại truyền thống (đầu ra giao dịch chưa được chi tiêu) và UTXO loại SegWit trong cùng một giao dịch: trong trường hợp này, UTXO loại truyền thống sẽ tải bằng chứng về quyền sở hữu trong đầu vào (chữ ký tập lệnh field) , trong khi UTXO loại Segwit sẽ tải bằng chứng trong cấu trúc khác với đầu vào giao dịch.
Trong mọi trường hợp, Segregated Witness được định vị là một soft fork. Việc nâng cấp này nên được bỏ qua và không cần thiết phải mang tính bắt buộc. , điều này cũng có nghĩa là các nút không được nâng cấp sẽ có thể xử lý đầu ra kiểu Segwit. Trên thực tế, các nút cũ và ví sẽ cho rằng bất kỳ ai cũng có thể Chi tiêu những thứ này UTXO, nghĩa là những UTXO này có thể được sử dụng với chữ ký trống, vì vậy ngay cả khi không nhìn thấy chữ ký nào trong giao dịch thì giao dịch vẫn hợp lệ. Các nút và ví được nâng cấp sẽ tìm kiếm chữ ký bên ngoài đầu vào giao dịch, trong trường “nhân chứng” chuyên dụng.
Chúng tôi sử dụng các ví dụ để minh họa cách Segregated Witness sẽ thay đổi cấu trúc dữ liệu của giao dịch. Bắt đầu với loại giao dịch Pay-to-Public-Key-Hash (P2PKH) tiêu chuẩn.
Phần chúng ta quan tâm là đầu ra, cụ thể là trường "scriptPubKey" của nó (trường tập lệnh bị khóa). Trước tiên chúng ta hãy xem xét một tập lệnh khóa tiêu chuẩn:

Kịch bản khóa sau Segregated Witness như sau:

Như bạn thấy, đầu ra của Segwit đơn giản hơn nhiều so với kiểu đầu ra truyền thống: chỉ có hai giá trị là Push vào ngăn xếp thực thi tập lệnh. Như chúng tôi đã nói ở trên, các phiên bản cũ hơn của khách hàng Bitcoin sẽ nghĩ rằng đầu ra này là tiền rơi xuống đất - họ có thể chi tiêu đầu ra này mà không cần cung cấp chữ ký. Tuy nhiên, khách hàng mới sẽ hiểu số đầu tiên là số phiên bản và số thứ hai là tập lệnh khóa (chương trình chứng kiến). Trong thực tế, chỉ có thể sử dụng hàm băm của khóa chung được nén ở đây. Chúng ta sẽ nói về điều này sau.
Hãy xem điều gì sẽ xảy ra khi lượng sản phẩm đầu ra này được chi tiêu. Cấu trúc dữ liệu của đầu ra giao dịch truyền thống khi chi tiêu như sau:

Tuy nhiên, khi sử dụng một đầu ra Segwit, scriptSig của giao dịch sẽ trống và tất cả chữ ký sẽ được đặt ở một nơi dành riêng:

Cảnh báo p>
Trong khi khách hàng truyền thống có thể xử lý các giao dịch Segwit (một lần nữa, họ sẽ coi những kết quả đầu ra này là tiền mà mọi người đều có thể chi tiêu), nhưng họ không thể tự mình tiêu tiền: Các ví cũ hơn có thể cố gắng chi tiêu đầu ra Segwit với chữ ký trống, nhưng trên thực tế, giao dịch đó không hợp lệ (các nút sau khi cập nhật sẽ không cho phép các giao dịch đó được tải lên chuôi). Điều này có nghĩa là người gửi phải biết liệu ví của người nhận có hỗ trợ SegWit hay không để có thể tạo loại đầu ra phù hợp cho nó.
Theo định nghĩa của BIP 143, đầu ra của SegWit phải được tạo bằng cách sử dụng hàm băm của khóa công khai được nén . Nếu bạn sử dụng loại địa chỉ truyền thống hoặc hàm băm của khóa công khai không nén, đầu ra này sẽ không thể sử dụng được (đồng tiền của bạn sẽ bị khóa).
Ngoài ra Loại giao dịch chính là P2SH. Nó cho phép các giao dịch được gửi tới hàm băm của tập lệnh (chứ không phải hàm băm của khóa chung, tức là địa chỉ Bitcoin). Để chi tiêu đầu ra của giao dịch P2SH, người chi tiêu cần cung cấp một tập lệnh (được gọi là "tập lệnh đổi quà") có hàm băm phải khớp với hàm băm tập lệnh trong UTXO và cung cấp chữ ký/mật khẩu/bất cứ thứ gì dựa trên tập lệnh này. Việc sử dụng này có thể bảo vệ tập lệnh mở khóa để người gửi không thể biết nội dung của địa chỉ và cũng có thể tiết kiệm dung lượng: ví dụ: tập lệnh khóa của ví nhiều chữ ký có thể rất dài nên chúng ta phải lưu toàn bộ khóa; Với P2SH bạn chỉ có thể lưu một giá trị băm.
Giả sử bạn có một ví đa chữ ký yêu cầu chữ ký của 2 trong số 5 khóa riêng tư mới được sử dụng. Nếu bạn sử dụng các giao dịch truyền thống, tập lệnh khóa cho đầu ra giao dịch P2SH sẽ như sau:
p>
Khi đến lúc phải tiêu, người tiêu nó (cũng người nhận giao dịch trước đó) cần cung cấp tập lệnh quy đổi, trong đó xác định các điều kiện chi tiêu (đa chữ ký, 2-5) và hai chữ ký. Tất cả những điều này phải được đặt trong đầu vào của giao dịch:

Hãy cùng xem xét người gửi và người nhận sau khi sử dụng Segregated Witness. Kịch bản khóa đầu ra như sau:
p>
Giống như giao dịch P2PKH, tập lệnh cho đầu ra này cũng đơn giản hơn. Giá trị đầu tiên đại diện cho số phiên bản và giá trị thứ hai là giá trị băm SHA256 (32 bit) tương ứng với tập lệnh đổi thưởng (chương trình chứng kiến). Hàm này được sử dụng một phần để phân biệt giữa nhân chứng của P2WPKH và nhân chứng của P2WSH theo độ dài (băm SHA256 32 byte so với RIPpD160(SHA256(script))).
Một giao dịch sử dụng kết quả đầu ra này sẽ trông như thế này:

Chúng tôi có thấy rằng có những lợi ích khi sử dụng Segwit. Tuy nhiên, ví dụ trên chỉ áp dụng nếu cả người gửi và người nhận đều đã cập nhật phần mềm. Nhưng thực tế không phải lúc nào cũng như vậy. Hãy xem xét tình huống này:
Alice muốn chuyển một số btc cho Bob. Bob có phần mềm ví hỗ trợ Segwit còn cô ấy thì không. Rõ ràng là họ chỉ có thể sử dụng các hình thức giao dịch tiêu chuẩn, nhưng Bob muốn sử dụng SegWit để giảm phí.
Tại thời điểm này, Bob có thể tạo địa chỉ P2SH chứa tập lệnh SegWit và Alice sẽ coi địa chỉ này là địa chỉ P2SH thông thường . , vì vậy việc chuyển tiền có thể được thực hiện trực tiếp đến địa chỉ này mà không gặp bất kỳ trở ngại nào. Nhưng Bob có thể sử dụng các giao dịch SegWit để sử dụng kết quả đầu ra này và được giảm phí (chúng tôi sẽ giải thích phương pháp định giá mới cho phí giao dịch SegWit bên dưới).
Đây là cách hai loại giao dịch SegWit, P2WSH và P2WPKH, được triển khai trong P2SH.
Để triển khai giao dịch P2WPKH trong giao dịch P2SH, Bob cần tạo chương trình nhân chứng bằng khóa chung của mình. Sau đó băm và chuyển mã kết quả thành một địa chỉ:

Giá trị đầu tiên là số phiên bản và giá trị thứ hai là hàm băm khóa chung 20 byte. Tập lệnh này trước tiên thực hiện thao tác băm SHA256, sau đó thực hiện thao tác RIPpD160 để thu được giá trị băm 20 byte.
Kết quả HASH160 của chương trình nhân chứng P2WPKH này:

Chuyển đổi sang địa chỉ:

Kịch bản khóa đầu ra được gửi tới địa chỉ này trông giống như P2SH bình thường Không có sự khác biệt trong tập lệnh của địa chỉ:

p>
Sau đó khi Bob chi tiêu đầu ra thì cấu trúc giao dịch sẽ như thế này:

Lúc đầu, kịch bản chuộc lỗi mà chúng tôi tạo ra (tức là chương trình nhân chứng) sẽ trải qua một Tính toán hàm băm, nếu kết quả khớp với giá trị băm trong tập lệnh khóa, tập lệnh sẽ được thực thi và chương trình sẽ xác minh chữ ký được đặt trong trường nhân chứng.
Các tập lệnh P2WSH cũng có thể được triển khai bằng P2SH. Hãy xem xét ví dụ về ví đa chữ ký 2-5 được đề cập ở trên. Tất cả các bước đều không khác gì P2SH (P2WPKH):
Đầu tiên, tạo chương trình nhân chứng:

Giá trị đầu tiên là số phiên bản, giá trị thứ hai là giá trị là hàm băm SHA256 32 bit tương ứng với tập lệnh chữ ký của chúng tôi. Sau đó, chúng tôi lấy giá trị băm HASH160 của chương trình nhân chứng này và chuyển đổi nó thành địa chỉ P2SH bình thường. Để sử dụng đầu ra cho địa chỉ này, chúng tôi cần xuất bản nhân chứng trong trường scriptSig và cung cấp tập lệnh đa chữ ký hoàn chỉnh trong trường chứng thực.
p>
Sau khi phân loại phần kỹ thuật, chúng ta có thể hiểu được những ưu điểm chính của Segregated Witness.
Trong các giao dịch Bitcoin trước đây, chữ ký được đặt trong phần đầu vào của giao dịch và bên thứ ba có thể thay đổi chữ ký mà không cần Hãy để giao dịch mất hiệu lực. Điều này cho phép bên thứ ba thay đổi ID giao dịch (nghĩa là giá trị băm của giao dịch) mà không thay đổi các trường "khóa" của giao dịch (chẳng hạn như số lượng đầu vào, đầu ra, chuyển khoản). Bằng cách này, giao dịch vẫn hợp lệ và ý nghĩa vẫn như cũ, nhưng với một ID khác, điều này có thể được sử dụng để thực hiện một cuộc tấn công khác, chẳng hạn như tấn công DoS (tấn công từ chối dịch vụ).
SegWit giải quyết được vấn đề này vì tất cả chữ ký đều được đặt bên ngoài giao dịch nên những thay đổi trong chữ ký sẽ không gây ra thay đổi về giá trị băm của giao dịch, tức là không ảnh hưởng đến ID giao dịch. Segregated Witness cũng giới thiệu một mã định danh đặc biệt gọi là "wtxid": đó là giá trị băm của giao dịch và toàn bộ phần nhân chứng, vì vậy nếu một giao dịch được truyền bá mà không có bất kỳ dữ liệu nhân chứng nào thì ID giao dịch (txid) sẽ bằng wtxid .
Giải pháp này cho phép chúng tôi tạo một chuỗi các giao dịch liên tiếp chưa được xác nhận mà không lo lắng về bất kỳ rủi ro nào, điều này rất quan trọng đối với Lightning Network Một thỏa thuận như vậy là rất quan trọng. (Lưu ý của người dịch: Ý ở đây có thể là nếu vấn đề về tính tan chảy của giao dịch không được giải quyết, những người tham gia kênh thanh toán sẽ không thể nhanh chóng truy xuất xem đối thủ có đưa giao dịch kênh lỗi thời vào chuỗi hay không, vì giao dịch có cùng nội dung có thể xuất hiện các ID hoàn toàn khác nhau).
Dữ liệu nhân chứng thường là phần lớn nhất của dữ liệu giao dịch. Trong các giao dịch sử dụng tập lệnh đa chữ ký, nhân chứng có thể chiếm tới 75% khối lượng dữ liệu giao dịch. Nhờ SegWit, việc truyền chữ ký trở thành tùy chọn: các nút chỉ cần yêu cầu dữ liệu này nếu họ muốn xác minh giao dịch. Các máy khách và nút SPV (Xác minh thanh toán đơn giản) không hỗ trợ SegWit không cần tải xuống dữ liệu bổ sung, điều này có thể tiết kiệm dung lượng ổ cứng.
Giao dịch loại SegWit rẻ hơn so với các loại giao dịch trước đó vì nó làm giảm dữ liệu nhân chứng cần được lưu trữ. Nói chính xác, khái niệm "Kích thước" (kích thước dữ liệu) hơi khác đối với các giao dịch loại SegWit. Nó đưa ra khái niệm về “kích thước ảo”: tất cả dữ liệu được đặt trong phần chứng kiến sẽ được nhân với 0,25 để tính toán kích thước dữ liệu, nhờ đó có thể nhồi nhét nhiều giao dịch hơn vào một khối. Hãy xem một ví dụ.
Giả sử chúng ta có loại giao dịch truyền thống với kích thước dữ liệu là 200 byte. Sau đó, 5.000 giao dịch như vậy có thể được đặt trong một khối 1 MB. Một giao dịch SigWit tương đương có 120 byte được đặt trong vùng chứng kiến, do đó kích thước ảo của nó là 80 + 0,25 * 120 = 110 byte, do đó khối có thể phù hợp với 9090 giao dịch như vậy. Nếu phí xử lý trên chuỗi là 40 satoshi mỗi byte thì phí giao dịch sẽ giảm từ 8.000 satoshi xuống còn 4.400 satoshi, giảm gần một nửa. (Ghi chú của người dịch: "Satoshi" là đơn vị định lượng của Bitcoin, bằng một phần tỷ btc.)
Bạn có thể nhận thấy rằng mỗi tập lệnh Lock sẽ có 1 byte để thể hiện phiên bản của tập lệnh. Việc sử dụng các số phiên bản khác nhau cho phép bạn thêm hoặc thay đổi chức năng (thay đổi cú pháp, toán tử mới, v.v.) dưới dạng nĩa mềm.

SegWit cũng tối ưu hóa hiệu quả của các thuật toán chữ ký (như CHECKSIG, CHECKMULTISIG, v.v.). Trước SegWit, số lượng phép tính băm tỷ lệ thuận với bình phương số chữ ký, nhưng với Segregated Witness, độ phức tạp tính toán của thuật toán giảm xuống O(n) (tỷ lệ thuận với số lượng chữ ký).

Nếu hoàn toàn không có hại gì thì tại sao lại có người nghĩ là có vấn đề? Có rất nhiều người trong cộng đồng Bitcoin phản đối việc nâng cấp này bởi vì mặc dù nó có rất nhiều ưu điểm nhưng nó cũng có một số nhược điểm. Chúng ta hãy xem xét một số lập luận được đưa ra bởi phía đối lập.
Vì SegWit là một soft fork nên nhiều khách hàng có thể không được nâng cấp, do đó cả hai loại UTXO sẽ cùng tồn tại trong mạng; việc phá vỡ các thay đổi như loại bỏ việc hợp nhất ID giao dịch và tăng tuyến tính số lượng phép tính băm sẽ không có hiệu quả đối với các đầu ra không phải SegWit, do đó mạng vẫn sẽ tiếp xúc với Hợp nhất ID giao dịch Nguy cơ tăng hiệu suất và thời gian băm theo cấp số nhân.
SegWit sẽ giảm Bảo mậtSố lượng nút thực hiện xác minh đầy đủ sẽ giảm đi đáng kể, bởi vì chỉ những nút thích ứng với SegWit mới có khả năng xác minh phần chứng kiến của giao dịch.
Không thể ngừng sử dụng SegWit. Nếu nó bị bãi bỏ và tất cả các thay đổi đều bị hủy bỏ thì tất cả sản phẩm SegWit sẽ bị bỏ lại trên đường phố.
SegWit hy vọng sẽ giải quyết được tất cả các vấn đề cùng một lúc, đó là lý do tại sao nó dẫn đến nhiều thay đổi về mã. Nó làm cho công việc trong tương lai trở nên căng thẳng hơn và làm tăng nguy cơ xảy ra lỗi phần mềm.
Mặc dù có thể có những giải pháp tốt hơn cho các vấn đề được giải quyết bằng SW, nhưng chúng tôi vẫn tin rằng, tại thời điểm này, đây là cách tốt nhất để cải thiện khả năng mở rộng của mạng và cho phép triển khai các công nghệ như Lightning Network. Chúng tôi sẽ đưa ra phân tích chi tiết hơn ở bài viết tiếp theo.

Chuyên sâu về Lightning Network, phần 1: các kênh thanh toán
“Làm chủ bitcoin ” — Andreas M. Antonopoulos
Blog Bitcoin Core
Nhiều tài nguyên segwit
Bài viết hay về tính linh hoạt của txn
Liên kết gốc
Chào mừng bạn tham gia cộng đồng chính thức của BlockBeats:
Nhóm Telegram đăng ký: https://t.me/theblockbeats
Nhóm Telegram thảo luận: https://t.me/BlockBeats_App
Tài khoản Twitter chính thức: https://twitter.com/BlockBeatsAsia