P2P Connection
The fetchai/p2p_libp2p:0.26.0
connection allows AEAs to create a peer-to-peer communication network. In particular, the connection creates an overlay network which maps agents' public keys to IP addresses.
Local demo
First, make sure you have installed the crypto plugin of the target test-net. E.g. for Fetch.AI:
Create and run the genesis AEA
Create one AEA as follows:
aea create my_genesis_aea
cd my_genesis_aea
aea add connection fetchai/p2p_libp2p:0.26.0
aea config set agent.default_connection fetchai/p2p_libp2p:0.26.0
aea install
aea build
Establish the proof of representation:
aea generate-key fetchai
aea add-key fetchai fetchai_private_key.txt
aea generate-key fetchai fetchai_connection_private_key.txt
aea add-key fetchai fetchai_connection_private_key.txt --connection
aea issue-certificates
Run the AEA:
Once you see a message of the form To join its network use multiaddr 'SOME_ADDRESS'
take note of the address. (Alternatively, use aea get-multiaddress fetchai -c -i fetchai/p2p_libp2p:0.26.0 -u public_uri
to retrieve the address.)
This is the entry peer address for the local agent communication network created by the genesis AEA.
Create and run another AEA
Create a second AEA:
aea create my_other_aea
cd my_other_aea
aea add connection fetchai/p2p_libp2p:0.26.0
aea config set agent.default_connection fetchai/p2p_libp2p:0.26.0
aea install
aea build
Establish the proof of representation:
aea generate-key fetchai
aea add-key fetchai fetchai_private_key.txt
aea generate-key fetchai fetchai_connection_private_key.txt
aea add-key fetchai fetchai_connection_private_key.txt --connection
aea issue-certificates
Provide the AEA with the information it needs to find the genesis:
aea config set --type dict vendor.fetchai.connections.p2p_libp2p.config \
'{
"delegate_uri": "127.0.0.1:11001",
"entry_peers": ["SOME_ADDRESS"],
"local_uri": "127.0.0.1:9001",
"log_file": "libp2p_node.log",
"public_uri": "127.0.0.1:9001"
}'
SOME_ADDRESS
needs to be replaced with the list of multi addresses displayed in the log output of the genesis AEA.
Run the AEA:
You can inspect the libp2p_node.log
log files of the AEA to see how they discover each other.
Note
Currently p2p_libp2p
connection limits the total message size to 3 MB.
Local demo with skills
Explore the demo section for further examples.
Deployed agent communication network
You can connect to the deployed public test network by adding one or multiple of the following addresses as the p2p_libp2p
connection's entry_peers
:
Specifically, in an AEA's configuration aea-config.yaml
add the above addresses for entry_peers
as follows:
---
public_id: fetchai/p2p_libp2p:0.26.0
type: connection
config:
delegate_uri: null
entry_peers: [/dns4/acn.fetch.ai/tcp/9000/p2p/16Uiu2HAkw1ypeQYQbRFV5hKUxGRHocwU5ohmVmCnyJNg36tnPFdx,/dns4/acn.fetch.ai/tcp/9001/p2p/16Uiu2HAmVWnopQAqq4pniYLw44VRvYxBUoRHqjz1Hh2SoCyjbyRW]
public_uri: null
local_uri: 127.0.0.1:9001
Note, this configuration change must be made for all agents attempting to communicate with each other via the Agent Communication Network. For example, in demos involving two agents, both agents will need the above modifications to their respective aea-config.yaml
file. However, remember to use different ports in local_uri.
This will allow both agents to default to this communication network without the added overhead of opening ports and specifying hosts on the individual host machines running each agent.
Configuring the connection.yaml
entries:
To learn more about how to configure your fetchai/p2p_libp2p:0.26.0
connection consult the README.md
file supplied with the connection package.
Running Go peer standalone
You can run a peer node in standalone mode; that is, as a Go process with no dependency on the AEA framework. To facilitate such a deployment, we provide a script
run_acn_node_standalone.py
and a corresponding
Dockerfile.
First, you need to build the node's binary (libp2p_node
) either:
- locally
Make sure you satisfy the system requirements.
svn export https://github.com/fetchai/agents-aea.git/trunk/packages/fetchai/connections/p2p_libp2p cd p2p_libp2p go build chmod +x libp2p_node
- or within a docker image using the provided Dockerfile:
Next, to run the node binary in standalone mode, it requires values for the following entries:
AEA_P2P_ID
: the node's private key, will be used as its identityAEA_P2P_URI
: the local host and port to use by nodeAEA_P2P_URI_PUBLIC
: the URI under which the peer is publicly reachableAEA_P2P_DELEGATE_URI
: the URI under which the peer receives delegate connectionsAEA_P2P_ENTRY_URIS
: an optionally supplied list of comma-separated (,
) entry Multiaddresses for the peer to bootstrap
The script allows different methods to pass these values to the node:
- As environment variables exported in the format
<ENTRY_KEYWORD>=<ENTRY_VALUE>
for each entry. Then: - Using an environment file containing the entries and their values in the format
<ENTRY_KEYWORD>=<ENTRY_VALUE>
, one entry per line. Then: or - Using command line arguments: or
Note that the script will always save the configuration of the running node as a file under the name .acn_config
in the current working directory. This can be handy when you want the exact same configuration for future runs of the node.