Khi kết thúc vòng, server sử dụng file xml lưu thông tin về các timestamp đã được cấp trong vòng để xây dựng cây merkle với mỗi timestamp là một node lá. Chính vì thực thi theo vòng nên phải tính toán khoảng thời gian phù hợp cho một vòng. Nếu thời gian của vòng quá ngắn thì số lượng node của cây sẽ ít và có thể còn không có node nào cả. Ngược lại nếu vòng quá lâu thì số lượng node sẽ quá nhiều, quá trình dựng cây và duyệt cây sẽ tốn tài nguyên, đường dẫn xác thực xây dựng sẽ dài. Chính vì những lý do trên nên thông thường ta chọn thời gian của một vòng là một tuần lễ.
Cây xây dựng được (tham khảo chương 1) dùng để tạo file chứng thực mới. Mỗi một lá của cây sẽ khởi tạo một file và được gửi đến người dùng thông qua email. Phần đầu file này là ProofRecord chứa thông tin bao gồm: hàm băm, id, giá trị băm, timestamp.
Hình 20 Proof record
Phần tiếp theo là Evidentiary Path, phần này chứa đường dẫn để xác thực timestamp. Đường dẫn này được xây dựng dựa trên cây merkle.
33
Hình 21 Cây Merkle và đƣờng dẫn xác thực
Như hình trên, đường dẫn xác thực cùa node n0 là tập {Auth0, Auth1, Auth2} và
Evidentiary Path có dạng như sau: <EvidentiaryPath> <Link> <DigestValue>Auth0</DigestValue> <Position>Right</Position> </Link> <Link> <DigestValue>Auth1</DigestValue> <Position>Right</Position> </Link> <Link> <DigestValue>Auth2</DigestValue> <Position>Right</Position> </Link> </EvidentiaryPath>
Phần cuối cùng là witness record chứa giá trị băm của vòng, chính là node gốc của cây merkle trong vòng, và các thông tin khác về công bố giá trị này: số thứ tự của
34
vòng, ngày được công bố. Server cùng lưu các thông tin về vòng tại server để phục vụ cho quá trình xác thực.
Hình 22 Witness Record
Bây giờ tôi sẽ trình bày quá trình thực thi khi người dùng sử dụng file này để xác thực:
- Client băm file cần xác thực, đem giá trị băm nhận được so sánh với các
thông tin trong trường proofRecord. Nếu trùng khớp thì quá trình tiếp tục.
- Sử dụng tất cả giá trị trong trường proofRecord kết hợp với giá trị băm của
file ban đầu tạo ra giá trị băm đầu tiên. Sử dụng EvidentiaryParth để tính giá trị băm cuối cùng, nếu đường dẫn có vị trí là “right” thì kết hợp như sau “giá trị băm đưa vào” || “giá trị băm của đường dẫn”. Ngược lại nếu đường dẫn có vị trí là “left” thì kết hợp như sau “giá trị băm của đường dẫn” ||”giá trị băm đưa vào”. Băm giá trị nhận được sau khi kết hợp và sử dụng nó cho đường dẫn tiếp theo. Lặp lại quá trình này cho đến khi hết đường dẫn ta nhận được giá trị băm cuối cùng.
- So sánh giá trị băm cuối cùng với WitnessRecord, nếu trùng khớp thì gửi
thông tin về vòng và giá trị băm này lên server để kiểm chứng. Nếu server xác nhận giá trị vòng là hợp lệ thì qua trình xác thực kết thúc.