Is peer discovery in libp2p (e.g. peers telling each other about peers they know about, and managing lists of connected nodes) in Rust controlled entirely at the level of a NetworkBehavior?
It looks like one option is to use Kademlia which looks like it does this (in the rust version) by defining a NetworkBehavior.
Is it correct that if you don't want to use Kademlia to implement peer discovery, you do this by defining peer discovery as part of your NetworkBehavior?
I'm trying to avoid a situation whereby I start to implement code to do this, but then I find that libp2p is actually doing this for me under the covers.
You have several alternatives, but of course you have to implement a behavior (or combination of behaviors) to discover peers:
mDNS
It allows peers to discover each other when they are on the same local network without any configuration. It is obviously the simplest discovery mode, but limited to local networks.
This is the example.
Rendezvous
It's goal is to provide a lightweight mechanism for generalized peer discovery. As its name indicates, it requires that there be nodes that act as rendezvous. In the protocol implementation examples you can see it better.
Kademlia
This is the best option in the context of a network with many nodes, where a portion of these nodes may offer limited connectivity. It's simpler than it seems, but at the time we did not find practical examples, and we learned through trial and error.
Some of my colleagues are preparing a tutorial series to be published soon, to share our experience with libp2p in Rust.
Related
What are the advantages of hyperledger-fabric compared to a private Ethereum network? According to what I've read, Ethereum seems to be more like a general-purpose blockchain network whereas hyperledger-fabric can be more business-oriented but so far the features offering that advantage are not very clear to me.
Fabric is a Hyperledger project. It is an enterprise-grade distributed ledger that allows the development blockchain solutions
with a modular architecture. It has a permissioned architecture,
support modularization, pluggable consensus, and supports smart
contracts(aka ‘Chaincode’ in case of Hyperledger Fabric).
Various functions in the fabric are pluggable, and it also allows the use of any language to develop smart contracts. This functionality
is possible because it is based on container technology (Docker),
which can host any language.
As of now smart-contract in the blockchain run on an order-execute environment where the consensus protocol validate and order
transactions and broadcasts it to all the peer nodes in the network,
each peer node then sequentially executes the transaction. Most
blockchains today run on this order-execute blockchain environment.
The issue in this order-execute environment is that the smart contract
running here needs to be deterministic otherwise a consensus might
never be reached. To solve this issue, smart contracts have been
written in non-standard languages like Solidity with which the
non-deterministic operations are eliminated. However, this hinders
blockchain large scale adoption as smart contracts need to be written
in an altogether new language and it may lead to programming errors.
Moreover, as all transactions are only executed sequentially,
performance and scale are limited.
As Fabric eliminates the non-determinism issue, it has become the
first blockchain to enable the use of standard programming languages
to write smart contracts. In the 1.1.0 release, the smart contracts
will be written in either Node.js or Go; in the subsequent releases it
is envisioned that the platform will support other popular programming
languages like Java.
As widely known, the public blockchain network runs on Proof-of-Work concept and the transactions are executed on every node. Every
transaction and code that is implemented is visible to every node in
the network. This means neither the smart contract stays confidential
nor the transaction data which is processed. This means we have
exchanged the privacy of the contract and data for the public
consensus concept of PoW.
This lack of privacy is problematic for businesses. For example, in a supply chain business, some partners might be offered additional
discounts as a means of solidifying business. If everyone in the
network is able to see the contract and transaction, it won’t be
possible to do business – everyone will ask for the discounted rates!
Hyperledger Fabric as a permissioned blockchain offers privacy and confidentiality through its channel architecture. With Fabric, one can
establish a “channel” between the subset of participants who should be
granted the right to access a set of transactions. Like a network
overlay, only the nodes that participate in a channel have the access
to the chaincode (smart contract) and transaction data. This helps to
preserve confidentiality and privacy and builds trust in the network.
To enhance the privacy and confidentiality aspect, Fabric is offering
support to keep the data private and is developing zero knowledge
proofs (ZKP).
I'm looking for something for distributed cache for node.js. It should be:
built-in (works inside node process)
distributed and replicated between any number of servers (1 or 2 should be enough for concensus)
consistency is not critical
automatic peer discovery is preferably (e.g. by UDP)
should have one lider in one period of time (who will periodically update the cache)
I tried to find something for LevelDB (memdown), but all project are not maintained for several years. Maybe they are so stable, but I'm not sure. It is also possible to take a discovery and consensus algorithm and implement other things manually, but I can't find js-implementaion of Raft etc. for 1+ peers.
Advise me something, please.
I've chosen http://cote.js.org/ - mesh network. This is not full decision, just discovery and pub sub service. Plus lider choosing algorithm which I wrote manually.
I was reading lot of articles on blockchain and almost everyone has some different understanding of blockchain.
Is there any accepted definition of Blockchain by any community?
In few articles I read:
Blockchains are Decentralised while DLTs are not.
All blockchains are DLT but not all DLTs are blockchain. It added "if transactions get stored in blocks then it is a blockchain else it is not"
From above statements-
Is Decentralisation must for a Blockchain?
Or it is just a Immutable Distributed Database? which can be centralised or decentralised?
I would refer you to the first blockchain application, Bitcoin, which describes the "chain of blocks" in the original Bitcoin Whitepaper.
Blockchain
The term “blockchain” is often overused, that can have different meanings in different contexts. Blockchain technology has 3 major components that together really make it an innovation. Strictly speaking, a blockchain is just a data structure similar to a linked list. Blocks of data reference their previous block by including their digital fingerprint or hash in their block of data. If a previous block is modified, then all the following hashes will be different and it is easy to detect if the data has been tampered with. Even more importantly, is that this establishes an order to when events took place, in the case of Bitcoin, these events are transactions. The final piece is a consensus mechanism that allows participants on a publicly distributed network to all agree on a chain of blocks.
Consensus
A consensus mechanism extends the blockchain data structure by providing rules (agreed to by network participants) that enforce how blocks are accepted by the network as a whole. For example, with the proof-of-work consensus, there is an agreed-upon amount of work that must be done before a block is accepted as valid (its hash must meet a maximum value threshold). The lower the threshold, the more work must have been done (on average) to calculate the block hash. Providing a valid block hash becomes proof of work. This can make it much more difficult to modify past blocks, as the same amount of work must be done in order for the network to accept it as valid, thus distributed consensus can be achieved. This is why “blockchain technology” was invented, to achieve distributed consensus without relying on a third party. “Blockchain technology” is not really that interesting without the proof-of-work component and so it depends on what your definition of “blockchain technology” happens to be.
In conclusion, by this definition of blockchain, it doesn't make sense to use blockchain in a centralized environment (it is for distributed consensus).
One of the best writings on centralization and decentralization is an article by Ethereum creator Vitalik Buterin.
https://medium.com/#VitalikButerin/the-meaning-of-decentralization-a0c92b76a274
In this article he explains how even the most decentralized systems are also centralized to some extent.
Let's firstly make it clear that what is decentralization.
Decentralisation is the process by which the activities of an organization, particularly those regarding planning and decision making, are distributed or delegated away from a
central, authoritative location or group. Concepts of decentralization have been
applied to group dynamics and management science in private businesses and organizations,
political science, law and public administration, economics, money and technology. -- WikiPedia
So basically, there's no central, authoritative person or group or whatever to make decisions or plans in a decentralized system. According to this, I personally would prefer to separate it into two essential levels of a blockchain system.
In terms of the blockchain system(software and hardware) itself, it is decentralized. Because it is based on a distributed computer system, and it also has consensus algorithm (POW, POS, DAG etc.) to make sure each node/party in the system can reach to consistency.
In terms of governance, it can be decentralized or centralized. A typical centralized blockchain system is the private blockchain, since it is governed/managed by a single group or organization. While, obviously, a public blockchain is decentralized on the other hand.
Blockchain is a distributed ledger of Information. The main Concept was taken from the paper of Digital Time Stamping by Stuart Harber. The idea behind blockchain is to remove the centralized System so the decission power is taken from single Entity. Now if you want to make it centralised you are basically doing a trade off of the Basic properties of blockchain.
If you make the blockchain centralised one of the key feature is the consenses where other nodes verify the trnsactions so in centralised System the whole work is done by one node and we can assure that if that node is trustworthy node.
Block-chain is a distributed, decentralized, public ledger.
Both, Hyperledger Fabric and BichainDB offer the possibility to have a private, permissioned blockchain database. With their concepts they try to address the main disadvantages of public blockchains like lack of privacy and lack of performance (low throughput etc).
What are the main differences between the two technologies?
If you try out example application of both frameworks, you will quickly notice that BigchainDB is easier to start with. Hyperledger Fabric involves a lot of more knowledge to master it.
Fabric knows different kinds of nodes (peers, peers additionally being endorser nodes, orderer) and thereby allows a very flexible setup, depending on the consortium design and organisations themselves. BigchainDB has one kind of node that can be deployed. Also every involved organisation gets one node of course.
Fabric has richer capabilities to model assets and all kinds of transactions. One transaction kind can always be implemented by a custom processor function doing whatever is needed to query or modify the state of the ledger. BigchainDB only knows CREATE and TRANSFER transactions on every defined asset. You can create something (that may be also divisable, e.g. amounts of tokens) and can transfer them completely or partly.
Both seem to have pretty low level APIs. Fabric has more APIs and config models that need to be mastered. But Fabric is being complemented by frameworks such as Composer (with all its nice libraries involved, like playground and rest-server) that really improve the programming model. As far as I know there is nothing like that for BigchainDB, also because it is pretty simple from the start.
Consensus: BigchainDB uses Tendermint which is Byzantine Fault Tolerant. Fabric does PBFT which is Practically Byzantine Fault Tolerance, based on the idea of Miguel Castro.
In general I would say that Fabric is intended to be used for complex business use cases. BigchainDB is simpler and nice for assets that can be divided (financal stuff like coins/tokens maybe).
I'm currently working on a POC using hyperledger fabric + composer. I am somewhat confused when it gets to the consensus mechanism between orderers. From what i understand reading the documentation, hyperledger currently only supports SOLO and KAFKA. My understanding of SOLO is that the network only exists out of a single ordering node and no network consensus is reached between orderers (only 1 exists).
But this doesn't make sense to me; my gut tells me it must be possible to add multiple orderers without the use of KAFA / Zookeeper and that hyperledger has another mechanism to reach consensus between these two. The documentation regarding this is somewhat spotty and all over the place if i try to google it so i'm hoping someone can shed some light on the matter.
If no consensus mechanism exists between orderes besides a centralised one then what is the point of a distributed ledger platform?
The primary usage of SOLO ordering is for development mode, where you would like to test functionality without a need to span complex distributed consensus solutions. Moreover, note that consensus is a pluggable mechanism and could be replaced with anything you'd like, for example there is a recent proposal to use SmartBFT as an additional ordering service. Very similar to this you can add consensus mechanism of your own.
Currently if you need to distributed and highly available solutions for consensus there is a KAFKA based ordering service.
The Raft-based consensus protocol was added in Hyperledger Fabric v1.4.1, which simplifies deployment and adds decentralization to OSNs. It removes the additional dependency of Kafka/ZooKeeper needed to run a fault-tolerant network.