Lỗi đây ạ
FAILURE: Build failed with an exception.
What went wrong:
Could not determine java version from '9.0.4'.
Try:
Run with --info or --debug option to get more log output.
Exception is:
java.lang.IllegalArgumentException: Could not determine java version from '9.0.4'.
at org.gradle.api.JavaVersion.toVersion(JavaVersion.java:72)
at org.gradle.api.JavaVersion.current(JavaVersion.java:82)
at org.gradle.internal.jvm.UnsupportedJavaRuntimeException.assertUsingVersion(UnsupportedJavaRuntimeException.java:29)
at org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRuntimeValidationAction.java:32)
at org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRuntimeValidationAction.java:24)
at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:33)
at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:22)
at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:253)
at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:182)
at org.gradle.launcher.Main.doAction(Main.java:33)
at org.gradle.launcher.bootstrap.EntryPoint.run(EntryPoint.java:45)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at org.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit(ProcessBootstrap.java:60)
at org.gradle.launcher.bootstrap.ProcessBootstrap.run(ProcessBootstrap.java:37)
at org.gradle.launcher.GradleMain.main(GradleMain.java:23)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at org.gradle.wrapper.BootstrapMainStarter.start(BootstrapMainStarter.java:30)
at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:129)
at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)
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 ?
THẢO LUẬN
Lỗi đây ạ FAILURE: Build failed with an exception.
What went wrong: Could not determine java version from '9.0.4'.
Try: Run with --info or --debug option to get more log output.
Exception is: java.lang.IllegalArgumentException: Could not determine java version from '9.0.4'. at org.gradle.api.JavaVersion.toVersion(JavaVersion.java:72) at org.gradle.api.JavaVersion.current(JavaVersion.java:82) at org.gradle.internal.jvm.UnsupportedJavaRuntimeException.assertUsingVersion(UnsupportedJavaRuntimeException.java:29) at org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRuntimeValidationAction.java:32) at org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRuntimeValidationAction.java:24) at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:33) at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:22) at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:253) at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:182) at org.gradle.launcher.Main.doAction(Main.java:33) at org.gradle.launcher.bootstrap.EntryPoint.run(EntryPoint.java:45) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:564) at org.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit(ProcessBootstrap.java:60) at org.gradle.launcher.bootstrap.ProcessBootstrap.run(ProcessBootstrap.java:37) at org.gradle.launcher.GradleMain.main(GradleMain.java:23) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:564) at org.gradle.wrapper.BootstrapMainStarter.start(BootstrapMainStarter.java:30) at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:129) at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)
Get more help at https://help.gradle.org
thank 4 share
thank 4 share
Nếu sử dụng label thì có áp dụng được cách này k anh nhỉ https://viblo.asia/p/nsmutableattributedstring-attribute-string-trong-ios-va-nhung-dieu-thu-vi-co-the-ban-da-biet-aWj5386oK6m
Bài của em thì làm theo cách khác thủ công hơn tý nhưng áp dụng cho label :v
Thanks
Anh/bạn có thể nói rõ trong trường hợp nào thì thích hợp dùng lệnh này không ạ.
Em thì hiểu cách dùng rồi nhưng trong dự án thì nó sẽ thường sử dụng trong trường hợp nào ạ.
Trông khá hay. Cảm ơn bác ^^
ờ :v
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].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 ạ.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ềm
chứ k phải 1Server
, 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ăngkế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:
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 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.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 đếndung lượng
hoặ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 mining
của bạn sẽ phải Open Source toàn bộ. Nghĩa là fileExample.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.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ảidownload
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.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