cho em hỏi câu filters[specName] && filters[specName].length mục đích là để kiểm tra cái gì ? Tại sao điều kiện không phải chỉ là :filters[specName].length mà lại còn thêm cả filters[specName] vào nữa ạ.
Tất cả các câu hỏi của bạn nảy sinh vì bạn vẫn đang tư duy hệ thống theo kiểu client-server và chưa hình dung ra cách hoạt động của mạng ngang hàng P2P. Mô hình mạng ngang hàng không chỉ khác về giao thức sử dụng udp thay vì tcp, mà còn bởi cách nó vận hành. Đó là không hề có server trung gian lưu trữ dữ liệu. Hãy lấy ví dụ đơn giản về mạng BitTorrent chia sẻ phim lậu. Một đĩa Bluray tầm 120GB sẽ được 1 người ra cửa hàng mua về, người A đó đưa vào máy tính và bật BitTorrent lên. BitTorrent là 1 Phần Mềm chứ k phải 1 Server, sẽ bắt đầu chia sẻ đường link trực tiếp từ thư mục của người A. và người A đưa link cho người B, file sẽ được copy sang ổ của người B. Nhưng để copy đc từ A sang B, người B cũng phải cài phần mềm BitTorrent (hoặc phần mềm Torrent tương tự). Phần mềm BitTorrent sẽ có tính năng kết nối và theo dõi. Giờ thì người C tham gia BitTorrent. Thấy link phim 120GB, người đó sẽ kích tải về. Lúc này phần mềm BitTorrent sẽ nhìn thấy trong mạng đang có 2 thư mục có thể down về. Và nó sẽ down từ cả 2 thư mục, cắt đoạn đầu down từ máy A, đoạn đuôi down từ máy B. Như thế thì như kiểu sẽ download song song và giảm đc thời gian tải, tiết kiệm được băng thông. Nếu có 1000 người cùng lưu trữ một file và cùng online, thì lúc này mạng Torrent đó sẽ rất nhanh. Nhưng nếu chỉ 2 người, mà người A tắt máy đi ngủ, thì đường truyền lúc này chỉ còn mỗi từ thư mục của B. Nếu B cũng tắt máy nốt, thì đường link đó mới chính thức chết. Do đó mạng ngang hàng, thì càng đông càng mạnh, gần như không bao giờ chết.
Bây giờ mình sẽ lần lượt trả lời các câu hỏi của bạn:
sau 1 thời gian mảng đó sẽ rất rất lớn, như thế có ổn ko?
Chính xác thì bây giờ mảng Blockchain của BitCoin là bao nhiêu GB bạn có biết không? đến thời điểm hiện tại là 161GB. https://blockchain.info/charts/blocks-size Điều này nghĩa là máy bạn muốn bắt đầu đào BitCoin thì bạn phải có 161GB trống trở lên. Đấy là máy đào, còn máy người dùng muốn giao dịch, thì bạn chả cần gì cả. Bạn chỉ cần đặt lệnh giao dịch và đưa vào mảng Giao dịch đang đợi Hash là xong, người khác sẽ đào Hash cho bạn, bạn không tự lôi 161GB về rồi tính toán Hash nên k cần.
...lưu địa chỉ của mỗi block thì có vẻ hợp lý hơn
Không có server trung gian để lưu trữ Blockchain đâu bạn, lúc nào ở máy thợ mỏ trong mạng cũng có sẵn 161GB data copy toàn bộ Blockchain. Nhưng không phải toàn bộ 161GB data này được gửi đi gửi lại trong mạng, mà chỉ có các Block cuối được thêm vào mới được gửi đi. Do đó data gửi rất nhanh. Cái bạn cần là một đường truyền mạng cực kỳ ổn định, vì nếu bạn Hash xong 1 block và mạng chập chờn k gửi được thì xin chia buồn với bạn. Tốc độ mạng cũng không cần quá nhanh, vì data chỉ là text. Gửi nhận chỉ vài MB.
Do đó theo tôi sự ổn định của mạng internet mới là cái bạn nên quan tâm thay vì lo đến dung lượng hoặc tốc độ.
1 thời điểm có cả triệu người check thông tin thì hệ thống sẽ giải quyết bài toán performance như thế nào?
Vẫn câu hỏi cũ. Không hề có server trung gian để đọc ghi DB, mà máy bạn lúc nào cũng có sẵn 161GB data để bạn thích query thế nào thì query. Toàn bộ data của toàn bộ người dùng đã nằm sẵn trong cục 161GB đó rồi. Nếu bạn chỉ là người kiểm tra ví tiền qua web server (ví dụ trang e-wallet, trang trading nào đó) thì rõ ràng trang web đó sẽ là nơi chứa 161GB data và query cho bạn. Họ cũng chỉ query trong 1 cục Data của họ, 1 tỉ request cũng chỉ như facebook là cùng. Cái này không có gì quá khó khăn cho một web service, vì chỉ cần máy chủ đủ mạnh sẽ đáp ứng được lượt request/giây tương ứng.
Chúng ta cần tự xây dựng một trung tâm xử lý cùng với các API, nền tảng cho phép mining?
Lại một lần nữa bạn hỏi sai. Không hề có trung tâm API, vì bạn vẫn tư duy theo kiểu server api. Nền tảng cho phép mining của bạn sẽ phải Open Source toàn bộ. Nghĩa là file Example.html của tôi phải đưa về máy người dùng. Phần mềm BitTorrent cũng là 1 phần mềm chạy trên máy người dùng và không hề có server trung gian.
sau một thời gian thì ông A thay đổi địa chỉ về Bắc Ninh chẳng hạn thì việc update thông tin này như thế nào?
Blockchain không thể chỉnh sửa, vì nó đã nối lại với nhau bằng Hash, Bắt buộc phải thêm mới block vào để SỬA thông tin của ông A. Và đã thêm vào tức là các máy khác bắt buộc phải download Block mới về. Và việc sửa bất kỳ cái gì đều làm cho mọi người biết. Cái hay của cơ sở dữ liệu Blockchain ở chỗ nó chỉ cho thêm, k cho xóa và sửa, dẫn đến nó có tính Minh Bạch. Và lịch sử của 1 con người, 1 món hàng hoặc 1 thành phần gì đó đã tham gia vào Blockchain là không thể bị mất đi, vì có rất nhiều bản ghi đã được copy sang các máy khác.
@Minh2018
Mình xin phép được trả lời các thắc mắc của bạn, theo cách hoạt động của blockchain Bitcoin nhé, những blockchain khác có thể sẽ có cách giải quyết khác
Việc lưu thông tin của tất cả các block vào 1 mảng như ví dụ trên MANGBLOCK[]==> phát sinh là sau 1 thời gian mảng đó sẽ rất rất lớn, như thế có ổn ko ? Theo mình nghĩ thì nó chỉ lưu địa chỉ của mỗi block thì có vẻ hợp lý hơn
Câu này có vẻ bạn hỏi về cách xây dựng blockchain của bạn @chungminhtu, xin để bạn @chungminhtu giải thích vậy
Việc kiểm tra thông tin của mỗi địa chỉ ví(ví dụ kiểm tra số tiền trong ví) thì cần duyệt qua toàn bộ block, nếu sau một thời gian nào đó có cả tỷ block thì công việc duyệt như vậy có khả thì hay ko ? có cách nào tối ưu hơn trong việc tìm kiếm này ko ?
Để kiểm tra số tiền của một địa chỉ Bitcoin, ta chỉ cần tính tổng của lượng Unspent Transaction Output ứng với public key của địa chỉ ví đó là được, không cần phải duyệt qua toàn bộ block làm gì. Các node đều có lưu thông tin về các Unspent Transaction Output này.
Với giao dịch Bitcoin thì Output của một transaction này sẽ được sử dụng làm Input của một transaction khác, thế nên từ các Unspent Transaction Output, bạn cứ truy ngược lại là ra được hết các transaction của một địa chỉ.
Blockchain Ethereum có một cách tiếp cận khác, họ có các trường lưu trạng thái của từng account, thế nên account nào có bao nhiêu ether chỉ cần check state của account cái là ra ngay.
chưa kể đến tại 1 thời điểm có cả triệu người check thông tin thì hệ thống sẽ giải quyết bài toán performance như thế nào ?
Tất cả các full node đều lưu trữ dữ liệu về blockchain bitcoin, hay nói cách khác, nếu cùng một lúc có 1 triệu request thì đó cũng là request trên cả chục nghìn full node bitcoin đang vận hành, chứ không phải tất cả đều gửi đến một server trung tâm nào cả. Nếu bạn muốn làm một service liên quan đến blockchain bitcoin, ethereum ... thì hãy dựng một full node cho mình, sync hết dữ liệu blockchain về, và bạn có thể request đến full node đó của riêng mình, không phải chung đụng với ai, dữ liệu trả về sẽ giống hệt khi dùng dịch vụ khác thôi.
Nếu ra xây dựng 1 coin mới mà không xây dựng trên nền tảng có sẵn(ETHEREUM, EOS,...) thì việc xác nhận giao dịch chúng ta cần tự xây dựng một trung tâm xử lý cùng với các API, nền tảng cho phép mining? Nếu như đồng coin đó ko hấp dẫn với mấy ông mining thì đồng coin đó sẽ ko còn tính phân tán ==> đồng coin thất bại ?
Câu hỏi này mình không hiểu lắm? Nếu bạn muốn xây dựng một coin là decentralized giống bitcoin hay ethereum, thì nó hoàn toàn không cần đến cái gọi là trung tâm xử lý gì cả, bởi không ai có thể kiểm soát chúng, bất kỳ ai cũng có thể mining, bất kỳ ai cũng có thể verify block, bất kỳ ai cũng có thể verify transaction. Đó mới là cái hay của bitcoin, so với hệ thống chuyển tiền truyền thống.
Theo định nghĩa của blockchain là dữ liệu lịch sử ko thể thay đổi(hoặc cực khó thay đổi) ==> nếu ứng dụng vào thực tế ví dụ dùng quản lý và xác minh nguồn gốc sản phầm như ông A cung cấp rau sạch ở Hà Nội, ông B cung cấp gạo sạch, sau một thời gian thì ông A thay đổi địa chỉ về Bắc Ninh chẳng hạn thì việc update thông tin này như thế nào ? Theo mình đang nghĩ thì có lẽ phần nào cần áp dụng blockchain thì sẽ áp dụng blockchain, phần nào quản lý theo truyền thống thì vẫn làm theo kiểu truyền thống, kết hợp hài hòa sẽ cho ra một ứng dụng mà vẫn có thể gọi là ứng dụng công nghệ blockchain ?
Có vẻ bạn đang hiểu nhầm, cái không thể thay đổi được là nội dung của transaction đã được confirm trong block. Chẳng hạn có một giao dịch chuyển 1 bitcoin từ ông A sang ông B, và giao dịch đó được confirm trong block, sau đó có các block khác được tạo ra sau block đó, thì gần như không thể thay đổi được nội dung giao dịch kia (bạn không thể sửa từ 1 thành 2, sửa ông B thành ông C ...). Thực tế vẫn có khả năng blockchain bị tấn công đảo ngược giao dịch (51% attact, bạn xem thêm ở https://viblo.asia/p/bitcoin-the-hype-the-myth-and-the-truth-part-2-Az45bbAQ5xY), tức biến một giao dịch từ confirm thành chưa confirm, nhưng điều đó là rất khó, đặc biệt là với một mạng lưới có sức mạnh tính toán khủng khiếp như bitcoin hiện nay.
Còn trên blockchain Ethereum thì bạn có thể lưu được dữ liệu (state) nên bạn hoàn toàn có thể kích hoạt các hàm trong smart contract để thực hiện việc thay đổi dữ liệu của các account (như tên là A sửa thành tên là B), tuy nhiên cần phải phân biệt rõ, "dữ liệu" được nói đến ở đây là dữ liệu của một account (address) trong blockchain Ethereum, chứ không phải nội dung transactions (thứ được nhét vào trong block, và sẽ gần như là không thể thay đổi được).
Nhưng cũng đúng như bạn nói ở phần sau, hiện cũng có rất nhiều service blockchain, từ game đến app, họ không hoàn toàn vận hành chỉ bằng blockchain (xử lý on-chain), mà họ cũng có cả các xử lý logic off-chain (không dùng blockchain) nữa
Cảm ơn các bạn @thangtd90 và @chungminhtu đã giải thích tận tình và rất chi tiết.
Có một vấn đề nữa mình cũng mong muốn được giải đáp từ các bạn đó là:
Việc lưu thông tin của tất cả các block vào 1 mảng như ví dụ trên MANGBLOCK[]==> phát sinh là sau 1 thời gian mảng đó sẽ rất rất lớn, như thế có ổn ko ? Theo mình nghĩ thì nó chỉ lưu địa chỉ của mỗi block thì có vẻ hợp lý hơn
Việc kiểm tra thông tin của mỗi địa chỉ ví(ví dụ kiểm tra số tiền trong ví) thì cần duyệt qua toàn bộ block(theo ví dụ trên), nếu sau một thời gian nào đó có cả tỷ block thì công việc duyệt như vậy có khả thì hay ko ? có cách nào tối ưu hơn trong việc tìm kiếm này ko ? chưa kể đến tại 1 thời điểm có cả triệu người check thông tin thì hệ thống sẽ giải quyết bài toán performance như thế nào ?
Nếu ra xây dựng 1 coin mới mà không xây dựng trên nền tảng có sẵn(ETHEREUM, EOS,...) thì việc xác nhận giao dịch chúng ta cần tự xây dựng một trung tâm xử lý cùng với các API, nền tảng cho phép mining? Nếu như đồng coin đó ko hấp dẫn với mấy ông mining thì đồng coin đó sẽ ko còn tính phân tán ==> đồng coin thất bại ? Ví dụ đồng Ripple(XRP) cho phép chuyển tiền ứng dụng công nghệ blockchain, nó ko hề được đào => như thế họ tự xây dựng trung tâm xử lý ? tính phân tán dữ liệu có còn đúng ?
Theo định nghĩa của blockchain là dữ liệu lịch sử ko thể thay đổi(hoặc cực khó thay đổi) ==> nếu ứng dụng vào thực tế ví dụ dùng quản lý và xác minh nguồn gốc sản phầm như ông A cung cấp rau sạch ở Hà Nội, ông B cung cấp gạo sạch, sau một thời gian thì ông A thay đổi địa chỉ về Bắc Ninh chẳng hạn thì việc update thông tin này như thế nào ? Theo mình đang nghĩ thì có lẽ phần nào cần áp dụng blockchain thì sẽ áp dụng blockchain, phần nào quản lý theo truyền thống thì vẫn làm theo kiểu truyền thống, kết hợp hài hòa sẽ cho ra một ứng dụng mà vẫn có thể gọi là ứng dụng công nghệ blockchain ?
Mình khi decode trên python thì gặp chuỗi này :
20180126/\x83\x8a\x83/\x81[\x83X\x83f\x81[\x83^\x8d\xb7\x82\xb5\x91\xd6\x82\xa6\x8a\xd6\x98A\x8e\x91\x97\xbf/
có thể chỉ cho mình nó là của loại nào ko?
mỗi giao dịch được xác nhận thì mất tối đa 10 phút?
Mỗi giao dịch xác nhận mất 10 phút thì không đúng, vì mỗi Block nối thành công mất 10 phút mới đúng. Và một Block thường chứa nhiều giao dịch trong đó. Nên mỗi giao dịch thường chỉ mất vài giây hoặc vài phút.
Bạn hiểu sai chỗ này. Blockchain của mỗi thợ mỏ là có độ dài khác nhau. Nếu mọi người đang đào 1 block mà có 1 thợ mỏ đã đào xong 2 block (Giá trị TimeStamp sẽ được dùng để xác nhận ai nhanh tay hơn). Khi có 1 block được commit vào mạng, ngay lập tức những người còn lại phải bỏ dở công việc (vứt đi toàn bộ Hash đã đào) và lấy cái mới nhất (đã có sẵn 2 Block) và đào tiếp. Nếu cố tình đào cho Block của mình dài hơn thì phải bắt buộc có 3 block. Ở đây đơn thuần là sự cạnh tranh gay gắt về sức mạnh tính toán máy tính. Và tỉ lệ thất bại của BitCoin là khá cao đấy nhé, tiếng anh gọi là "Luck Factor"
Ai là người tìm ra hash cho block tiếp theo nhanh nhất thì người đó chiến thắng với phần thưởng lớn nhất ?
Thời gian để Hash xong 1 Block trung bình là 10 phút. Nhưng không phải Hash xong là ta được thưởng luôn 12,5BitCoin đâu bạn. Vì trong lúc bạn Hash cũng có khoảng 300 người nữa cùng mạng cũng đang Hash cho Block đó. Tỉ lệ bạn đánh thắng được 300 người kia là rất nhỏ, bạn sẽ phải lấy Block người ta đã tạo ra đó, và Hash Block tiếp theo, vứt đi cái mã Hash bạn khổ công bỏ ra 10 phút để đào. Do đó trong mạng thường có 1 tỉ lệ Hash rate để tính được trung bình bạn kiếm đc bao nhiêu $ một giờ.
Với người chiến thắng sẽ nhận hết phần thưởng hay hệ thống sẽ phân chia theo công sức của mỗi thành viên tham gia?
Mỗi một Block Hash thành công và được chấp nhận bởi các thành viên trong mạng, sẽ được thưởng 12,5BitCoin. Bạn có thể xem link vừa nãy để thấy giá trị "Block Reward". Giá trị 12,5BTC này sẽ được đưa vào 1 "Ví tiền ảo" và chỉ có 1 địa chỉ duy nhất thôi. Ai là người sở hữu nó thì lấy dc. Ví này của 1 hay nhiều người thì không ai biết được. Thường chỉ 1 người sở hữu 1 ví. Và cả 1 trang trại đào thì thường cũng chỉ 1 ví tiền mà thôi. Chia ra nhiều ví sẽ mất nhiều phí giao dịch. Chả tội gì.
tính 10 phút là cho ông có tốc độ nào?
Câu hỏi rất chuẩn. Chỗ này là chỗ bị hiểu nhầm nhiều nhất. 10 phút là tính trung bình cho cả Pool (hay Node) hiện tại. Tức là tổng sức mạnh tính toán của tất cả những máy tham gia vào khu vực (Node) hiện tại. Cái này thì rất khủng khiếp. Lên đến hàng tỉ Hash mỗi giây. Máy bạn cùi bắp thì xin thưa, bạn cần khoảng vài trăm năm để ra đc 1 Hash nhé. Như máy tôi có card GTX 1050 cũng chỉ có tốc độ khoảng 3000Hash/s. Bạn có thể xem qua link này https://blockchain.info/charts/hash-rate
cứ 10 phút hệ thống lại khởi động cho cuộc đua ai là người nhanh nhất?
Hệ thống mà bạn nói ở đây chính là các Node, các Pool. Khi thợ mỏ commit Block mới lên hoặc lấy Trans mới về để đào Hash thì đều connect vào đây, ở đây như là một điểm trung gian. Và nó cũng là điểm mà được phép tăng giảm độ khó. Mỗi Block lấy về sẽ có sẵn một cái giá trị Diffyculty (https://blockchain.info/block/0000000000000000002cb3f87709e719ed0f9d44ce8d5c45effec21d1f6ceb59) để căn cứ vào cho thợ mỏ đào. Bạn có thể hình dung là biến "this.DoKho" của mỗi Block là thay đổi tương ứng với mỗi lần lấy file example.html về.
Em nhớ trước đây tạo controller mặc định thì sẽ là restful controller, không dùng các method này thì thêm option --plain gì đó.
Còn bây giờ ngược lại, mặc định controller trống, muốn tạo restful controller thì phải thêm option --resource.
Em không nhớ từ phiên bản nào mà có sự thay đổi này nhưng có lẽ bây giờ nếu anh muốn kết hợp sử dụng với Route::resource() thì phải dùng thêm option --resource mới phải.
Dĩ nhiên thì hiệu năng sẽ là bài toán cho người lập trình. Tuy nhiên vì sử dụng mạng ngang hàng. Thì cơ chế của một đồng tiền Ảo phải có một điểm trung gian để các máy client connect đến. Mỗi một quốc gia sẽ có một nút mạng như thế, ta có thể hiểu là 1 "Node". Và ở đó có hệ thống máy chủ lớn chứa các giao dịch và tính toán các giá trị cần thiết (như bạn yêu cầu). Do đó người dùng gần như k cần quá quan tâm đến liệu máy mình đủ mạnh để join vào mạng blockchain hay k. Thực tế thì điện thoại hoặc thiết bị IoT (tivi, tủ lạnh...) cũng có thể truy cập được blockchain như bình thường.
Mình xin phép được giải đáp các thắc mắc của bạn nhé
a. như vậy thì mỗi giao dịch được xác nhận thì mất tối đa 10 phút ?
Thời gian 1 block được tạo ra là không cố định, thời gian 10 phút / 1 block của Bitcoin chỉ là thời gian trung bình mà thôi, tức là đôi khi có 2 block cách nhau 2, 3 phút, và đôi khi cũng có 2 block cách nhau 15, 20 phút.
Thế nên rất khó để xác định thời gian tối thiểu hay thời gian tối đa để 1 giao dịch được xác nhận.
Hiện tại, một giao dịch được xác định nhanh hay chậm còn tuỳ thuộc vào phí mà giao dịch đó trả cho thợ mỏ nữa, phí thấp thì xác định có mà chờ cả ngày bạn ạ (^^;)
b. Ứng với mỗi block đó thì nhét tất cả các transaction đang đợi giao dịch ? Nếu đúng thì xảy ra một vấn đề là có block chỉ vài transaction, nhưng cũng có block chứa tới cả 100 ngàn giao dịch ? Kích thước của mỗi block có ảnh hưởng gì đến blockchain hay ko ?
Mỗi giao dịch có chứa thông tin, do đó nó có dung lượng. Mỗi block có giới hạn về kích cỡ, như bitcoin là 1MB (hiện nay là 4MB block weight sau khi đã kích hoạt segwit), thế nên số lượng giao dịch có thể chứa trong 1 block sẽ bị giới hạn. Thợ mỏ có thể nhét bao nhiêu giao dịch vào block cũng được, miễn là nó không vượt qua giới hạn đã được cả mạng lưới đồng thuận.
a. Tại một thời điểm có cả nghìn hệ thống khác nhau join vào mạng và cuộc chạy đua xem ai là người tìm ra hash cho block tiếp theo nhanh nhất thì người đó chiến thắng với phần thưởng lớn nhất ? (ở trên bạn có nói ai tìm được hash dài nhất thì chiến thắng nhưng cái chữ dài nhất ở đây hiểu như thế nào ?).
Có rất nhiều thuật toán PoW khác nhau, nhưng nhìn chung tất cả đều hoạt động như bạn nói ở trên: Tranh nhau giải một bài toán. Ai giải được trước thì người đó có tất cả phần thưởng, những người khác sẽ không được gì. Ở bitcoin thì bài toán PoW là dùng thuật toán SHA256 để mã hoá thông tin block để ra một kết quả, nếu kết quả này nhỏ hơn một target (mà cả hệ thống đều biết và đồng thuận từ trước), thì block đó được coi là hợp lệ. Bạn có thể tìm hiểu thêm về Bitcoin Block cũng như Bitcoin PoW ở video này: https://viblo.asia/p/bitcoin-the-hype-the-myth-and-the-truth-part-2-Az45bbAQ5xY
b. Với người chiến thắng sẽ nhận hết phần thưởng hay hệ thống sẽ phân chia theo công sức của mỗi thành viên tham gia ?
Ai tìm được ra lời giải cho bài toán PoW sẽ nhận được hết, những người khác sẽ không được gì.
Tuy nhiên, hiện nay việc giải bài toán PoW ngày càng trở nên khó khăn và dường như bạn sẽ không thể giải được nếu chỉ tự "đào" một mình. Do đó các mining pool ra đời. Hiểu đơn giản là nhiều thợ mỏ sẽ "lập thành một hội" với nhau, và có thể chia đều thành quả cho các thành viên tham gia tuỳ theo sức mạnh cống hiến.
c. Như thuật toán ở trên có nói tăng độ khó sao cho cứ 10 phút mới sinh ra 1 block, cái này mình cũng chưa hiểu rõ là tính 10 phút là cho ông có tốc độ nào ? và cứ 10 phút hệ thống lại khởi động cho cuộc đua ai là người nhanh nhất ?
Như mình đã nói ở trên, 10 phút là tốc độ trung bình. Cả mạng lưới sẽ tiến hành điều chỉnh độ khó của bài toán PoW sau mỗi 2016 blocks (~ 2 tuần). Độ khó ở đây chính là giá trị target ở trên, thợ mỏ cần tìm ra một số ngẫu nhiên, để khi hash nó cùng với các thông tin trong block được một số nhỏ hơn target này (target càng nhỏ thì càng phải thử nhiều lần để tìm ra đáp án). Giả sự hiện tại mạng lưới có độ khó là T. Thấy đào bitcoin có lợi nhuận lớn, nhiều thợ mỏ mới tham gia mạng lưới, dẫn đến sức mạnh tính toán của mạng lưới tăng -> thời gian đào được block nhanh -> thời gian trung bình nhỏ hơn 10 phút -> sau 2016 blocks, mạng lưới sẽ tính toán lại, để làm tăng độ khó lên (giảm target xuống) -> thời gian đào được block lại chậm đi -> thời gian trung bình được duy trì trong khoảng 10 phút.
Ngược lại, thời gian trung bình mà lớn hơn 10 phút (do nhiều thợ mỏ bỏ đi) -> ở lần điều chỉnh tới, độ khó sẽ được điều chỉnh giảm đi.
Sau khi tìm được một block, tất cả lại bắt tay vào giải bài toán mới: bài toán PoW cho block tiếp theo!
THẢO LUẬN
anh có thể cho em hỏi, trong file js, đoạn sự kiện khi mình tích vào ô checkbox ấy, có câu lệnh kiểm tra thế này:
cho em hỏi câu
filters[specName] && filters[specName].lengthmục đích là để kiểm tra cái gì ? Tại sao điều kiện không phải chỉ là :filters[specName].lengthmà lại còn thêm cảfilters[specName]vào nữa ạ.Bạn xem thử trang này: http://5minuteshack.blogspot.com/2018/03/reactjs-tutorial.html Cách viết bên này mới hơn.
cám ơn anh vì bài viết ạ
(thankyou)
Bài viết rất hữu ích!
Tất cả các câu hỏi của bạn nảy sinh vì bạn vẫn đang tư duy hệ thống theo kiểu client-server và chưa hình dung ra cách hoạt động của mạng ngang hàng P2P. Mô hình mạng ngang hàng không chỉ khác về giao thức sử dụng udp thay vì tcp, mà còn bởi cách nó vận hành. Đó là không hề có server trung gian lưu trữ
dữ liệu. Hãy lấy ví dụ đơn giản về mạng BitTorrent chia sẻ phim lậu. Một đĩa Bluray tầm 120GB sẽ được 1 người ra cửa hàng mua về, người A đó đưa vào máy tính và bật BitTorrent lên. BitTorrent là 1Phần Mềmchứ k phải 1Server, sẽ bắt đầu chia sẻđường linktrực tiếp từ thư mục của người A. và người A đưa link cho người B, file sẽ được copy sang ổ của người B. Nhưng để copy đc từ A sang B, người B cũng phải cài phần mềm BitTorrent (hoặc phần mềm Torrent tương tự). Phần mềm BitTorrent sẽ có tính năngkết nốivàtheo dõi. Giờ thì người C tham gia BitTorrent. Thấy link phim 120GB, người đó sẽ kích tải về. Lúc này phần mềm BitTorrent sẽ nhìn thấy trong mạng đang có 2 thư mục có thể down về. Vànó sẽ down từ cả 2 thư mục, cắt đoạn đầu down từ máy A, đoạn đuôi down từ máy B. Như thế thì như kiểu sẽ download song song và giảm đc thời gian tải, tiết kiệm được băng thông. Nếu có 1000 người cùng lưu trữ một file và cùng online, thì lúc này mạng Torrent đó sẽ rất nhanh. Nhưng nếu chỉ 2 người, mà người A tắt máy đi ngủ, thì đường truyền lúc này chỉ còn mỗi từ thư mục của B. Nếu B cũng tắt máy nốt, thì đường link đó mới chính thức chết. Do đó mạng ngang hàng, thì càng đông càng mạnh, gần như không bao giờ chết.Bây giờ mình sẽ lần lượt trả lời các câu hỏi của bạn:
Chính xác thì bây giờ mảng Blockchain của BitCoin là bao nhiêu GB bạn có biết không? đến thời điểm hiện tại là 161GB. https://blockchain.info/charts/blocks-size Điều này nghĩa là máy bạn muốn bắt đầu đào BitCoin thì bạn phải có
161GB trống trở lên. Đấy là máy đào, còn máy người dùng muốn giao dịch, thì bạn chả cần gì cả. Bạn chỉ cần đặt lệnh giao dịch và đưa vào mảngGiao dịch đang đợi Hashlà xong, người khác sẽ đào Hash cho bạn, bạn không tự lôi 161GB về rồi tính toán Hash nên k cần.Không có server trung gian để lưu trữ Blockchain đâu bạn, lúc nào ở máy thợ mỏ trong mạng cũng có sẵn 161GB data copy toàn bộ Blockchain. Nhưng không phải toàn bộ 161GB data này được gửi đi gửi lại trong mạng, mà chỉ có các Block cuối được thêm vào mới được gửi đi. Do đó data gửi rất nhanh. Cái bạn cần là một
đường truyền mạngcực kỳ ổn định, vì nếu bạn Hash xong 1 block và mạng chập chờn k gửi được thì xin chia buồn với bạn. Tốc độ mạng cũng không cần quá nhanh, vì data chỉ là text. Gửi nhận chỉ vài MB.Do đó theo tôi sự
ổn địnhcủa mạng internet mới là cái bạn nên quan tâm thay vì lo đếndung lượnghoặctốc độ.Vẫn câu hỏi cũ. Không hề có server trung gian để đọc ghi DB, mà máy bạn lúc nào cũng có sẵn 161GB data để bạn thích query thế nào thì query. Toàn bộ data của toàn bộ người dùng đã nằm sẵn trong cục 161GB đó rồi. Nếu bạn chỉ là người kiểm tra ví tiền qua web server (ví dụ trang e-wallet, trang trading nào đó) thì rõ ràng trang web đó sẽ là nơi chứa 161GB data và query cho bạn. Họ cũng chỉ query trong 1 cục Data của họ, 1 tỉ request cũng chỉ như facebook là cùng. Cái này không có gì quá khó khăn cho một web service, vì chỉ cần máy chủ đủ mạnh sẽ đáp ứng được lượt request/giây tương ứng.
Lại một lần nữa bạn hỏi sai. Không hề có trung tâm API, vì bạn vẫn tư duy theo kiểu server api.
Nền tảng cho phép miningcủa bạn sẽ phải Open Source toàn bộ. Nghĩa là fileExample.htmlcủa tôi phải đưa về máy người dùng. Phần mềm BitTorrent cũng là 1 phần mềm chạy trên máy người dùng và không hề có server trung gian.Blockchain không thể chỉnh sửa, vì nó đã nối lại với nhau bằng Hash, Bắt buộc phải
thêm mớiblock vào đểSỬAthông tin của ông A. Và đã thêm vào tức là các máy khác bắt buộc phảidownloadBlock mới về. Và việc sửa bất kỳ cái gì đều làm cho mọi người biết. Cái hay của cơ sở dữ liệu Blockchain ở chỗ nó chỉ cho thêm, k cho xóa và sửa, dẫn đến nó có tính Minh Bạch. Và lịch sử của 1 con người, 1 món hàng hoặc 1 thành phần gì đó đã tham gia vào Blockchain là không thể bị mất đi, vì có rất nhiều bản ghi đã được copy sang các máy khác.Hi vọng đã giải đáp được các thắc mắc của bạn.
@Minh2018 Mình xin phép được trả lời các thắc mắc của bạn, theo cách hoạt động của blockchain Bitcoin nhé, những blockchain khác có thể sẽ có cách giải quyết khác
Câu này có vẻ bạn hỏi về cách xây dựng blockchain của bạn @chungminhtu, xin để bạn @chungminhtu giải thích vậy
Để kiểm tra số tiền của một địa chỉ Bitcoin, ta chỉ cần tính tổng của lượng Unspent Transaction Output ứng với public key của địa chỉ ví đó là được, không cần phải duyệt qua toàn bộ block làm gì. Các node đều có lưu thông tin về các Unspent Transaction Output này.
Với giao dịch Bitcoin thì Output của một transaction này sẽ được sử dụng làm Input của một transaction khác, thế nên từ các Unspent Transaction Output, bạn cứ truy ngược lại là ra được hết các transaction của một địa chỉ.
Blockchain Ethereum có một cách tiếp cận khác, họ có các trường lưu trạng thái của từng account, thế nên account nào có bao nhiêu ether chỉ cần check state của account cái là ra ngay.
Tất cả các full node đều lưu trữ dữ liệu về blockchain bitcoin, hay nói cách khác, nếu cùng một lúc có 1 triệu request thì đó cũng là request trên cả chục nghìn full node bitcoin đang vận hành, chứ không phải tất cả đều gửi đến một server trung tâm nào cả. Nếu bạn muốn làm một service liên quan đến blockchain bitcoin, ethereum ... thì hãy dựng một full node cho mình, sync hết dữ liệu blockchain về, và bạn có thể request đến full node đó của riêng mình, không phải chung đụng với ai, dữ liệu trả về sẽ giống hệt khi dùng dịch vụ khác thôi.
Câu hỏi này mình không hiểu lắm? Nếu bạn muốn xây dựng một coin là decentralized giống bitcoin hay ethereum, thì nó hoàn toàn không cần đến cái gọi là trung tâm xử lý gì cả, bởi không ai có thể kiểm soát chúng, bất kỳ ai cũng có thể mining, bất kỳ ai cũng có thể verify block, bất kỳ ai cũng có thể verify transaction. Đó mới là cái hay của bitcoin, so với hệ thống chuyển tiền truyền thống.
Có vẻ bạn đang hiểu nhầm, cái không thể thay đổi được là nội dung của transaction đã được confirm trong block. Chẳng hạn có một giao dịch chuyển 1 bitcoin từ ông A sang ông B, và giao dịch đó được confirm trong block, sau đó có các block khác được tạo ra sau block đó, thì gần như không thể thay đổi được nội dung giao dịch kia (bạn không thể sửa từ 1 thành 2, sửa ông B thành ông C ...). Thực tế vẫn có khả năng blockchain bị tấn công đảo ngược giao dịch (51% attact, bạn xem thêm ở https://viblo.asia/p/bitcoin-the-hype-the-myth-and-the-truth-part-2-Az45bbAQ5xY), tức biến một giao dịch từ confirm thành chưa confirm, nhưng điều đó là rất khó, đặc biệt là với một mạng lưới có sức mạnh tính toán khủng khiếp như bitcoin hiện nay.
Còn trên blockchain Ethereum thì bạn có thể lưu được dữ liệu (state) nên bạn hoàn toàn có thể kích hoạt các hàm trong smart contract để thực hiện việc thay đổi dữ liệu của các account (như tên là A sửa thành tên là B), tuy nhiên cần phải phân biệt rõ, "dữ liệu" được nói đến ở đây là dữ liệu của một account (address) trong blockchain Ethereum, chứ không phải nội dung transactions (thứ được nhét vào trong block, và sẽ gần như là không thể thay đổi được).
Nhưng cũng đúng như bạn nói ở phần sau, hiện cũng có rất nhiều service blockchain, từ game đến app, họ không hoàn toàn vận hành chỉ bằng blockchain (xử lý on-chain), mà họ cũng có cả các xử lý logic off-chain (không dùng blockchain) nữa
Cảm ơn các bạn @thangtd90 và @chungminhtu đã giải thích tận tình và rất chi tiết. Có một vấn đề nữa mình cũng mong muốn được giải đáp từ các bạn đó là:
bài viết hay ạ
... chắc anh gì trả lời bên dưới chắc đang gặm 1 con project nào bể banh chè.
oke bạn, cảm ơn đóng góp, mình đã thông
"Ví dụ: Một phòng ban có 1 hoặc nhiều nhân viên" Hình minh họa ví dụ này sai rồi. (1,n) phải để ở bên nhân viên chứ.
Mình khi decode trên python thì gặp chuỗi này : 20180126/\x83\x8a\x83/\x81[\x83X\x83f\x81[\x83^\x8d\xb7\x82\xb5\x91\xd6\x82\xa6\x8a\xd6\x98A\x8e\x91\x97\xbf/ có thể chỉ cho mình nó là của loại nào ko?
Mỗi giao dịch xác nhận mất 10 phút thì không đúng, vì mỗi Block nối thành công mất 10 phút mới đúng. Và một Block thường chứa nhiều giao dịch trong đó. Nên mỗi giao dịch thường chỉ mất vài giây hoặc vài phút.
Hoàn toàn có thể. Blockchain của BitCoin chỉ quy định là 1MB/1Block. Mình thích chọn bao nhiêu giao dịch đưa vào cũng đc, miễn là <=1MB. Bạn có thể xem qua 1 Block thực tế ở đây: https://blockchain.info/block/0000000000000000002cb3f87709e719ed0f9d44ce8d5c45effec21d1f6ceb59
Bạn hiểu sai chỗ này. Blockchain của mỗi thợ mỏ là có độ dài khác nhau. Nếu mọi người đang đào 1 block mà có 1 thợ mỏ đã đào xong 2 block (Giá trị TimeStamp sẽ được dùng để xác nhận ai nhanh tay hơn). Khi có 1 block được commit vào mạng, ngay lập tức những người còn lại phải bỏ dở công việc (vứt đi toàn bộ Hash đã đào) và lấy cái mới nhất (đã có sẵn 2 Block) và đào tiếp. Nếu cố tình đào cho Block của mình dài hơn thì phải bắt buộc có 3 block. Ở đây đơn thuần là sự cạnh tranh gay gắt về sức mạnh tính toán máy tính. Và tỉ lệ thất bại của BitCoin là khá cao đấy nhé, tiếng anh gọi là "Luck Factor"
Thời gian để Hash xong 1 Block trung bình là 10 phút. Nhưng không phải Hash xong là ta được thưởng luôn 12,5BitCoin đâu bạn. Vì trong lúc bạn Hash cũng có khoảng 300 người nữa cùng mạng cũng đang Hash cho Block đó. Tỉ lệ bạn đánh thắng được 300 người kia là rất nhỏ, bạn sẽ phải lấy Block người ta đã tạo ra đó, và Hash Block tiếp theo, vứt đi cái mã Hash bạn khổ công bỏ ra 10 phút để đào. Do đó trong mạng thường có 1 tỉ lệ Hash rate để tính được trung bình bạn kiếm đc bao nhiêu $ một giờ.
Mỗi một Block Hash thành công và được chấp nhận bởi các thành viên trong mạng, sẽ được thưởng 12,5BitCoin. Bạn có thể xem link vừa nãy để thấy giá trị "Block Reward". Giá trị 12,5BTC này sẽ được đưa vào 1 "Ví tiền ảo" và chỉ có 1 địa chỉ duy nhất thôi. Ai là người sở hữu nó thì lấy dc. Ví này của 1 hay nhiều người thì không ai biết được. Thường chỉ 1 người sở hữu 1 ví. Và cả 1 trang trại đào thì thường cũng chỉ 1 ví tiền mà thôi. Chia ra nhiều ví sẽ mất nhiều phí giao dịch. Chả tội gì.
Câu hỏi rất chuẩn. Chỗ này là chỗ bị hiểu nhầm nhiều nhất. 10 phút là tính trung bình cho cả Pool (hay Node) hiện tại. Tức là tổng sức mạnh tính toán của tất cả những máy tham gia vào khu vực (Node) hiện tại. Cái này thì rất khủng khiếp. Lên đến hàng tỉ Hash mỗi giây. Máy bạn cùi bắp thì xin thưa, bạn cần khoảng vài trăm năm để ra đc 1 Hash nhé. Như máy tôi có card GTX 1050 cũng chỉ có tốc độ khoảng 3000Hash/s. Bạn có thể xem qua link này https://blockchain.info/charts/hash-rate
Hệ thống mà bạn nói ở đây chính là các Node, các Pool. Khi thợ mỏ commit Block mới lên hoặc lấy Trans mới về để đào Hash thì đều connect vào đây, ở đây như là một điểm trung gian. Và nó cũng là điểm mà được phép tăng giảm độ khó. Mỗi Block lấy về sẽ có sẵn một cái giá trị Diffyculty (https://blockchain.info/block/0000000000000000002cb3f87709e719ed0f9d44ce8d5c45effec21d1f6ceb59) để căn cứ vào cho thợ mỏ đào. Bạn có thể hình dung là biến "this.DoKho" của mỗi Block là thay đổi tương ứng với mỗi lần lấy file example.html về.
Em nghĩ rằng logout thì không nên dùng get.
Em nhớ trước đây tạo controller mặc định thì sẽ là restful controller, không dùng các method này thì thêm option --plain gì đó. Còn bây giờ ngược lại, mặc định controller trống, muốn tạo restful controller thì phải thêm option --resource. Em không nhớ từ phiên bản nào mà có sự thay đổi này nhưng có lẽ bây giờ nếu anh muốn kết hợp sử dụng với Route::resource() thì phải dùng thêm option --resource mới phải.
Tks bạn
Cảm ơn bạn.
Dĩ nhiên thì hiệu năng sẽ là bài toán cho người lập trình. Tuy nhiên vì sử dụng mạng ngang hàng. Thì cơ chế của một đồng tiền Ảo phải có một điểm trung gian để các máy client connect đến. Mỗi một quốc gia sẽ có một nút mạng như thế, ta có thể hiểu là 1 "Node". Và ở đó có hệ thống máy chủ lớn chứa các giao dịch và tính toán các giá trị cần thiết (như bạn yêu cầu). Do đó người dùng gần như k cần quá quan tâm đến liệu máy mình đủ mạnh để join vào mạng blockchain hay k. Thực tế thì điện thoại hoặc thiết bị IoT (tivi, tủ lạnh...) cũng có thể truy cập được blockchain như bình thường.
Mình xin phép được giải đáp các thắc mắc của bạn nhé
Thời gian 1 block được tạo ra là không cố định, thời gian 10 phút / 1 block của Bitcoin chỉ là thời gian trung bình mà thôi, tức là đôi khi có 2 block cách nhau 2, 3 phút, và đôi khi cũng có 2 block cách nhau 15, 20 phút.
Thế nên rất khó để xác định thời gian tối thiểu hay thời gian tối đa để 1 giao dịch được xác nhận.
Hiện tại, một giao dịch được xác định nhanh hay chậm còn tuỳ thuộc vào phí mà giao dịch đó trả cho thợ mỏ nữa, phí thấp thì xác định có mà chờ cả ngày bạn ạ (^^;)
Mỗi giao dịch có chứa thông tin, do đó nó có dung lượng. Mỗi block có giới hạn về kích cỡ, như bitcoin là 1MB (hiện nay là 4MB block weight sau khi đã kích hoạt segwit), thế nên số lượng giao dịch có thể chứa trong 1 block sẽ bị giới hạn. Thợ mỏ có thể nhét bao nhiêu giao dịch vào block cũng được, miễn là nó không vượt qua giới hạn đã được cả mạng lưới đồng thuận.
Có rất nhiều thuật toán PoW khác nhau, nhưng nhìn chung tất cả đều hoạt động như bạn nói ở trên: Tranh nhau giải một bài toán. Ai giải được trước thì người đó có tất cả phần thưởng, những người khác sẽ không được gì. Ở bitcoin thì bài toán PoW là dùng thuật toán SHA256 để mã hoá thông tin block để ra một kết quả, nếu kết quả này nhỏ hơn một target (mà cả hệ thống đều biết và đồng thuận từ trước), thì block đó được coi là hợp lệ. Bạn có thể tìm hiểu thêm về Bitcoin Block cũng như Bitcoin PoW ở video này: https://viblo.asia/p/bitcoin-the-hype-the-myth-and-the-truth-part-2-Az45bbAQ5xY
Ai tìm được ra lời giải cho bài toán PoW sẽ nhận được hết, những người khác sẽ không được gì. Tuy nhiên, hiện nay việc giải bài toán PoW ngày càng trở nên khó khăn và dường như bạn sẽ không thể giải được nếu chỉ tự "đào" một mình. Do đó các mining pool ra đời. Hiểu đơn giản là nhiều thợ mỏ sẽ "lập thành một hội" với nhau, và có thể chia đều thành quả cho các thành viên tham gia tuỳ theo sức mạnh cống hiến.
Như mình đã nói ở trên, 10 phút là tốc độ trung bình. Cả mạng lưới sẽ tiến hành điều chỉnh độ khó của bài toán PoW sau mỗi 2016 blocks (~ 2 tuần). Độ khó ở đây chính là giá trị target ở trên, thợ mỏ cần tìm ra một số ngẫu nhiên, để khi hash nó cùng với các thông tin trong block được một số nhỏ hơn target này (target càng nhỏ thì càng phải thử nhiều lần để tìm ra đáp án). Giả sự hiện tại mạng lưới có độ khó là T. Thấy đào bitcoin có lợi nhuận lớn, nhiều thợ mỏ mới tham gia mạng lưới, dẫn đến sức mạnh tính toán của mạng lưới tăng -> thời gian đào được block nhanh -> thời gian trung bình nhỏ hơn 10 phút -> sau 2016 blocks, mạng lưới sẽ tính toán lại, để làm tăng độ khó lên (giảm target xuống) -> thời gian đào được block lại chậm đi -> thời gian trung bình được duy trì trong khoảng 10 phút.
Ngược lại, thời gian trung bình mà lớn hơn 10 phút (do nhiều thợ mỏ bỏ đi) -> ở lần điều chỉnh tới, độ khó sẽ được điều chỉnh giảm đi.
Sau khi tìm được một block, tất cả lại bắt tay vào giải bài toán mới: bài toán PoW cho block tiếp theo!
Bạn có thể tìm hiểu thêm tại video này nhé
https://viblo.asia/p/bitcoin-the-hype-the-myth-and-the-truth-part-1-OeVKBo7JZkW