Các lượt nộp
    Danh sách bài
    Trang chủ
    Báo lỗi

    solution

    Đề bài: [An toàn thông tin] Tìm nonce cho bằng chứng công việc (Proof of Work)

    Trong các hệ thống blockchain kiểu Bitcoin, thợ đào phải giải một bài toán bằng chứng công việc (Proof of Work): tìm một giá trị nonce sao cho giá trị băm SHA-256 của (thông điệp nối với nonce) có ít nhất kkk bit 0 liên tiếp ở đầu (tính từ bit có trọng số cao nhất — MSB — của toàn bộ chuỗi 256 bit).

    Cho thông điệp message (chuỗi) và độ khó kkk (0≤k≤160 \le k \le 160≤k≤16). Bắt đầu thử nonce = 0, 1, 2, \ldots, với mỗi giá trị tính: H(nonce)=SHA256(message ∥ str(nonce))H(\text{nonce}) = \text{SHA256}\big(message \,\Vert\, \text{str}(\text{nonce})\big)H(nonce)=SHA256(message∥str(nonce)) (trong đó str(nonce) là biểu diễn thập phân thông thường của nonce, ví dụ nonce = 7 → chuỗi "7"; nối chuỗi trực tiếp, không thêm ký tự phân cách).

    Tìm nonce nhỏ nhất sao cho H(nonce)H(\text{nonce})H(nonce), khi biểu diễn dưới dạng 256 bit nhị phân (byte đầu tiên là các bit có trọng số cao nhất), có ít nhất kkk bit 0 liên tiếp kể từ vị trí đầu tiên.

    Ví dụ: message = "hello", k=0k = 0k=0 → mọi giá trị hash đều thỏa (có ít nhất 0 bit 0 ở đầu), do đó nonce nhỏ nhất là 000.

    • Định dạng đầu vào:
      • Dòng 1: chuỗi message (có thể rỗng).
      • Dòng 2: số nguyên kkk (0≤k≤160 \le k \le 160≤k≤16).
    • Định dạng đầu ra:

      In ra hai dòng:

      • Dòng 1: số nguyên nonce nhỏ nhất tìm được.
      • Dòng 2: giá trị băm SHA-256 tương ứng, dạng hex 64 ký tự thường.

    Ví dụ:

    Đầu vào:

    hello
    0
    

    Đầu ra:

    0
    5a936ee19a0cf3c70d8cb0006111b7a52f45ec01703e0af8cdc8c6d81ac5850c
    

    Đầu vào:

    block1
    1
    

    Đầu ra:

    1
    3762446e14a8df6d59ad91aa5887b65c09ceeb0ff0206cb84e0ac9f6a43ef13e
    

    Đang tải editor...