4.1. Lưu trữ cục bộ đơn giản
Hãy bắt đầu với cách lưu trữ bitcoin đơn giản nhất: chỉ cần đặt chúng vào một thiết bị cục bộ. Tóm lại, để tiêu một bitcoin, bạn cần biết một số thông tin công khai và một số thông tin bí mật. Thông tin công khai là những gì diễn ra trên chuỗi khối—danh tính của đồng tiền, giá trị của nó, v.v. Thông tin bí mật là khóa bí mật của chủ sở hữu bitcoin (có lẽ là bạn). Bạn không cần phải lo lắng quá nhiều về cách lưu trữ thông tin công khai, vì bạn luôn có thể truy xuất nó khi cần thiết. Nhưng khóa ký bí mật là thứ bạn nên theo dõi. Vì vậy, trên thực tế, việc lưu trữ bitcoin của bạn chính là lưu trữ và quản lý các khóa của bạn.
Khi tìm ra cách lưu trữ và quản lý khóa, cần ghi nhớ ba mục tiêu. Đầu tiên là tính khả dụng: có thể thực sự tiêu tiền của bạn khi bạn muốn. Thứ hai là bảo mật: đảm bảo rằng không ai khác có thể tiêu tiền của bạn. Nếu ai đó có quyền tiêu tiền của bạn, họ có thể gửi tiền của bạn cho chính họ, và sau đó bạn không còn tiền nữa. Mục tiêu thứ ba là sự tiện lợi: việc quản lý các khóa của bạn phải tương đối dễ dàng. Như bạn có thể tưởng tượng, đạt được cả ba mục tiêu đồng thời có thể là một thách thức.
Phương pháp quản lý khóa đơn giản nhất là lưu trữ chúng trong một tệp trên thiết bị cục bộ của riêng bạn: máy tính, điện thoại hoặc một số loại thiết bị khác mà bạn mang theo, sở hữu hoặc điều khiển. Điều này là rất tốt cho sự tiện lợi: có một ứng dụng điện thoại thông minh cho phép tiêu tiền xu chỉ bằng một vài nút nhấn là rất khó để đánh bại. Nhưng tùy chọn này không phù hợp với tính khả dụng hoặc bảo mật—nếu bạn mất thiết bị, nếu thiết bị gặp sự cố và bạn phải xóa đĩa hoặc nếu tệp của bạn bị hỏng, khóa của bạn bị mất và tiền của bạn cũng vậy. Tương tự như vậy đối với bảo mật: nếu ai đó đánh cắp hoặc đột nhập vào thiết bị của bạn hoặc lây nhiễm phần mềm độc hại vào thiết bị, cô ta có thể sao chép khóa của bạn và sau đó gửi tất cả số tiền của bạn cho chính mình.
Nói cách khác, lưu trữ khóa cá nhân của bạn trên một thiết bị cục bộ, đặc biệt là thiết bị di động, rất giống với việc mang theo tiền trong ví hoặc trong túi xách tay của bạn. Sẽ rất hữu ích nếu bạn có một số tiền để tiêu, nhưng bạn không muốn mang theo tiền tiết kiệm cả đời, bởi vì bạn có thể làm mất nó hoặc ai đó có thể lấy cắp nó. Vì vậy, những gì bạn thường làm là lưu trữ một chút thông tin—một ít tiền—trong ví của bạn và giữ hầu hết tiền của bạn ở một nơi khác.
Ví
Nếu lưu trữ bitcoin cục bộ, bạn thường sử dụng phần mềm ví, là phần mềm theo dõi số tiền của bạn, quản lý chi tiết các khóa của bạn và làm cho mọi thứ trở nên thuận tiện với giao diện người dùng đẹp. Nếu bạn muốn gửi số bitcoin trị giá 4,25 đô la đến quán cà phê địa phương của mình, phần mềm ví sẽ cung cấp cho bạn một số cách dễ dàng để thực hiện điều đó. Phần mềm Wallet đặc biệt hữu ích vì bạn thường muốn sử dụng nhiều địa chỉ khác nhau với các khóa khác nhau được liên kết với chúng. Nhớ lại rằng việc tạo cặp khóa công khai / riêng tư mới rất dễ dàng và bạn có thể sử dụng điều này để cải thiện tính ẩn danh hoặc quyền riêng tư của mình. Phần mềm Wallet cung cấp cho bạn một giao diện đơn giản cho bạn biết số tiền trong ví của bạn. Khi bạn muốn sử dụng bitcoin, nó sẽ xử lý thông tin chi tiết về khóa nào sẽ sử dụng, cách tạo địa chỉ mới, v.v.
Khóa mã hóa: Mã cơ sở 58 và mã QR
Để chi tiêu hoặc nhận bitcoin, bạn cũng cần có cách trao đổi địa chỉ với bên kia—địa chỉ mà bitcoin sẽ được gửi đến. Hai phương pháp chính được sử dụng để mã hóa địa chỉ để chúng có thể được truyền từ người nhận đến người chi tiêu: dưới dạng chuỗi văn bản hoặc dưới dạng mã QR.
Để mã hóa địa chỉ dưới dạng chuỗi văn bản, chúng ta lấy các bit của khóa và chuyển đổi chúng từ số nhị phân (binary number) thành số cơ sở 58 (base-58 number). Sau đó, chúng ta sử dụng một bộ 58 ký tự để mã hóa mỗi chữ số thành một ký tự; cái này được gọi là “ký hiệu base-58.” (base-58 notation) Tại sao lại là 58? Bởi vì đó là tổng số chữ hoa, chữ thường và chữ số có sẵn có thể được sử dụng làm ký tự (trừ một số có thể gây nhầm lẫn hoặc trông giống như một ký tự khác). Ví dụ: cả chữ cái viết hoa “O” và số 0 đều bị loại bỏ vì chúng trông quá giống nhau. Điều này cho phép đọc các địa chỉ đã mã hóa qua điện thoại hoặc đọc từ giấy in và nhập vào, nếu cần thiết. Lý tưởng nhất là có thể tránh được các phương pháp truyền thông địa chỉ thủ công như vậy thông qua các phương pháp như mã QR mà chúng ta đang thảo luận.
Phương pháp thứ hai để mã hóa địa chỉ Bitcoin là mã QR, một loại mã vạch hai chiều đơn giản (Hình 4.1). Lợi thế của mã QR là bạn có thể chụp ảnh của nó bằng điện thoại thông minh và phần mềm ví có thể tự động chuyển mã vạch thành một chuỗi các bit đại diện cho địa chỉ Bitcoin tương ứng. Điều này hữu ích trong một cửa hàng, ví dụ: hệ thống thanh toán có thể hiển thị mã QR và bạn có thể thanh toán bằng điện thoại của mình bằng cách quét mã và gửi tiền đến địa chỉ đó. Nó cũng hữu ích cho việc chuyển điện thoại sang điện thoại.
HÌNH 4.1. Mã QR đại diện cho một địa chỉ Bitcoin thực tế. Hãy gửi cho chúng tôi một số bitcoin.
Địa chỉ vô nghĩa
Một số cá nhân hoặc thương nhân muốn có một địa chỉ bắt đầu bằng một số văn bản có ý nghĩa nhân văn. Ví dụ: trang web cờ bạc Satoshi Bones yêu cầu người dùng gửi tiền đến các địa chỉ có chứa chuỗi “bones” ở các vị trí từ 2–6, chẳng hạn như 1bonesEeT-cABPjLzAb1VkFgySY6Zqu3sX (tất cả các địa chỉ thông thường đều bắt đầu bằng ký tự 1, cho biết Pay-to-PubkeyHash).
Địa chỉ là kết quả đầu ra của một hàm băm, tạo ra dữ liệu trông ngẫu nhiên, vậy làm thế nào mà chuỗi “bones” vào đó? Nếu Satoshi Bones chỉ đơn giản là tạo ra các địa chỉ này, thiếu khả năng đảo ngược các hàm băm, họ sẽ không biết các khóa riêng tương ứng và do đó sẽ không thực sự kiểm soát các địa chỉ đó. Thay vào đó, họ liên tục tạo các khóa riêng tư cho đến khi họ gặp may và tìm thấy một khóa đã băm ra mẫu này. Những địa chỉ như vậy được gọi là địa chỉ ảo và có những công cụ để tạo ra chúng.
Tăng tốc độ tạo địa chỉ vô nghĩa
Trong Bitcoin, nếu chúng ta gọi khóa riêng tư là x, khóa công khai là gx. Phép lũy thừa đại diện cho cái được gọi là “phép nhân vô hướng trong một nhóm đường cong elliptic.” Địa chỉ là H(gx), băm của khóa công khai. Chúng tôi sẽ không đi vào chi tiết ở đây, nhưng lũy thừa là bước tốn thời gian trong việc tạo địa chỉ.
Cách đơn giản để tạo địa chỉ ảo là chọn một giả ngẫu nhiên x, tính H(gx) và lặp lại nếu địa chỉ kết quả không hoạt động. Một cách tiếp cận nhanh hơn nhiều là thử x + 1 nếu x đầu tiên không thành công và tiếp tục tăng dần thay vì chọn một x mới mỗi lần. Đó là bởi vì gx+1 = g gx, và chúng ta đã tính gx, vì vậy chúng ta chỉ cần một phép toán nhân cho mỗi địa chỉ thay vì lũy thừa và điều đó nhanh hơn nhiều. Trên thực tế, nó tăng tốc độ tạo địa chỉ ảo hơn hai bậc độ lớn (order of magnitude).
Công việc này mất bao nhiêu? Vì có 58 khả năng cho mọi ký tự, nếu bạn muốn tìm một địa chỉ bắt đầu bằng một chuỗi ký tự k cụ thể, bạn sẽ cần tạo trung bình 58k địa chỉ cho đến khi bạn gặp may. Vì vậy, việc tìm kiếm một địa chỉ bắt đầu bằng “bones” sẽ đòi hỏi phải tạo ra hơn 600 triệu địa chỉ! Ngày nay việc tìm kiếm như vậy có thể được thực hiện trên một máy tính xách tay thông thường. Nhưng việc tìm kiếm trở nên khó hơn theo cấp số nhân với mỗi ký tự thêm vào trong tên mong muốn. Việc tìm tiền tố 15 ký tự sẽ yêu cầu một lượng tính toán không thể thực hiện được và (không tìm thấy một phá vỡ trong hàm băm bên dưới) là điều không thể.