Có câu lệnh chạy mãi không được, vì có cả join và where.
Hóa ra khi có join thì where phải chuyển luôn vào trong join và biến thành AND
dạng
`Join table1
On table.user_id = table1.id
AND abc (where condition)`
Lưu lại để nhớ
Có câu lệnh chạy mãi không được, vì có cả join và where.
Hóa ra khi có join thì where phải chuyển luôn vào trong join và biến thành AND
dạng
`Join table1
On table.user_id = table1.id
AND abc (where condition)`
Lưu lại để nhớ
(Truyện bịa, nhưng mà quan trọng gì, khi mà 1 câu chuyện tương tự cũng bịa nốt).
**Chín Lê** là 1 cậu bé nhà nghèo. Hàng ngày, câu đi bán đậu phộng để giúp cha mẹ. Cậu vẫn hay lê la ở trại lính của giặc để bán cho chúng. Bọn chúng có vẻ có thiện cảm với cậu vì thỉnh thoảng hay sai cậu làm mấy việc lặt vặt và cậu vui vẻ làm.
Tất nhiên, như hầu hết bạn bè của cậu, cậu hay lợi dụng lúc giặc sơ hở để tiện tay nhón lấy cái này cái kia. Mà cũng chẳng cứ là giặc, hễ ai hở ra cái gì thì cậu biến nó thành của cậu ngay. Cơ mà, cậu vẫn là người tốt, vì cổ tích nó phải vậy.
Hôm đó, cậu vào trại giặc bán đậu phộng như mọi ngày. Bọn giặc hôm đó rượu say. Cậu thấy 1 cái ví tiền vứt chỏng chơ bên cạnh bọn chúng. Cậu nhẹ nhàng nhón lấy, giấu vào người, lòng hoan hỉ vô cùng. Rồi cậu lui ra, tìm ngay 1 góc khuất trong đồn để kiểm tra thành quả. Trời hơi tối, cậu phải bật 1 que diêm lên để lấy ánh sáng. Chà, bọn lính canh kho xăng Thị Nghè này giàu quá, hôm nay tao vô mánh rồi. Ờ mà khoan đã, kho xăng, hình như có cái gì không ổn…
Cậu trở thành ngọn đuốc sống với chiến công đốt kho xăng thị nghè kinh điển.
Bà cụ sống với vợ chồng người con trai ở 1 khu tập thể dành cho giáo viên của 1 trường THPT nọ, do con dâu của bà làm việc trong trường. Sáng sáng, bà dậy sớm ra ngoài tập thể dục, như rất nhiều người già thường làm. Mà cũng lạ, ở ta chỉ có người già là chăm tập thể dục, còn người trẻ lại ít tập. Có lẽ họ đợi đến khi già.
Sáng nọ, như mọi sáng, bà dậy sớm, mở cửa bước ra ngoài. À, thực ra sáng đó không như mọi sáng. Đó là sáng ngày 20/11, là ngày nhà giáo Việt Nam. Cụ ở khu tập thể của giáo viên, tất nhiên mấy ngày nay đã cảm nhận được không khí nô nức của ngày hiến chương các nhà giáo. Sau bao đợi chờ, ngày đó cũng đến. Hôm nay hẳn là không khí ở khu tập thể này sẽ như mùng 1 tết.
Vừa đặt chân bước ra ngoài, bà đã thấy ngay không khí ngày nhà giáo. Không phải băng rôn, không phải khẩu hiệu, không phải âm thanh bài hát “khi thầy viết bảng, bụi phấn rơi rơi”. Cái “không khí ngày nhà giáo” ấy nằm trước cửa phòng bên cạnh, phòng một thầy giáo trẻ. Một gói quà. Chính xác hơn là một cái hộp điện thoại iPhone với tấm thiệp bên trên.
Liệu món quà đó có phải là dành cho con dâu bà không? Chắc hẳn bà không hề đặt ra câu hỏi này, vì câu trả lời quá hiển nhiên. Con dâu bà là nhân viên y tế của trường. Vâng, nhân viên y tế, chứ không phải giáo viên. Học sinh sẽ chỉ tặng quà cho giáo viên của chúng. Chẳng đứa nào tặng cho nhân viên y tế cả. Bà chẳng cần suy luận mới biết điều đó, mà thực tế từ năm ngoái, năm kia … từ ngày con bà làm ở trường này, đã chứng minh cho bà thấy điều đó. Bà chẳng bao giờ thấy con gái mình được nhận quà. Nhưng các thầy cô ở các phòng kế bên thì nhiều. Rất nhiều quà. Thi thoảng, có người hỏi thăm con bà rằng 20/11 vừa rồi có nhiều quà không, thì cô ấy sẽ tặc lưỡi “ôi dào, làm gì có gì. Bọn học sinh chúng chỉ chăm chăm cho thầy cô nó thôi. Đến thầy cô môn phụ cũng chẳng có, nói gì tới tôi”.
Hẳn rồi, bà không hề thắc mắc liệu đó có phải quà của con bà không. Bà biết rõ, rất rõ rằng: không. Bà cũng biết luôn món quà đó tặng ai. Tất nhiên là ông thầy phòng kế bên. Năm nào tay này chẳng nhận vô số quà. Đời bất công quá. Kẻ ăn không hết người lần không ra.
Cả khu tập thể vẫn vắng ngắt. Tất cả vẫn còn chìm trong giấc ngủ. Bà ngó trước, ngó sau. Không có ai. Cái hộp iPhone nằm im lìm nhưng đầy cám dỗ. Lát nữa tay thầy sẽ nhận vô số quà. Món quà trước cửa này nó vẫn chưa biết. Nó sẽ không kêu la, báo mất vì nó không hề biết mình có để mà mất. Với lại, mất 1 món có nhằm nhò gì, vì lát nữa nó sẽ nhận được vô số món khác.
Còn con bà, đây sẽ là lần đầu tiên nó có quà 20/11.
Lấy của người giàu chia cho người nghèo là chính nghĩa. Là thay trời hành đạo.
Bà kín đáo qua sát thêm 1 lần nữa. Vẫn không có ai. Bà liền nhẹ nhàng đưa tay cầm món quà lên, rón rén đi vào trong phòng. Lòng rộn rã, bà mở hộp chiếc iPhone. Bà sẽ lần đầu tận hưởng cảm giác “Trên tay iPhone x” (x<=6) như trên diễn đàn tinhte.vn bọn chúng vẫn làm.
Phần tiếp theo, xin đọc tại đây: http://tuoitre.vn/tin/chinh-tri-xa-hoi/20141121/dieu-tra-vu-qua-phat-no-o-khu-tap-the-giao-vien-trong-ngay-2011/674637.html
Thông tin thêm:
“Được biết, do có con dâu làm ở phòng y tế trường THPT Đoàn Kết nên bà Lan cùng gia đình chuyển về khu tập thể được 1,5 năm.”
Sau khi vụ việc xảy ra, anh Thường ghép những mảnh giấy màu xanh dương đậm quanh hiện trường lại thì ước chừng gói quà chỉ nhỏ bằng chiếc hộp đựng điện thoại.”Ngoài ra tôi còn thấy một miếng bìa nhỏ hình chữ U, mảnh giấy cứng có logo của hãng Apple
http://www.giadinhonline.vn/tu-vong-vi-goi-qua-phat-no-trong-ngay-2011-d33686.html
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.
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.
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.
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:


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.
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.
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.
Một giao dịch chuyển Bitcoin thường có các bước sau:
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).
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
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õ 🙂