IPFS - id
IPFS id, ping
네트워크, ID 및 ping 과 관련된 비교적 간단한 두 명령에 대해 설명합니다.
Id
ipfs id <peerID>: ipfs 노드 ID 정보 표시
-f
옵션에는 다음과 같은 다섯 가지 값이 있습니다.
<id>
: 노드 ID<aver>
: 클라이언트 버전<pver>
: 프로토콜 버전<pubkey>
: 공개 키<addr>
: 주소
$ ipfs id QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ -f ="<aver>"
go-ipfs/0.4.15/
Ping
ipfs ping <peerID>: 노드에 ping 패킷 보냄
라우팅 시스템을 통해 노드를 발견하고 ping 메시지를 전송하며 왕복 지연 정보를 확인합니다.
-n
옵션을 사용하여 int 형식의 보낼 핑 메시지 수를 설정할 수 있습니다. (기본값 10)
ipfs ping QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ
Looking up peer QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ
PING QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ.
Pong reveived: time=224.02 ms
Pong reveived: time=223.66 ms
Pong reveived: time=224.12 ms
Pong reveived: time=213.82 ms
Pong reveived: time=212.02 ms
Pong reveived: time=223.95 ms
Pong reveived: time=225.61 ms
Pong reveived: time=225.01 ms
Pong reveived: time=224.70 ms
Pong reveived: time=224.33 ms
Average latency: 222.12ms
IPFS - files
IPFS files
ipfs files <명령어>
chcid <path>
: 주어진 경로의 루트 노드의 cid 버전 또는 hash 함수 변경- cid-var int: 채택 할 cid 버전
- hash string: 사용할 hash 함수
-
cp <source><dest>
: 파일을 mfs에 복사 -
flush <path>
: 주어진 경로의 데이터를 디스크로 플러시 -
ls <path>
: 로컬 변수 네임 스페이스의 디렉토리 리스트 mkdir <path>
: 디렉토리 생성- p bool: 필요에 따라 부모 디렉토리 생성
-
mv <source><dest>
: 파일을 source 에서 dest 로 이동하면 hash 변경 read <path>
: 주어진 mfs 에 있는 파일을 읽음- o int: 오프셋을 읽기 시작하는 바이트 (int)
- n int: 최대 바이트 (int)
rm <path>
: 파일 삭제- r: 재귀적 삭제
stat <path>
: 주어진 경로 파일의 상태- format string: 출력 형식 지정
- hash bool: 해시만 출력
- size bool: 크기만 출력
write <path><data>
: path 파일에 가변적인 data 파일 작성- o, n: 오프셋을 읽기 시작하는 바이트 (int), 최대 바이트 (int)
- e bool: 파일이 존재하지 않으면 생성
- t bool: 파일을 작성하기 전에 원본 내용을 지우고 처음부터 작성
$ ipfs files ls
h
hide
hide1
$ ipfs files stat /h
QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN
Size: 19
CumulativeSize: 77
ChildBlocks: 1
Type: file
$ ipfs files stat /hide
QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa
Size: 0
CumulativeSize: 4
ChildBlocks: 0
Type: directory
$ ipfs files read /h
add wechat 18191727
IPFS - dht
IPFS DHT
ipfs 네트워크는 DHT (Distributed Hash Table) 를 사용하여 네트워크 노드에 대한 메타 데이터를 저장합니다. ipfs에서 사용하는 DHT는 S/Kademlia 입니다. 기본 형식은 다음과 같습니다:
ipfs dht <명령어>
다음과 같은 6 개의 하위 명령이 있습니다.
findpeer <peerID>
: DHT 에서 주어진 peerID와 연관된 주소 쿼리- v bool: 추가 정보 제공, 기본값은 false
findprovs <key>
: 키에 해당하는 컨텐츠를 제공 할 수있는 노드 찾기- v bool: 추가 정보 제공, 기본값은 false
get <key>
: 키를 사용하여 DHT 에서 값을 반환- v bool: 추가 정보 제공, 기본값은 false
put<key> <value>
: DHT 에 한 쌍의 key/value 작성- /foo/bar 형식의 키가 주어 지므로 키/값 을 쓸 수 있음
- foo는 키 유형이고 bar는 키 이름
- 키의 유형으로 /ipns를 사용하고 키의 이름으로 노드 ID를 권장
- v bool: 추가 정보 제공, 기본값은 false
provide <key>
: 주어진 키를 제공하고 있는 전체 네트워크로 브로드 캐스트- v bool: 추가 정보 제공, 기본값은 false
- r bool: 재귀적으로 완벽한 그래픽, 기본값 false
quety <peerID>
: DHT 에서 주어진 노드 ID에 가장 가까운 노드를 찾음- v bool: 추가 정보 제공, 기본값은 false
IPFS - cat, get, ls, refs
IPFS cat, get, ls, refs
cat
cat 명령은 ipfs 네트워크에있는 파일의 내용을 표시하는 데 사용됩니다. 형식은 다음과 같습니다:
ipfs cat [options] 파일hash
두가지 옵션이 있습니다.
- o int: 표시 할 때 이전의 int 바이트 제거
- l int: 총 int 바이트 표시
다음과 같이 사용됩니다:
$ ipfs cat QmSoLSafTMBsPKadTEgaXctDQVcqN88CNLHXMkTNwMKPnu
"hi, I am IZ*ONE"
$ ipfs cat -o 10 QmSoLSafTMBsPKadTEgaXctDQVcqN88CNLHXMkTNwMKPnu
Z*ONE"
$ ipfs cat -o 1 QmSoLSafTMBsPKadTEgaXctDQVcqN88CNLHXMkTNwMKPnu
hi, I am IZ*ONE"
$ ipfs cat -l 8 QmSoLSafTMBsPKadTEgaXctDQVcqN88CNLHXMkTNwMKPnu
"hi, I am
get
get 명령은 ipfs 네트워크에서 로컬로 파일을 다운로드하는 데 사용됩니다. 형식은 다음과 같습니다:
ipfs get [options] 파일hash
네 가지 옵션이 있습니다.
- o path: 로컬 저장 경로
- a: .tar 포맷으로 저장된 압축
- C: .gzip 포맷으로 저장된 압축
- l int: 압축 레벨 지정
ls
ls 명령은 파일의 각 조각에 대한 정보를 나열하는 데 사용됩니다 (조각이있는 경우). 형식은 다음과 같습니다:
ipfs ls [options] 파일hash
주요 옵션은 다음과 같습니다.
- v: 출력에 헤더 추가
$ ipfs add -s size-10240 wechat.jpg
added QmaWLzjB6Y5RdkThm6TCxoK5ZnFRypxTNdK52QLGdoTvAs wechat.jpg
$ ipfs ls QmaWLzjB6Y5RdkThm6TCxoK5ZnFRypxTNdK52QLGdoTvAs
QmY6AWeX52Pemc54pv6jFUvwaA1VBH7yFqLZv6A64MSEWg 10251
QmSCKPtkEpffpKUasSxMqicDN7vbSxhw8k7BwGBFbjSDai 10251
QmQ2DZqTnHF3F9mqtSD66jvKDGUanBgEfUxRDTtMQJuQZp 10251
QmdejejQH5wP6fKrmkBHRqtevFvUrTeAEHpMcnEAGTmkDY 10251
QmWimAR2tjeJBcsBtJPkU3VxQRdieHcYyaK5fnAJCd4Byj 10251
QmUXSHDHLyz3kxsFGdEc29JjLoJoeGamTKvbu84FfZ2VXv 4534
$ ipfs ls -v QmaWLzjB6Y5RdkThm6TCxoK5ZnFRypxTNdK52QLGdoTvAs
Hash Size Name
QmY6AWeX52Pemc54pv6jFUvwaA1VBH7yFqLZv6A64MSEWg 10251
QmSCKPtkEpffpKUasSxMqicDN7vbSxhw8k7BwGBFbjSDai 10251
QmQ2DZqTnHF3F9mqtSD66jvKDGUanBgEfUxRDTtMQJuQZp 10251
QmdejejQH5wP6fKrmkBHRqtevFvUrTeAEHpMcnEAGTmkDY 10251
QmWimAR2tjeJBcsBtJPkU3VxQRdieHcYyaK5fnAJCd4Byj 10251
QmUXSHDHLyz3kxsFGdEc29JjLoJoeGamTKvbu84FfZ2VXv 4534
refs
refs 명령은 파일의 관련 조각을 나열하는 데 사용됩니다. 형식은 다음과 같습니다:
ipfs refs [options] 파일hash
네 가지 옵션이 있습니다.
- format: 출력 형식 지정 (기본값은 샤드만 출력)
- e: 출력 포맷은 소스파일 -> 분할된 포맷
- u: 출력 결과 오프셋
- r: 하위 샤드도 나열
IPFS - bootstrap
IPFS bootstrap
ipfs 네트워크에서 로컬 노드가 시작된 후 공식적으로 제공되는 기본 노드에 대한 링크를 수신하게 되며 ipfs 에서 제공하는 주 네트워크와의 링크가 생성됩니다.
ipfs 네트워크에서 다른 노드에 연결하려고 할 때 다음과 같은 프로세스가 발생합니다.
- “신뢰할 수 있는” 노드 중 일부에 연결
- “신뢰할 수 있는” 노드를 통해 점차적으로 대상 노드에 연결
“신뢰할 수 있는” 노드를 bootstrap 이라고 부릅니다. bootstrap
명령은 이러한 bootstrap 을 작동시키는 것입니다.
bootstrap 노드를 추가 및 제거하는 것은 매우 신중해야 합니다. 즉, 반드시 믿을 수 있는 노드가 되어야 합니다. 그렇지 않으면 악성 노드에 연결하거나 아일랜드 노드로 만들 수 있습니다.
명령의 기본 형식은 다음과 같습니다.
ipfs bootstrap <명령어>
다음 세 가지 하위 명령이 있습니다:
- add
<peer>
: bootstrap 목록에 노드 추가 (포트: 4001)- default bool: 기본 bootstrap 노드 추가
$ ipfs bootstrap add /ip4/192.168.2.91/tcp/4001/ipfs/QmTvb4UDEqNpV6mizrbZyzjZyw7VWvUxgYbnsdTrFSXKYV
added /ip4/192.168.2.91/tcp/4001/ipfs/QmTvb4UDEqNpV6mizrbZyzjZyw7VWvUxgYbnsdTrFSXKYV
node exit 0
- rm
<peer>
: bootstrap 목록에 노드 제거- all bool: 모든 bootstrap 노드 삭제
$ ipfs bootstrap rm
/ip6/2400:6180:0:d0::151:6001/tcp/4001/ipfs/QmSoLSafTMBsPKadTEgaXctDQVcqN88CNLHXMkTNwMKPnu
create new datastore
removed /ip6/2400:6180:0:d0::151:6001/tcp/4001/ipfs/QmSoLSafTMBsPKadTEgaXctDQVcqN88CNLHXMkTNwMKPnu
node exit 0
list
: 현재 부트 스트랩 노드 리스트
$ ipfs bootstrap list
/dnsaddr/bootstrap.libp2p.io/ipfs/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN
/dnsaddr/bootstrap.libp2p.io/ipfs/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa
/dnsaddr/bootstrap.libp2p.io/ipfs/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb
/dnsaddr/bootstrap.libp2p.io/ipfs/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt
/ip4/104.131.131.82/tcp/4001/ipfs/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ
/ip4/104.236.179.241/tcp/4001/ipfs/QmSoLPppuBtQSGwKDZT2M73ULpjvfd3aZ6ha4oFGL1KrGM
/ip4/104.236.76.40/tcp/4001/ipfs/QmSoLV4Bbm51jM9C4gDYZQ9Cy3U6aXMJDAbzgu2fzaDs64
/ip4/128.199.219.111/tcp/4001/ipfs/QmSoLSafTMBsPKadTEgaXctDQVcqN88CNLHXMkTNwMKPnu
/ip4/178.62.158.247/tcp/4001/ipfs/QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd
/ip6/2400:6180:0:d0::151:6001/tcp/4001/ipfs/QmSoLSafTMBsPKadTEgaXctDQVcqN88CNLHXMkTNwMKPnu
/ip6/2604:a880:1:20::203:d001/tcp/4001/ipfs/QmSoLPppuBtQSGwKDZT2M73ULpjvfd3aZ6ha4oFGL1KrGM
/ip6/2604:a880:800:10::4a:5001/tcp/4001/ipfs/QmSoLV4Bbm51jM9C4gDYZQ9Cy3U6aXMJDAbzgu2fzaDs64
/ip6/2a03:b0c0:0:1010::23:1001/tcp/4001/ipfs/QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd
출력 노드 정보
ipfs 네트워크에서 노드는 Qm
으로 시작하는 46비트 해시 값으로 식별됩니다. 개발 디버그를 사용하여 링크 노드의 정보를 출력하면 다음 노드 정보를 찾을 수 있습니다.
netNotifiee conn:[<peer.ID cJCLDD> <peer.ID QCU2Ec> <peer.ID UuQGw9> <peer.ID SoLPpp>],curconn:<peer.ID SoLPpp>
소스에서 peerID 는 6개의 문자열 크기에 불과하며 바이트의 해시 값과 일치하지 않지만 직접적인 연관을 발견했습니다: 소스 코드의 peerID 는 해시 값의 3-8번째 문자를 가져옵니다.
사설 IPFS 네트워크 구축
bootstrap 이 노드 정보를 편집하는 매커니즘은 사설 ipfs 네트워크를 구축하기 위한 기반을 제공합니다. 즉, 로컬 노드의 일부는 외부 네트워크에 연결되어 있지 않고 ipfs의 기본 네트워크에 연결되어 있지 않지만 기본적으로 로컬 네트워크의 노드에 연결되어 ipfs 개인 네트워크를 상호 연결할 수 있습니다.
$ ipfs bootstrap list
create new datastore
/ip4/192.168.2.91/tcp/4001/ipfs/QmTvb4UDEqNpV6mizrbZyzjZyw7VWvUxgYbnsdTrFSXKYV
node exit 0
위 그림과 같이 노드는 파일 해시를 통해 네트워크에서 해당 파일을 찾을 수 있고 파란색 노드는 노란색 노드를 통해 빨간색 노드에 저장된 파일을 찾을 수 있습니다. 노란색으로 연결된 노드가 빨간색 네트워크에 대한 연결을 삭제하면 파란색 부분은 다음 그림과 같이 사설 ipfs 네트워크를 형성합니다.
위 그림의 사설 IPFS 네트워크는 bootstrap 을 통해 구현됩니다.