Author: thangnm

  • Louis Litt

    Dear Harvey and Jessica,

    There come a time when a man must look at himself in the mirror, to judge himself instead of waiting to be judged by others. For me, that time is now. You both know that I came to Pearlson Specter right out of law school but you may not know is this is the only place I have worked, the only place that I have wanted to work. It’s my life. It’s my home. And people works here are my family. You’re like my parents. And partners, they are my brothers and associates under my care are my children. Now it’s shame to admit it, but I put all of you to jeopardy for my own personal gain. I told myself it’s for a greater good but the truth is I only wanted to feel on the same level of both of you like. I can deny that no longer. I can excuse my action no longer.

    Although we have differences over the long years, there’s no other 2 people I respect more. Your names are on the wall for a reason. And mine is not for a reason. And I refuse to put either of you through the pain of having to fire me. So effective immediately, I, Louis Litt, am resigning from Pearson Specter.

    Please take care of my home.

  • Xe đạp

    Mình là đứa lười tập thể dục, lười chơi thể thao. Thế cho nên sức khỏe thường có vấn đề.

    Trước đây cầu lông là lựa chọn ưu tiên của mình. Vì môn này dễ chơi, mình cũng từng chơi 1 thời gian dài. Nhưng chơi cầu lông phụ thuộc rất nhiều yếu tố: có sân trống hay không, có người chơi cùng hay không… Lúc mình muốn chơi thì bạn bè không muốn, và ngược lại.

    Nói chung, một môn thể thao đơn độc sẽ thích hợp hơn :).

    Đi bộ là 1 lựa chọn tốt. Nhưng đi bộ thì … nhàn quá. Và rất mất thời gian. 1 tiếng đồng hồ đi được khoảng hơn 2km. Vì thế, mình nghĩ nó chỉ thích hợp cho thể dục dưỡng sinh chứ không phải là thể thao.

    Chạy bộ thì quá sức với mình. Hồi cấp 2 có chạy được 1 tuần rồi thôi. Cấp 3 chạy cùng anh Đạt được 3 buổi gì đó, cũng được 2km. Mỗi lần chạy 1 đoạn tương đối thì mình buồn ói kinh khủng. Nói chung, môn này quá sức, he he.

    Rồi mình tình cờ đến với xe đạp, phương tiện đi lại này hóa ra lại là 1 môn thể thao khá hay. Giống đi bộ và chạy bộ, nó không đòi hỏi người chơi cùng, không cần phải book sân… Và nó là phân khúc giữa của 2 môn trên: nặng hơn đi bộ nhưng nhẹ hơn chạy bộ. Vì trọng lượng cơ thể đè lên xe chứ không phải lên đôi chân, nên không bị mất sức. Và vì tốc độ có thể đẩy lên nhanh, nên cường độ vận động của cơ thể cũng không kém chạy bộ. Chạy thì không thể lâu, nhưng đi xe đạp thì có thể đạp vài tiếng liên tục là thường.

    Mình bắt đầu với 1 chiếc xe đạp dạng City bike. Xe này có rất nhiều ưu điểm cho nhu cầu đi lại trong thành phố, nhưng với nhu cầu thể dục thể thao thì nó hơi thiếu 1 chút. Hàng ngày mình đạp khoảng 15km, cũng tương đối đủ cho nhu cầu thể dục (thể dục thôi, chứ thể thao thì chưa).

    Hi vọng sau này rảnh + lên chân, cuối tuần mình sẽ đạp 40 – 50 km (cả đi + về) để vừa thể dục thể thao, vừa “du lịch gần nhà” để xả stress.

  • Writting

    Các sản phẩm đẹp, thẩm mĩ luôn khiến chúng ta yêu thích, và gợi nên nhiều cảm hứng khi sử dụng, vd iPhone, iPad…
    Không may, trong nghề của mình không có nhiều đất cho design, cho cái đẹp. Nhưng…
    Có rất nhiều đoạn văn khiến mình xúc động. Và mình chợt nghĩ, viết những câu văn hay, chuyên nghiệp, mang tính thuyết phục cao cũng là cách nâng tính thẩm mỹ của Thư quản lý, thư chào hàng, email trao đổi với khách hàng…
    Có lẽ thời gian tới mình cần trau dồi kỹ năng viết.

  • Hùng Vương

    Theo sử sách, đất nước Việt Nam có 4000 năm văn hiến. Bây giờ là năm 2014 sau công nguyên. Như vậy, nước Việt phải tồn tại từ năm 2000 trước công nguyên.

    Có tổng cộng 18 đời vua Hùng, sau đó truyền ngôi đến An Dương Vương. Mà An Dương Vương chết vào khoảng năm 208 trước công nguyên.

    Như vậy, 18 đời vua Hùng + An Dương Vương đã trị vì nước Việt trong 1800 năm. Trung bình 1 ông làm vua 100 năm. Đây là điều không tưởng, vì trong giai đoạn về sau này khi sử Việt đã rõ ràng, ghi chép cẩn thận hơn thì 1 ông vua trị vì được 30 năm là nhiều lắm rồi. Nhiều ông chỉ được vài tháng.

    Xem mấy cái bia này mới nực cười:

    Hung Viet Vuong
    Hung Chieu Vuong

    Toàn mấy ông sống vài trăm tuổi, he he.

    Có thể thấy, “4000 năm văn hiến” là bốc phét. Chưa kể, nhiều bằng chứng cho thấy đất nước của Hùng Vương lúc đó thực chất là 1 phần của Trung Quốc chứ không phải nước Việt ngày nay.

  • Trà

    Người miền Bắc bọn mình thường hay uống trà, như miền Nam uống cà phê.

    Dân gian vốn lưu truyền câu nói nổi tiếng “Chè (trà) Thái, gái Tuyên”, ý nói trà Thái Nguyên là ngon nhất, còn gái Tuyên Quang là đẹp nhất (nghe đâu nhiều hoa hậu, á hậu VN có gốc Tuyên Quang).

    Trà Thái Nguyên thì nổi tiếng nhất là trà Tân Cương, là vùng thung lũng thuộc tỉnh Thái Nguyên. Mình đã từng uống trà Bảo Lộc nhưng quả không thích bằng trà Thái Nguyên.

    Trà ngon thì đầu tiên nước phải có màu vàng nhạt, vàng tươi (mà dân gian hay gọi là “xanh nước”). Thứ hai là phải có mùi thơm đặc trưng (không phải là mùi của mấy ly trà đá hay thậm chí trà nóng của mấy quán cơm, phở…). Thứ ba là uống xong phải thấy vị ngọt dịu đọng trong cổ họng. Đây là yếu tố quan trọng nhất. Nhiều khi uống xong 1 tách trà mà cổ cứ ngòn ngọt cả tiếng đồng hồ. Vị ngọt này rất dịu, dễ chịu và khiến ta sảng khoái.

    Trà cần phải uống nóng. Trà đá thực ra chỉ là nước đá, cho thêm hương liệu trà. Điều đặc biệt là trà đá có mùi rất mạnh, và mùi thơm của mỗi quán lại khác nhau, nhưng không hề có vị trà. Nếu bạn lấy 1 ly trà bạn tự pha, rồi cho đá vào, thì để vị trà biến mất như ngoài quán thì mùi cũng biến mất từ lâu, không thể có mùi nồng như ngoài quán được. Vì thế, trà đá của quán hầu như chắc chắn là hương liệu. Có thể thấy điều này khi uống trà đá vỉa hè Hà Nội. Đó là những ly trà bình thường, được cho thêm đá. Uống trà đá HN sẽ thấy luôn vị chát của trà, nhưng nói thật là cảm giác tệ hơn rất nhiều so với trà đá Sài Gòn, và nó không thơm kiểu thơm của trà đá Sài Gòn. Đơn giản là trà cần được uống nóng. Và trà đá Sài Gòn có thể uống với đá vì nó không phải là trà. Nhưng nó vẫn có chỗ đứng riêng, và trà đá Sài Gòn uống cũng không thấy khó chịu. Ngược lại, trà đá Hà Nội thì quả là một thảm họa.

    Trước đây tôi uống trà Tân Cương Hoàng Bình. Một thời gian đổi qua trà ô long Cầu Tre. Ưu điểm trà ô long Cầu Tre là sấy nguyên 1 nhánh trà thành 1 cục tròn, nên khi pha trà chỉ cần vài “cục” như thế là có 1 ly trà. Một điểm nữa là màu nước rất tươi, nhiều khi để qua ngày hôm sau màu vẫn tươi. Và để cà tuần không bị thiu. Điều này khiến tôi tự hỏi không biết liệu họ có dùng hóa chất để bảo quản không (lưu ý là tôi không có ý ám chỉ gì ở đây, mà chỉ thắc mắc liệu có hay không, có thể là không).

    Gần đây tình cờ đi 1 siêu thị nhỏ tôi thấy có bán trà Thái Nguyên của Phúc Long. Trước đây tôi chỉ uống càe của Phúc Long chứ chưa uống trà của họ. Mua về uống thử thì chất lượng rất ổn.

    Cuối năm vừa rồi nhân dịp ra công tác ngoài HN, tôi được đồng nghiệp mua giúp trà Tân Cương. Trà này rất thơm (mùi trà, không phải thơm mùi hoa sen, hoa nhài…), vị ngon, màu đẹp. Đây là loại trà tôi hài lòng nhất. Có lẽ tôi sẽ dùng luôn trà này.

  • Bitcoin – Bài 3: Xác nhận giao dịch và “đào mỏ”

    Chắc hẳn mọi người nghe nhiều về việc “đào mỏ” (mining) Bitcoin. Người ta thường nói đây là quá trình “giải 1 bài toán”. Thực chất quá trình này là gì? Tại sao nó lại cần thiết (chẳng lẽ chỉ để cung cấp thêm bitcoin)? Và nó được thực hiện như thế nào?

    Nói một cách ngắn gọn, quá trình đào mỏ (hay “giải 1 bài toán” như cách báo chí mô tả) chỉ là quá trình tìm nghiệm của một bất phương trình. Tôi dùng từ “tìm nghiệm” chứ không phải “giải” bất phương trình vì bất phương trình này không có cách giải, mà bắt buộc phải “mò” nghiệm bằng cách thử lần lượt các giá trị 1, 2, 3…. (theo hệ thập lục phân) đến khi nào có số thỏa mãn được bất phương trình thì thôi.

    Trước tiên, hãy nói về cách xử lý giao dịch Bitcoin.

    Như đã trình bày ở phần trước, các máy tính trong mạng dễ dàng xác định được 1 giao dịch có phải là giả mạo hay không. Nhưng vẫn còn đó rủi ro rằng chủ tài khoản có thể tiêu một đồng tiền của anh ta nhiều lần. Vì thế, cần một cơ chế để ngăn chặn rủi ro này.

    Khi bạn sở hữu 1 tài khoản bitcoin, bạn sẽ thấy hiện lên thông báo bạn đang có bao nhiêu đồng. Có thể bạn nghĩ, đây là hệ thống phi tập trung nên số dư phải được lưu ngay trong chính máy mình, trên 1 file nào đó. Và vì lưu trên máy mình, mình có thể mở nó ra, sửa lại số dư (ví dụ: thay 1 bằng 1,000), thế là tài khoản của mình tự tăng lên 999 đồng.

    Thực ra, Bitcoin không có 1 file lưu giữ số dư tài khoản của bạn, mà chỉ lưu các giao dịch. Và phần mềm tự động tính ra: ngày 1 bạn tạo tài khoản (mặc định không có đồng nào), ngày 2 nhận được 3 đông (+3), ngày 5 bạn chuyển 1 đồng (-1). Vậy hôm nay bạn đang có 3-1 = 2 đồng. Phần mềm không lưu trữ số 2 này, mà chỉ lưu trữ giao dịch nhận 3 đồng và tiêu 1 đồng kia. Và 2 giao dịch này được xác thực tính hợp lệ (như đã nói ở bài trước). Nếu bạn tự tạo 1 giao dịch giả mạo để thêm 900 đồng, hệ thống sẽ phát hiện và loại bỏ, giao dịch không được xác nhận và không được ghi vào sổ cái.

    Vậy hệ thống xác nhận bằng cách nào? Trước tiên, đó phải là giao dịch từ 1 tài khoản do chính chủ tài khoản đó thực hiện, chuyển tới tài khoản khác (như đã nói ở bài trước). Hệ thống sẽ  tính lại số tiền hiện tại mà chủ tài khoản đang có (bằng cách cộng trừ các khoản thu chi từ trước đến giờ), xem họ có đủ tiền để chuyển không. Nếu có, thì mới xử lý bước tiếp theo. Nếu xử lý xong, nó sẽ được cập nhật vào sổ cái hệ thống (lưu tại mọi máy tính người dùng) và sổ cái mới này (đã thêm giao dịch mới) sẽ dùng để kiểm tra giao dịch tiếp theo (bạn còn nhớ ví dụ 3-1=2 bên trên chứ?)

    Bây giờ, nếu anh A đang có 3 đồng. Anh A chuyển cho anh B 2 đồng (giao dịch 1), giao dịch này sẽ được đưa vào xử lý. Trong khi nó chưa xử lý xong, anh A thực hiện việc chuyển cho anh C 2 đồng (giao dịch 2). Vì giao dịch 1 chưa được xác nhận, chưa được cập nhật vào sổ cái, nên hệ thống vẫn cho phép phát sinh giao dịch số 2 này và đưa vào xử lý bình thường. Như vậy, nếu máy tính ở Singapore nhận được giao dịch 1 trước, họ sẽ cập nhật giao dịch 1 vào sổ cái, hủy bỏ giao dịch số 2. Máy tính ở Mỹ nhận được giao dịch số 2 trước, họ sẽ cập nhật giao dịch số 2 vào sổ cái, hủy bỏ giao dịch số 1. Như vậy sẽ rất hỗn loạn, vì mỗi máy tính có 1 bản sổ cái khác nhau, và ghi nhận giao dịch hợp lệ khác nhau. Để tránh điều này, hệ thống cần được thiết kế sao cho các giao dịch được sắp xếp theo 1 trình tự thống nhất, đối với tất cả các máy tính.

    Cách giải quyết như sau: các giao dịch mới phát sinh sẽ được gom lại với 1 số lượng nhất định (giả sử 100 giao dịch) gọi là block. Máy tính sẽ tính ra 1 con số tương ứng với block này (tạm gọi là hash 1 nhé). Và nó sẽ tìm nghiệm a của bất phương trình f(hash 1, hash previous, a) < target với target là 1 số cho trước. Như đã nói ở phần đầu bài, bất phương trình này không giải được mà phải mò nghiệm bằng cách thử lần lượt từng số cho đến khi tìm ra số a thích hợp. Máy nào tìm ra được a thì sẽ được thưởng 25 bitcoin, và toàn bộ giao dịch trong block đó được đánh dấu là đã xác nhận. Nó sẽ báo kết quả a và nội dung các giao dịch trong block để các máy khác biết. Việc tìm a rất lâu nhưng việc kiểm tra lại rất nhanh. Ví dụ, bảo các bạn giải phương trình [latex]x^5 + 3x – 5 = 252,597 [/latex] thì có lẽ phải mất chút thời gian, chứ nếu bảo bạn kiểm tra xem x=12 có phải là nghiệm của phương trình trên không, thì các bạn chỉ cần thay vào Excel 2 giây là xong. Nếu máy tính được lập trình để kiểm tra thì chỉ cần 1 phần triệu giây. Với các phương trình phức tạp hơn thì việc tìm nghiệm mất thời gian hơn, nhưng việc kiểm tra 1 giá trị có phải là nghiệm không cũng chỉ mất 1 phần triệu giây. Sau khi xác định số a thỏa mãn bất phương trình, các máy tính này sẽ cập nhật vào phiên bản sổ cái mà mình đang lưu trữ. Nếu nó cũng đang giải 1 block có chứa một số giao dịch nằm trong block mới được giải, nó sẽ loại các giao dịch này và chọn các giao dịch khác thay thế vào block đó và tiếp tục giải. Và nó sẽ thông báo với các máy tiếp theo cho đến khi toàn mạng được cập nhật. Bất phương trình trên được thiết kế trên nguyên tắc ngẫu nhiên sao cho khả năng có 2 máy tính tìm ra đáp số tại cùng 1 thời điểm là rất thấp.

    Nhưng giả sử có trường hợp A và B gần như cùng lúc giải được block của mình. A sẽ thông báo cho các máy kế tiếp để thêm block của mình vào sổ cái và tìm nghiệm của block kế tiếp. B cũng làm tương tự. Tuy nhiên nếu A tìm ra trước thì số người dựa vào kết quả của A để tính ra block tiếp theo sẽ nhiều hơn của B. Sau vài block, hệ thống sẽ so sánh 2 nhánh A và B, bên nào dài hơn thì chấp nhận bên đó, còn các giao dịch bên nhánh kia sẽ bị loại bỏ, phải đưa về trạng thái unconfirm để xử lý từ đầu. Đây là lý do vì sao người ta thường khuyên phải đợi ít nhất confirm sau 6 block (tương đương khoảng 1 tiếng) thì mới chắc ăn.

    Như vậy, quá trình mining thực chất là để sắp xếp các block theo 1 trình tự nhất định theo hướng ưu tiên block nào tìm ra nghiệm trước. Khi đã xếp theo thứ tự, các block khác không thể chen ngang mà phải nối tiếp, do đó các giao dịch đã được xử lý không thể bị sửa đổi (nếu không toàn bộ chuỗi block sẽ không hợp lệ). Để quyết định ai được xếp trước, thì các máy phải tham gia vào 1 cuộc đua “mò nghiệm” như đã nói ở trên để xem ai giành được quyền ghi vào ledger. Và để tưởng thưởng cho công sức đã bỏ ra để xử lý bài toán này (qua đó xác thực và đảm bảo an toàn cho giao dịch), người giải được bài toán sẽ được thưởng 1 số bitcoin nhất định. Ban đầu là 50. Hiện tại là 25, và tương lai sẽ giảm xuống 1 nửa cho đến khi nào hết 21 triệu bitcoin. Vì quá trình này giống như đào mỏ khai thác vàng truyền thống (dùng máy tính tạo thêm bitcoin) nên nó được gọi là Mining – đào mỏ. Và đây cũng là cơ chế phát hành thêm tiền của Bitcoin. Không cần bất cứ ngân hàng trung ương nào. Cũng không phải là người phát minh ra bitcoin hay tổ chức nào có quyền phát hành thêm bitcoin. Mà chính người dùng, nếu giải được bài toán, sẽ được thêm bitcoin cho mình (và toàn hệ thống có thêm 25 bitcoin, coi như là đã phát hành thêm tiền). Đây là sáng tạo tuyệt vời của Satoshi.

    Độ khó của bài toán sẽ được tăng lên bằng cách thuật toán sẽ tự động điều chỉnh số target. Nếu năng lực tính toán của máy tính tăng gấp đôi, số target sẽ tự động điều chỉnh giảm còn 1 nửa để bù lại, đảm bảo thời gian xử lý mỗi giao dịch mất khoảng 10 phút. Như thế, không lo tiến bộ công nghệ trong việc phát triển chip CPU hoặc GPU có thể khiến Bitcoin bị “đào” ồ ạt.

  • Bitcoin – Bài 2: Chống giao dịch giả mạo

    Một giao dịch chuyển Bitcoin thường có các bước sau:

    1. Người chuyển ra lệnh chuyển tiền -> giao dịch phát sinh. Giao dịch này được ký điện tử bởi chủ tài khoản.
    2. Mạng máy tính sẽ xác thực giao dịch này, nếu đúng là chủ tài khoản ra lệnh, và người đó còn đủ Bitcoin để chuyển, thì giao dịch đó là hợp lệ và sẽ được đưa vào xử lý. (xử lý thế nào mình sẽ trình bày chi tiết sau).
    3. Xử lý thành công: giao dịch được chuyển sang trạng thái đã xác nhận. Máy thực hiện việc xử lý này sẽ được thưởng 25 bitcoin (tại thời điểm này, trước đây là 50). Vì vậy quá trình này còn được gọi là đào mỏ (mining), vì “tự dưng” được thêm 25 bitcoin.
    4. Chương trình tự cập nhật các giao dịch đã xác nhận, và thông báo cho chủ tài khoản biết là đã nhận bao nhiêu bitcoin, số dư mới là bao nhiêu. Người chuyển bị trừ tiền. Người nhận được cộng tiền.

    Với từng bước ở trên, thuật toán được thiết kế để đảm bảo loại trừ các rủi ro gian lận, cụ thể:
    Có những rủi ro như: giao dịch giả mạo, không phải từ tài khoản của mình (Bill Laden ra lệnh chuyển 1000 Bitcoin từ tài khoản Bill Gate tới tài khoản Al Queda). Giao dịch khống (không có tiền nhưng vẫn ra lệnh chuyển, hoặc tạo ra 1 giao dịch hợp lệ nhưng sử dụng nhiều lần), tự ghi tăng tài khoản của mình (hoặc 1 ai đó…)

    Với 1 hệ thống tập trung, thì ngân hàng sẽ tạo cho chúng ta 1 tài khoản gồm username và password. Ai biết được 2 thông tin này (và có thể cả token nữa) thì sẽ thực hiện được giao dịch. Đó là giải pháp để đảm bảo chỉ có chủ tài khoản mới chuyển được tiền. Tuy nhiên, với 1 hệ thống phi tập trung như Bitcoin, sẽ không có ai đứng ra làm trung tâm để xác thực giao dịch, hơn nữa cũng không cần đăng ký thông tin cá nhân để có được tài khoản, không có máy chủ lưu trữ username/password của từng người, mà thông tin của ai sẽ được lưu trên máy người đó, thì giải quyết vấn đề này như thế nào?

    Ký điện tử – giải pháp chống giả mạo

    Chữ ký điện tử không phải là bản scan chữ ký tay rồi chèn vào file Word như nhiều người lầm tưởng. Ký điện tử phải đảm bảo những tính chất giống như ký thật: ngoài người chủ tài khoản, không ai có thể ký được và, khi đã ký rồi thì người khác có thể kiểm tra được dễ dàng tính hợp lệ của chữ ký đó.

    Giải pháp phổ biến nhất hiện này là dùng mã khóa bất đối xứng. Và Bitcoin cũng sử dụng công nghệ này. Khi tạo 1 tài khoản Bitcoin, máy tính sẽ tạo ra 2 khóa tương ứng cho 1 tài khoản: 1 khóa bí mật (private key) và 1 khóa công khai (public key). Khóa bí mật thì bạn phải giữ gìn như password của mình vậy (có thể coi nó là 1 dạng password). Khóa công khai thì sẽ được đính kèm với thông điệp gửi đến người nhận.

    Nếu anh A chuyển tiền cho anh B, anh A sẽ tạo 1 thông điệp

    Chuyển từ: Số tài khoản của A

    Chuyển tới: Số tài khoản của B

    Số tiền: 1000 Bitcoin

    Và dùng khóa bí mật của mình mã hóa thông điệp đó thành 1 đoạn mã và gửi cả thông điệp gốc (chưa mã hóa) + đoạn mã mới tạo ra + khóa công khai tới người nhận (là toàn bộ người tham gia mạng Bitcoin).

    Như vậy, nội dung người nhận nhận được sẽ gồm 3 phần: (1) thông điệp gốc, (2) đoạn mã tương ứng với thông điệp gốc, (3) khóa công khai.

    Người nhận (hay chính xác hơn là phần mềm của người nhận) sau khi nhận được nội dung trên sẽ tách nó thành 3 phần riêng biệt như trên, sau đó dùng khóa công khai (phần số 3) để kiểm tra xem đoạn mã (phần số 2) có phải là do “người anh em” khóa bí mật của mình tạo ra từ thông điệp gốc (phần số 1) hay không.

    Biết được khóa công khai sẽ không biết được khóa bí mật, nhưng có thể kiểm tra được “sản phẩm” của khóa bí mật bằng cách kiểm tra đầu vào (thông điệp) và đầu ra (đoạn mã).

    Chỉ có người giữ khóa bí mật (chủ tài khoản) mới có thể ký thông điệp (tạo ra đoạn mã).

    Nếu thông điệp bị sửa đổi, thì đoạn mã sẽ không còn tương ứng với thông điệp nữa, và khóa công khai sẽ giúp phát hiện ra điều này, và giao dịch được xem là không hợp lệ. Như vậy, khóa công khai sẽ đảm bảo tính toàn vẹn và nguyên gốc của dữ liệu, đồng thời đảm bảo đúng là người sở hữu khóa bí mật tương ứng gửi đi.

    Nhưng nếu 1 anh C muốn giả mạo anh A, tạo 1 thông điệp y như trên để chuyển tiền từ tài khoản của anh A tới anh B (hoặc của mình). Anh C dùng chính khóa bí mật của mình để ký tên, gửi kèm khóa công khai của mình tới những máy khác trong mạng. Các máy thực hiện việc kiểm tra, nhưng vì dùng khóa công khai của anh C để kiểm tra một thông điệp do chính anh C mã hóa (bằng khóa bí mật của C), nên kết quả kiểm tra là đúng luôn. Như vậy giao dịch giả mạo của anh C được xem là hợp lệ. Bitcoin loại trừ khả năng này bằng cách khi tạo số tài khoản cho 1 người thì lấy luôn 1 phần của khóa công khai của người đó làm số tài khoản. Như vậy, nếu anh C gửi khóa công khai của mình kèm với thông điệp giả mạo tài khoản anh A thì bản thân khóa công khai này và số tài khoản của anh A không khớp nhau, vì thế việc giả mạo sẽ dễ dàng bị phát hiện.

    Trên đây là sơ lược về nguyên lý hoạt động của chữ ký điện tử sử dụng phương pháp mã hóa bất đối xứng. Mình sẽ trình bày chi tiết về mã hóa bất đối xứng bên dưới.

    Vì máy tính chỉ xử lý được 0 và 1, nên tất cả các dữ liệu đều được đưa về dạng nhị phân. Ví dụ chữ a được chuyển thành 01100001. Vì thế, toàn bộ dữ liệu, dù là chữ, đều quy về số để tính toán. Vì thế các công thực toán học bên dưới mặc dù là sử dụng cho số nguyên, nhưng dữ liệu dạng chữ (như thông điệp trong giao dịch nêu trên) đều có thể xử lý bằng các hàm toán học này. (Và, nếu các bạn thắc mắc, đoạn bên dưới sử dụng số liệu trong hệ thập phân cho dễ hiểu, nhưng khi chạy trên máy tính cũng sẽ bị đưa hết về nhị phân)

    (cảnh báo: bạn nên đứng dậy pha 1 ly café trước khi đọc phần dưới đây, vì nó có thể gây buồn ngủ :D).

    1. Chọn 2 số nguyên tố bất kỳ p và q. Hai số này càng lớn thì độ an toàn càng cao.
    2. Tính tích số n = p . q
    3. Tính φ(n) là số các số có 2 đặc tính: (i)nhỏ hơn n và (ii)nguyên tố cùng nhau với n (hay gọi cách khác: số cần tìm và n có ước số chung lớn nhất là 1). Ví dụ: số 9 có các số 1, 2, 4, 5, 7, 8 (tổng cộng 6 số) là nguyên tố cùng nhau với nó, vì thế φ(n) = 6.
    4. Công thức tính: với p là số nguyên tố thì [latex]φ(p^k) = p^{k-1}.(p-1)[/latex] . Ở ví dụ trên, [latex]φ(9) = φ(3^2) = 3^{2-1}.(3-1) = 3 . 2 = 6.[/latex]
    5. Vì n là hợp số (= p.q) nên φ(n) = φ(p)φ(q) = (p − 1)(q − 1). Công thức này gọi là Hàm số Ơ le (Euler).
    6. Chọn một số tự nhiên e sao cho 1 < e < φ(n) và e nguyên tố cùng nhau với φ(n)
    7. Tìm số d bất kỳ sao cho d . e chia cho φ(n) dư 1.

    Khóa công khai là cặp số n và e.

    Khóa bí mật là cặp số n và d.

    Hàm mã hóa (dùng để kiểm tra chữ ký) là
    [latex] c = m^e (Mod  n)[/latex]
    Hàm giải mã (dùng để ký) là
    [latex] m = c^d (Mod  n)[/latex]

    Ký thông điệp và kiểm tra

    • Chọn p = 3 và q = 11
    • Tính n = p * q = 3 * 11 = 33
    • Tính φ(n) = (p – 1) * (q – 1) = 2 * 10 = 20
    • Chọn e sao cho 1 < e < φ(n) và e nguyên tố cùng nhau với 20. Chọn e = 7
    • Tính giá trị cho d sao cho  (d * e) % φ(n) = 1. Lấy d = 3 [(3 * 7) % 20 = 1]
    • Khóa công khai (e, n) => (7, 33)
    • Khóa bí mật (d, n) => (3, 33)

    Giả sử thông điệp của chúng ta là 15. (số này phải nhỏ hơn n. Vì thế nên chọn p, q lớn để đảm bảo an toàn và mã hóa được mọi thông điệp).

    Đoạn mã mà ta sẽ dùng để ký thông điệp sẽ là số dư của phép chia [latex]15^3[/latex] cho 33 = 9.

    Ta sẽ gửi đến người nhận bộ 3 số (15, 9, (7, 33)) – tương ứng với (thông điệp, giá trị mã hóa, khóa công khai). (người nhận không hề biết đến con số 3 là số nằm trong giá trị khóa bí mật (3,33). Và từ dữ liệu nhận được, người nhận không thể tính toán ngược lại để ra kết quả bằng 3. Tất nhiên người nhận có thể mò nghiệm, nhưng với số d đủ lớn, thì việc mò ra khóa bí mật là bất khả thi.

    Người nhận sẽ lấy tính số dư của phép chia [latex]9^7[/latex] chia 33. Nếu kết quả này bằng với giá trị thông điệp (15) thì chứng tỏ thông điệp này đã được ký hợp lệ và không bị sửa đổi. Nếu kết quả khác thì văn bản này được xem là không hợp lệ. Kết quả phép tính trên đúng bằng 15.

    Thực ra bên trên là phương pháp ký sử dụng thuật toán RSA. Bitcoin thì dùng thuật toán Elliptic Curve Digital Signature Algorithm (ECDSA), về cơ bản thì cách hoạt động là như nhau, chỉ khác nhau công thức toán. Mình thấy công thức của RSA dễ hiểu hơn nên lấy làm ví dụ minh họa. Về mặt an toàn thì 2 thuật toán này đều rất an toàn và đang được sử dụng rộng rãi.

    Như vậy vấn đề chống giao dịch giả mạo đã được giải quyết. Nhưng nếu anh A chỉ có 10 bitcoin, anh ta tạo 1 giao dịch hợp lệ chuyển hết số tiền này cho anh B. Liệu anh ta có thể copy lại giao dịch đó (hoàn toàn hợp lệ vì kiểm tra bằng khóa công khai sẽ thấy khớp) để chuyển cho anh B 5 lần (= 50 Bitcoin, vượt quá số tiền anh A có)? Bitcoin giải quyết vấn đề này (double spending) như thế nào? Xin xem tiếp hồi sau sẽ rõ 🙂

  • Bitcoin – Bài 1: Những điều báo chí viết sai về Bitcoin

    Gần đây báo chí nói khá nhiều về bitcoin nhưng không đi vào chi tiết, khiến thông tin về Bitcoin thì có vẻ nhiều mà chẳng ai hiểu nó là cái gì. Đó cũng là động lực khiến mình viết (loạt) bài này.

    Trước khi đi vào chi tiết kỹ thuật, mình mô tả qua về Bitcoin và những điều lầm tưởng về nó.

    Bitcoin là tiền ảo với những đặc tính độc đáo. Trước tiên, nó là 1 hệ thống mạng ngang hàng, không có máy chủ. Mọi người đều có vai trò như nhau (nhưng máy có cấu hình mạnh hơn sẽ xử lý được nhiều hơn, sẽ nói ở phần sau). Bitcoin miner không phải là máy chủ. Nếu không có Bitcoin miner, hệ thống vẫn hoạt động bình thường vì chính chúng ta sẽ đóng vai trò miner. Tiền không được lưu trữ ở server (vì chẳng có server) mà lưu ở ngay máy tính cá nhân hoặc điện thoại của chúng ta.

    Vì là mạng ngang hàng, không có máy chủ, nên nó không thể bị đánh sập, bị cấm cửa (về mặt kỹ thuật)….

    Bitcoin không do 1 chính phủ hay công ty nào phát hành hoặc kiểm soát. Phát hành tiền và vận hành hệ thống là việc của tất cả những người tham gia, kể cả người dùng bình thường như bạn và tôi, tuân theo 1 thuật toán hết sức chặt chẽ. Tiền không thể phát hành tùy tiện (sẽ nói ở phần sau), và giao dịch được kiểm tra rất kỹ trước khi được chấp nhận (tất cả các máy trong mạng cùng góp sức để xác thực giao dịch).

    Nhiều bài báo nói việc Bitcoin không được 1 chính phủ đứng ra phát hành là 1 nhược điểm của Bitcoin. Đây là quan điểm hết sức sai lầm. Theo họ, được chính phủ đứng ra “đảm bảo” thì sẽ an toàn hơn. Trong lý thuyết tài chính, nếu công cụ tài chính do 1 chính phủ phát hành thì có thể coi đó là công cụ không có rủi ro (risk free). Thực tế thì ngược lại. Tôi không tin sự đảm bảo của chính phủ Việt Nam đối với tiền đồng. Tôi thích dự trữ vàng và USD hơn VND, vì tôi mất niềm tin với cung cách điều hành tiền tệ của ngân hàng nhà nước rồi. Nếu bạn là dân Zimbabwe chắc bạn cũng không thích thú gì khi cầm đồng tiền bản xứ được chính phủ “đảm bảo” đó, khi mỗi sáng thức dậy nó lại giảm giá trị đi vài lần. Bitcoin sẽ không bị rơi vào tình trạng đó, vì nó mang tính chất của vàng (hoặc của tiền bản vị vàng) nhiều hơn của tiền (tiền pháp định).

    Bitcoin không bị chính phủ kiểm soát không có nghĩa là nó không bị kiểm soát. Vấn đề là kiểm soát ở góc độ nào. Về góc độ minh bạch, chống gian lận, đảm bảo an toàn cho người dùng, thì giao dịch Bitcoin bị kiểm soát vô cùng ngặt nghèo bởi tất cả mọi người tham gia. Bất cứ 1 giao dịch nào không hợp lệ sẽ bị phát hiện và từ chối lập tức. Và bạn không cần phải tin bất cứ ai, mà chính máy tính của bạn sẽ thực hiện kiểm tra tính hợp lệ của giao dịch (sẽ trình bày ở bài sau nốt). Với giao dịch ngân hàng, bạn phải đặt niềm tin vào ngân hàng rằng “đời nào ngân hàng họ trừ tiền đối tác mà không chuyển cho mình”. Với Bitcoin, chương trình trên máy tính của bạn sẽ tự kiểm tra xem giao dịch có hợp lệ không, vì thế bạn không phải đặt niềm tin ở người khác mà chỉ tin chính mình thôi. Ngược lại, kiểm soát ở góc độ khống chế cung tiền để cho mục đích của 1 nhóm người (hay chính phủ) thì không thể thực hiện với Bitcoin. Nói chung, cái gì cần kiểm soát để an toàn và có lợi cho người dùng thì Bitcoin kiểm soát vô cùng chặt, còn kiểm soát có thể có hại cho người dùng thì Bitcoin không làm.

    Một hiểu lầm nữa là giao dịch Bitcoin diễn ra bí mật. Trong khi nhiều bài báo nói toàn bộ giao dịch được lưu trong 1 file (gọi là ledger) và mỗi máy tính đều tải về 1 bản (và vì thế công khai) thì họ lại nói giao dịch Bitcoin có tính ẩn danh, không tiết lộ thông tin người dùng, giống như tiền mặt. Nghe có vẻ mâu thuẫn. Thực tế, giao dịch Bitcoin hoàn toàn minh bạch, không thể giấu giếm và dễ dàng để truy vết luồng tiền. Cái bí mật chính là danh tính người dùng. Tài khoản Bitcoin không cần bạn khai báo bất cứ thông tin gì (không cần email, password, username, cmnd…). Vì vậy người ta có thể dễ dàng biết được tiền được chuyển từ tài khoản 001 đến tài khoản 050 nhưng không thể biết được ai sở hữu những tài khoản đó (và không biết ai chuyển tiền cho ai, về việc gì).

    “TS Võ Trí Thành, Phó Viện trưởng Viện Nghiên cứu kinh tế Trung ương (CIEM) cho rằng, giá trị của đồng tiền chính là lòng tin, được đảm bảo bởi một ngân hàng Trung ương, một thể chế chính trị, một nền kinh tế nào đó”

    Vâng, giá trị của 1 đồng tiền chính là lòng tin. Nhưng thay vì tin vào ngân hàng trung ương, thể chế chính trị… là những nơi tôi không chắc chắn có đáng tin hay không, thì tôi tin vào 1 thuật toán minh bạch và có thể kiểm chứng.

    VTV có 1 phóng sự về Bitcoin, trong đó có nói:

    Bitcoin là sản phẩm của 1 nhóm người còn chưa xác định được danh tính. Nó không được điều hành bởi bất kỳ 1 chính phủ hay 1 ngân hàng nào.

    Vụ “không được điều hành bởi bất kỳ 1 chính phủ hay ngân hàng nào” là 1 lợi thế chứ không phải nhược điểm của Bitcoin, như tôi nói ở trên. Còn đề cập đến việc tác giả của nó (có nick Satoshi Nakamoto) vẫn còn chưa xác định được danh tính có lẽ VTV muốn ám chỉ Bitcoin có thể chưa đựng điều gì mờ ám, hay không an toàn vì bị Satoshi kiểm soát/giật dây.

    Nếu các bạn đã xem phim The Social Network hẳn biết anh em nhà Winklevosses, là người có ý tưởng về mạng xã hội mà sau đó Mark Zuckerberg “chôm ý tưởng” để phát triển thành Facebook. Anh em này đã đầu tư khoảng 1 triệu USD vào Bitcoin từ khi nó chỉ có giá 9 USD (bây giờ là hơn 900 USD, tăng 100 lần). Khi được hỏi về việc Bitcoin được tạo ra bởi Satoshi, 1 nhân vật còn bí ẩn (đúng những gì VTV muốn đề cập), họ trả lời:

    “We don’t need to know him because it’s based on … trust in cryptography, not trust in individual.”

    Tạm dịch: Bọn tao cóc cần biết nó là ai, vì Bitcoin dựa trên niềm tin vào mật mã học chứ không phải dựa trên niềm tin vào 1 người cụ thể.

    Quả thực, vai trò hiện giờ của Satoshi (và các core developer khác) cũng không khác gì những người dùng bình thường khác. Vì thế, không cần phải lo về Satoshi hoặc bất cứ tổ chức nào (vì chẳng có tổ chức nào đứng sau Bitcoin cả).

    Kỳ tiếp theo mình sẽ nói về cách thức vận hành, xác thực giao dịch, bảo mật, đào mỏ … của Bitcoin.

  • Things I want to do on weekends

    1. Cafe sáng và ăn sáng tại Văn Thánh
    2. Chơi cầu lông
    3. Học Guitar
    4. Lập trình web
    5. Đọc sách tại đồng cỏ xanh mướt
    6. Đi bơi
  • Lỗi AS/2

    Không chạy được folio. Giải pháp: Properties/Comparability/Chon Windows XP. Áp dụng cho cả Folio và AS/2

    Không gõ được tiếng Việt bằng Unikey trên file Word/excel mở bằng AS/2. Giải pháp: chạy Unikey theo chế độ Run as administrator.