IPFS без болка (но ова не е точно)

IPFS без болка (но ова не е точно)

И покрај фактот што Хабре веќе беше повеќе од една статија за IPFS.

Веднаш ќе појаснам дека не сум експерт во оваа област, но сум покажал интерес за оваа технологија повеќе од еднаш, но обидот да си поиграм со неа често предизвикуваше болка. Денеска повторно почнав да експериментирам и добив некои резултати кои би сакал да ги споделам. Накратко, ќе биде опишан процесот на инсталација на IPFS и некои функции (се е направено на ubuntu, не сум го пробал на други платформи).

Ако сте пропуштиле што е IPFS, тука е напишано подетално: habr.com/ru/post/314768

Инсталација

За чистота на експериментот, предлагам веднаш да го инсталирате на некој надворешен сервер, бидејќи ќе разгледаме некои замки при работа во локален режим и далечински. Потоа по желба нема уште долго да се руши, нема многу.

Инсталирајте go

Официјална документација
Погледнете ја тековната верзија на golang.org/dl

Забелешка: подобро е да се инсталира IPFS во име на корисникот кој треба да го користи најчесто. Факт е дека подолу ќе ја разгледаме опцијата за монтирање преку FUSE и има суптилности.

cd ~
curl -O https://dl.google.com/go/go1.12.9.linux-amd64.tar.gz
tar xvf go1.12.9.linux-amd64.tar.gz
sudo chown -R root:root ./go
sudo mv go /usr/local
rm go1.12.9.linux-amd64.tar.gz

Потоа треба да ја ажурирате околината (повеќе детали овде: golang.org/doc/code.html#GOPATH).

echo 'export GOPATH=$HOME/work' >> ~/.bashrc
echo 'export PATH=$PATH:/usr/local/go/bin:$GOPATH/bin' >> ~/.bashrc
source ~/.bashrc

Проверка дека go е инсталиран

go version

Инсталирајте IPFS

Најмногу ми се допадна методот на инсталација ipfs ажурирање.

Инсталирајте го со командата

go get -v -u github.com/ipfs/ipfs-update

После тоа, можете да ги извршите следните команди:

ipfs-update верзии - да ги видите сите достапни верзии за преземање.
ipfs-update верзија - да ја видите моментално инсталираната верзија (додека не инсталираме IPFS, нема да биде никаква).
ipfs-update инсталирај најново - инсталирајте ја најновата верзија на IPFS. Наместо најновата, соодветно, можете да наведете која било сакана верзија од листата на достапни.

Инсталирање ipfs

ipfs-update install latest

Проверка

ipfs --version

Директно со инсталацијата во општи термини се.

Стартувај IPFS

Иницијализација

Прво треба да извршите иницијализација.

ipfs init

Како одговор, ќе добиете нешто како ова:

 ipfs init
initializing IPFS node at /home/USERNAME/.ipfs
generating 2048-bit RSA keypair...done
peer identity: QmeCWX1DD7HnXXXXXXXXXXXXXXXXXXXXXXXXxxx
to get started, enter:
	ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme

Можете да ја извршите предложената команда

ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme

Резултира

Hello and Welcome to IPFS!

██╗██████╗ ███████╗███████╗
██║██╔══██╗██╔════╝██╔════╝
██║██████╔╝█████╗  ███████╗
██║██╔═══╝ ██╔══╝  ╚════██║
██║██║     ██║     ███████║
╚═╝╚═╝     ╚═╝     ╚══════╝

If you're seeing this, you have successfully installed
IPFS and are now interfacing with the ipfs merkledag!

 -------------------------------------------------------
| Warning:                                              |
|   This is alpha software. Use at your own discretion! |
|   Much is missing or lacking polish. There are bugs.  |
|   Not yet secure. Read the security notes for more.   |
 -------------------------------------------------------

Check out some of the other files in this directory:

  ./about
  ./help
  ./quick-start     <-- usage examples
  ./readme          <-- this file
  ./security-notes

Тука, според мене, започнува интересното. Момците во фазата на инсталација веќе почнуваат да користат свои технологии. Предложениот хаш QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv не е генериран специјално за вас, туку зашиен во изданието. Тоа е, пред објавувањето, тие подготвија текст за добредојде, го истурија во IPFS и ја додадоа адресата на инсталерот. Мислам дека е многу кул. И оваа датотека (поточно, целата папка) сега може да се гледа не само локално, туку и на официјалната порта ipfs.io/ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv. Во исто време, можете да бидете сигурни дека содржината на папката не е променета на кој било начин, бидејќи ако се сменеше, тогаш ќе се сменеше и хашот.

Патем, во овој случај, IPFS има некои сличности со серверот за контрола на верзијата. Ако направите промени во изворните датотеки на папката и повторно ја истурите папката во IPFS, тогаш таа ќе добие нова адреса. Во исто време, старата папка нема да оди никаде само така и ќе биде достапна на претходната адреса.

Директно лансирање

ipfs daemon

Треба да добиете одговор како овој:

ipfs daemon
Initializing daemon...
go-ipfs version: 0.4.22-
Repo version: 7
System version: amd64/linux
Golang version: go1.12.7
Swarm listening on /ip4/x.x.x.x/tcp/4001
Swarm listening on /ip4/127.0.0.1/tcp/4001
Swarm listening on /ip6/::1/tcp/4001
Swarm listening on /p2p-circuit
Swarm announcing /ip4/127.0.0.1/tcp/4001
Swarm announcing /ip6/::1/tcp/4001
API server listening on /ip4/127.0.0.1/tcp/5001
WebUI: http://127.0.0.1:5001/webui
Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080
Daemon is ready

Отворање на вратите на Интернет

Обрнете внимание на овие две линии:

WebUI: http://127.0.0.1:5001/webui
Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080

Сега, ако сте инсталирале IPFS локално, тогаш ќе пристапите до IPFS интерфејсите на локалните адреси и сè ќе ви биде достапно (На пример, localhost:5001/webui/). Но, кога се инсталирани на надворешен сервер, стандардно, портите се затворени за Интернет. Порти два:

  1. администратор на вебуи (github) на порта 5001.
  2. Надворешен API на портата 8080 (само за читање).

Досега, двете порти (5001 и 8080) може да се отворат за експерименти, но на борбен сервер, се разбира, портата 5001 треба да се затвори со заштитен ѕид. Има и порта 4001, која е потребна за да можат другите колеги да ве најдат. Треба да се остави отворена за надворешни барања.

Отворете ~/.ipfs/config за уредување и пронајдете ги овие редови во него:

"Addresses": {
  "Swarm": [
    "/ip4/0.0.0.0/tcp/4001",
    "/ip6/::/tcp/4001"
  ],
  "Announce": [],
  "NoAnnounce": [],
  "API": "/ip4/127.0.0.1/tcp/5001",
  "Gateway": "/ip4/127.0.0.1/tcp/8080"
}

Променете ја 127.0.0.1 на ip на вашиот сервер и зачувајте ја датотеката, а потоа рестартирајте ја ipfs (стопирајте ја командата што работи со Ctrl+C и стартувајте ја повторно).

Треба да се добие

...
WebUI: http://ip_вашего_сервера:5001/webui
Gateway (readonly) server listening on /ip4/ip_вашего_сервера/tcp/8080

Сега надворешните интерфејси треба да бидат достапни.

Проверете

http://домен_или_ip_сервера:8080/ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme

Треба да се отвори горната датотека readme.

http://домен_или_ip_сервера:5001/webui/

Веб-интерфејсот треба да се отвори.

Ако webui работи за вас, тогаш поставките за IPFS може да се променат директно во него, вклучително и статистика за гледање, но подолу ќе ги разгледам опциите за конфигурација директно преку конфигурациската датотека, што генерално не е критично. Само подобро е да запомните точно каде е конфигурацијата и што да правите со неа, инаку ако веб-лицето не работи, ќе биде потешко.

Поставување веб-интерфејс за работа со вашиот сервер

Еве ја првата замка, која траеше околу три часа.

Ако сте инсталирале IPFS на надворешен сервер, но не сте го инсталирале или извршиле IPFS локално, тогаш кога одите на /webui во веб-интерфејсот, треба да видите грешка во врската:

IPFS без болка (но ова не е точно)

Факт е дека webui, според мое мислење, работи многу двосмислено. Прво, се обидува да се поврзе со API на серверот каде што е отворен интерфејсот (се разбира, врз основа на адресата во прелистувачот). и ако не работи таму, се обидува да се поврзе со локалната порта. И ако имаш IPFS што работи локално, тогаш webui ќе ти работи добро, само ти ќе работиш со локални IPFS, а не со екстерно, иако си отворил webui на надворешен сервер. Потоа ги поставувате датотеките, но поради некоја причина не ги гледате баш така на надворешен сервер…

И ако не работи локално, тогаш добиваме грешка во врската. Во нашиот случај, грешката најверојатно се должи на CORS, што е означено и со webui, што сугерира додавање на конфигурација.

ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["http://ip_вашего сервера:5001", "http://127.0.0.1:5001", "https://webui.ipfs.io"]'
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods '["PUT", "GET", "POST"]'

Само што регистрирав џокер

ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["*"]'

Додадените заглавија може да се најдат во истата ~/.ipfs/config. Во мојот случај тоа е

  "API": {
    "HTTPHeaders": {
      "Access-Control-Allow-Origin": [
        "*"
      ]
    }
  },

Го рестартираме ipfs и гледаме дека webui успешно се поврза (во секој случај, треба, ако сте ги отвориле портите за барања однадвор, како што е опишано погоре).

Сега можете да прикачувате папки и датотеки директно преку веб-интерфејсот, како и да креирате сопствени папки.

Монтирање на датотечен систем FUSE

Еве една прилично интересна карактеристика.

Датотеки (како и папки), можеме да додадеме не само преку веб-интерфејсот, туку и директно во терминалот, на пример

ipfs add test -r
added QmfYuz2gegRZNkDUDVLNa5DXzKmxxxxxxxxxx test/test.txt
added QmbnzgRVAP4fL814h5mQttyqk1aURxxxxxxxxxxxx test

Последниот хаш е хашот на основната папка.

Користејќи го овој хаш, можеме да отвориме папка на кој било јазол ipfs (кој може да го најде нашиот јазол и да ја добие содржината), можеме во веб-интерфејсот на портата 5001 или 8080, или можеме локално преку ipfs.

ipfs ls QmbnzgRVAP4fL814h5mQttyqk1aUxxxxxxxxxxxxx
QmfYuz2gegRZNkDUDVLNa5DXzKmKVxxxxxxxxxxxxxx 10 test.txt

Но, сепак можете да го отворите како обична папка.

Ајде да создадеме две папки во коренот и да им дадеме права на нашиот корисник.

sudo mkdir /ipfs /ipns
sudo chown USERNAME /ipfs /ipns

и рестартирајте го ipfs со знаменце --mount

ipfs daemon --mount

Можете да креирате папки на други места и да ја одредите патеката до нив преку параметрите на ipfs daemon -mount -mount-ipfs /ipfs_path -mount-ipns /ipns_path

Сега читањето од оваа папка е нешто невообичаено.

ls -la /ipfs
ls: reading directory '/ipfs': Operation not permitted
total 0

Тоа е, нема директен пристап до коренот на оваа папка. Но, можете да ја добиете содржината, знаејќи го хашот.

ls -la /ipfs/QmbnzgRVAP4fL814h5mQttyqxxxxxxxxxxxxxxxxx
total 0
-r--r--r-- 1 root root 10 Aug 31 07:03 test.txt

cat /ipfs/QmbnzgRVAP4fL814h5mQttyqxxxxxxxxxxxxxxxxx/test.txt 
test
test

Во исто време, дури и автоматското завршување работи во папката кога е наведена патеката.

Како што реков погоре, има суптилности со таквото монтирање: стандардно, монтираните папки FUSE се достапни само за тековниот корисник (дури и root нема да може да чита од таква папка, а да не зборуваме за другите корисници во системот). Ако сакате да ги направите овие папки достапни за други корисници, тогаш во конфигурацијата треба да ја промените „FuseAllowOther“: false во „FuseAllowOther“: точно. Но, тоа не е се. Ако користите IPFS како root, тогаш сè е во ред. И ако во име на обичен корисник (дури и sudo), тогаш ќе добиете грешка

mount helper error: fusermount: option allow_other only allowed if 'user_allow_other' is set in /etc/fuse.conf

Во овој случај, треба да го уредите /etc/fuse.conf со откоментирање на линијата #user_allow_other.

После тоа, рестартирајте го ipfs.

Познати проблеми со FUSE

Проблемот е забележан повеќе од еднаш дека по рестартирање на ipfs со монтирање (а можеби и во други случаи), точките за монтирање /ipfs и /ipns стануваат недостапни. Нема пристап до нив, а ls -la /ipfs покажува ???? во листата на права.

Го најдов ова решение:

fusermount -z -u /ipfs
fusermount -z -u /ipns

Потоа рестартирајте го ipfs.

Додавање услуга

Се разбира, трчањето во терминалот е погодно само за првични тестови. Во борбен режим, демонот треба да започне автоматски при стартување на системот.

Во име на sudo, креирајте ја датотеката /etc/systemd/system/ipfs.service и напишете ја:

[Unit]
Description=IPFS Daemon
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=simple
ExecStart=/home/USERNAME/work/bin/ipfs daemon --mount
User=USERNAME
Restart=always

[Install]
WantedBy=multi-user.target

КОРИСНИКОТ ИМЕ, се разбира, мора да се замени со вашиот корисник (и можеби целосната патека до програмата ipfs ќе биде различна за вас (мора да ја наведете целосната патека)).

Ја активираме услугата.

sudo systemctl enable ipfs.service

Ја започнуваме услугата.

sudo service ipfs start

Проверка на статусот на услугата.

sudo service ipfs status

Заради чистотата на експериментот, во иднина ќе биде можно да се рестартира серверот за да се провери дали ipfs успешно стартува автоматски.

Додавање на познати гозби

Размислете за ситуација кога имаме IPFS јазли инсталирани и на надворешен сервер и локално. На надворешен сервер, додаваме некоја датотека и се обидуваме да ја добиеме преку IPFS локално преку CID. Што ќе се случи? Се разбира, локалниот сервер најверојатно не знае ништо за нашиот надворешен сервер и едноставно ќе се обиде да ја пронајде датотеката по CID со „прашање“ на сите IPFS врсници што му се достапни (со кои веќе успеа да се „запознае“). Тие пак ќе ги прашаат другите. И така натаму, додека не се најде датотеката. Всушност, истото се случува кога се обидуваме да ја пренесеме датотеката преку официјалната порта ipfs.io. Ако имате среќа, датотеката ќе се најде за неколку секунди. А ако не, нема да се најде ниту за неколку минути, што во голема мера влијае на удобноста на работата. Но, знаеме каде прво ќе се појави оваа датотека. Па зошто веднаш да не му кажеме на нашиот локален сервер „Прво барај таму“? Очигледно, ова може да се направи.

1. Одиме на оддалечениот сервер и гледаме во конфигурацијата ~/.ipfs/config

"Identity": {
    "PeerID": "QmeCWX1DD7HnPSuMHZSh6tFuxxxxxxxxxxxxxxxx",

2. Стартувајте го статусот ipfs на услугата sudo и побарајте записи во Swarm во него, на пример:

Swarm announcing /ip4/ip_вашего_сервера/tcp/4001

3. Од ова ја додаваме општата адреса на формата „/ip4/ip_your_server/tcp/4001/ipfs/$PeerID“.

4. За сигурност, ќе се обидеме да ја додадеме оваа адреса на врсниците преку нашите локални webui.

IPFS без болка (но ова не е точно)

5. Ако сè е во ред, отворете ја локалната конфигурација ~ / .ipfs / config, пронајдете „Bootstrap“ во неа: [...
и додадете ја примената адреса прво во низата.

Рестартирајте го IPFS.

Сега ајде да ја додадеме датотеката на надворешниот сервер и да се обидеме да ја побараме на локалниот. Треба да лета брзо.

Но, оваа функционалност сè уште не е стабилна. Колку што разбрав, дури и ако ја специфицираме адресата на врсник во Bootstrap, ipfs ја менува листата на активни врски со врсници за време на работата. Во секој случај, дискусијата за ова и желбите во врска со можноста за прецизирање на трајни празници е во тек тука и се чини дека претпоставен додадете некоја функционалност на [заштитена по е-пошта]+

Списокот на тековни врсници може да се гледа и во webui и во терминалот.

ipfs swarm peers

И тука и таму можете рачно да ја додавате вашата гозба.

ipfs swarm connect "/ip4/ip_вашего_сервера/tcp/4001/ipfs/$PeerID"

Сè додека оваа функционалност не се подобри, можете да напишете алатка за да проверите дали има врска со саканиот врсник и, ако не, да додадете врска.

Расудување

Меѓу оние кои веќе се запознаени со IPFS, има и аргументи за и против IPFS. Во принцип, вчера дискусија и ме поттикна повторно да копам во IPFS. А во однос на дискусијата спомената погоре: не можам да кажам дека остро се спротивставувам на кој било аргумент на оние што зборуваа (не се согласувам само со фактот дека еден и пол програмери користат IPFS). Во принцип, и двајцата се во право на свој начин (особено коментар за чекови ве тера да размислувате). Но, ако ја отфрлиме моралната и правната проценка, кој ќе даде техничка оценка за оваа технологија? Лично имам некакво внатрешно чувство дека „ова мора да се направи недвосмислено, има одредени перспективи“. Но, зошто точно, нема јасна формулација. На пример, ако ги погледнете постоечките централизирани алатки, тогаш во многу аспекти тие се далеку понапред (стабилност, брзина, управливост, итн.). Сепак, имам една мисла која се чини дека има смисла и која тешко може да се спроведе без такви децентрализирани системи. Се разбира, премногу замавнувам, но би го формулирал вака: мора да се смени принципот на ширење информации на Интернет.

Дозволи ми да објаснам. Ако размислите за тоа, сега имаме информации дистрибуирани според принципот „Се надевам дека оној на кого му ги дадов ќе ги заштити и нема да бидат изгубени или примени од оние на кои не им беше наменета“. Како пример, лесно е да се разгледаат разни услуги за пошта, складишта во облак, итн. И со што завршуваме? На хабот Хабре Безбедност на информации е на прва линија и речиси секој ден добиваме вести за уште едно глобално протекување. Во принцип, сите најинтересни работи се наведени во <иронија> прекрасно статија Летото е речиси завршено. Скоро и да нема непротечени податоци. Односно, главните интернет гиганти стануваат се поголеми, акумулираат се повеќе информации, а таквите протекувања се еден вид информациски атомски експлозии. Ова никогаш досега не се случило, а еве го повторно. Во исто време, иако многумина разбираат дека постојат ризици, тие ќе продолжат да им веруваат на своите податоци на трети компании. Прво, нема многу алтернатива, а второ, ветуваат дека ги закрпиле сите дупки и тоа никогаш повеќе нема да се повтори.

Која опција ја гледам? Ми се чини дека податоците првично треба да се дистрибуираат отворено. Но, отвореноста во овој случај не значи дека сè треба да биде лесно за читање. Зборувам за отвореност на складирање и дистрибуција, но не и целосна отвореност во читањето. Претпоставувам дека информациите треба да се дистрибуираат со јавни клучеви. На крајот на краиштата, принципот на јавни / приватни клучеви е веќе стар, речиси како Интернет. Доколку информацијата не е доверлива и е наменета за широк круг, тогаш веднаш се поставува со јавен клуч (но сепак во шифрирана форма, само секој може да ја дешифрира со достапниот клуч). И ако не, тогаш тој е поставен без јавен клуч, а самиот клуч се пренесува на она што треба да има пристап до овие информации. Во исто време, оној што треба да го прочита треба да има само клуч, а од каде да ги добие овие информации, тој навистина не треба да се издигнува - тој само го вади од мрежата (ова е новиот принцип на дистрибуција по содржина, а не по адреса).

Така, за масовен напад, напаѓачите ќе треба да добијат огромен број приватни клучеви, а тоа веројатно нема да се направи на едно место. Оваа задача, како што гледам, е потешка од хакирање на одредена услуга.

И тука е затворен уште еден проблем: потврда за авторство. Сега на Интернет можете да најдете многу цитати напишани од нашите пријатели. Но, каде е гаранцијата дека токму тие ги напишале? Сега, ако секој таков запис беше придружен со дигитален потпис, ќе беше многу полесно. И не е важно каде лежи оваа информација, главната работа е потписот, кој, се разбира, е тешко да се фалсификува.

И еве што е интересно овде: IPFS веќе носи алатки за шифрирање (на крајот на краиштата, тој е изграден на технологијата на блокчејн). Приватниот клуч е веднаш наведен во конфигурацијата.

  "Identity": {
    "PeerID": "QmeCWX1DD7HnPSuMHZSh6tFuMxxxxxxxxxxxxxx",
    "PrivKey": "CAASqAkwggSkAgEAAoIBAQClZedVmj8JkPvT92sGrNIQmofVF3ne8xSWZIGqkm+t9IHNN+/NDI51jA0MRzpBviM3o/c/Nuz30wo95vWToNyWzJlyAISXnUHxnVhvpeJAbaeggQRcFxO9ujO9DH61aqgN1m+JoEplHjtc4KS5
pUEDqamve+xAJO8BWt/LgeRKA70JN4hlsRSghRqNFFwjeuBkT1kB6tZsG3YmvAXJ0o2uye+y+7LMS7jKpwJNJBiFAa/Kuyu3W6PrdOe7SqrXfjOLHQ0uX1oYfcqFIKQsBNj/Fb+GJMiciJUZaAjgHoaZrrf2b/Eii3z0i+QIVG7OypXT3Z9JUS60
KKLfjtJ0nVLjAgMBAAECggEAZqSR5sbdffNSxN2TtsXDa3hq+WwjPp/908M10QQleH/3mcKv98FmGz65zjfZyHjV5C7GPp24e6elgHr3RhGbM55vT5dQscJu7SGng0of2bnzQCEw8nGD18dZWmYJsE4rUsMT3wXxhUU4s8/Zijgq27oLyxKNr9T7
2gxqPCI06VTfMiCL1wBBUP1wHdFmD/YLJwOjV/sVzbsl9HxqzgzlDtfMn/bJodcURFI1sf1e6WO+MyTc3.................

Не сум специјалист за безбедност и не можам точно да знам како правилно да го користам, но ми се чини дека овие клучеви се користат на ниво на размена помеѓу IPFS јазлите. И исто така js-ipfs и пример проекти како што се орбита-dbна кој работи орбита.разговор. Односно, теоретски, секој уред (мобилен и не само) може лесно да се опреми со свои машини за шифрирање-декрипција. Во овој случај, останува само секој да се погрижи за зачувување на приватните клучеви, а секој ќе одговара за својата безбедност, а не да биде заложник на друг човечки фактор на некој суперпопуларен интернет гигант.

Само регистрирани корисници можат да учествуваат во анкетата. Најави се, вие сте добредојдени.

Дали сте слушнале за IPFS порано?

  • Никогаш не сум слушнал за IPFS, но изгледа интересно

  • Не сум слушнал и не сакам да слушам

  • Слушна, но не заинтересирана

  • Слушнав, но не разбрав, но сега изгледа интересно

  • Долго време активно користам IPFS.

Гласаа 69 корисници. 13 корисници беа воздржани.

Извор: www.habr.com

Додадете коментар