P2MS là một script pattern cho phép lock nhiều public key (tức gửi BTC cho nhiều người) và chỉ yêu cầu một vài (hoặc tất cả) các signature của các public key đó để unlock. Ví dụ, chúng ta có thể tạo ra P2MS sử dụng 3 public key của 3 người khác nhau nhưng chỉ cần 2 trong số những người đó cung cấp signature là có thể sử dụng BTC.

Mặc dù P2MS là một script tiêu chuẩn, nhưng hiện tại nó thường được wrap bên trong P2SH script.

How Does P2MS Work?

P2MS có cách hoạt động khá đơn giản. Đối với locking script thì sẽ bao gồm các thành phần sau:

  1. Opcode M cho biết số signature cần phải dùng để unlock.
  2. Các public key.
  3. Opcode N cho biết số public key sử dụng.
  4. Opcode CHECKMULTISIG ở cuối script.

Minh họa:

Để unlock, ta cần cung cấp đủ số lượng signature mà lock script yêu cầu. Trong hình minh họa trên thì M là 1.

Bug

Opcode CHECKMULTISIG có một bug đó là nó pop thêm một phần tử ra khỏi stack thay vì chỉ pop duy nhất một phần tử (lỗi off-by-one). Để tránh lỗi này, chúng ta thêm một giá trị rác (OP_0) vào đầu của scriptSig.

Executing

Khi script này được thực thi, tất cả các signature và public được đẩy vào stack.

Sau đó là đến opcode CHECKMULTISIG. Opcode này thực thi như sau:

  1. Pop ra N, sau đó pop N public key ra khỏi stack.
  2. Pop ra M, sau đó pop M signature ra khỏi stack.

Sau khi pop tất cả các public key và signature ra khỏi stack, nó kiểm tra từng signature với từng public key:

  • Nếu signature không khớp với public thì di chuyển đến public key tiếp theo và kiểm tra.
  • Nếu signature khớp với public key thì ta tăng số signature hợp lệ lên 1 và kiểm tra signature tiếp theo.

Nếu số signature hợp lệ bằng N sau khi tất cả các signature đã được kiểm tra thì CHECKMULTISIG sẽ đẩy 1 vào stack và kết quả của script xem như là hợp lệ.

Minh họa:

Tương tự như P2PK script, việc sử dụng public key ở trong script khá bất tiện nên P2MS ít được sử dụng nhiều. Thay vào đó, P2SH script được sử dụng phổ biến hơn. Ngoài ra, số public key tối đa được sử dụng ở trong P2MS script là 3. Trong khi đó, số public key tối đa được sử dụng ở trong P2SH script là 15.

Resources