diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..055dae6 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,11 @@ +[*] +insert_final_newline = true +indent_size = 2 +indent_style = space +trim_trailing_whitespace = true + +[*.{md,yaml,yml,toml}] +indent_size = 4 + +[Makefile] +indent_style = tab diff --git a/.gitignore b/.gitignore index f1e3f9d..9cf472c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,11 @@ +.vscode + node_modules/ public/ tmp/ themes/material/original/ + +# Generated source files content/reference/pkg/*/ +src/styles/constants.less +static-build diff --git a/Makefile b/Makefile index 03ddbf7..9da0452 100644 --- a/Makefile +++ b/Makefile @@ -7,6 +7,7 @@ NPM=npm NPMBIN=./node_modules/.bin OUTPUTDIR=public PKGDIR=content/reference/pkg +PORT=1313 ifeq ($(DEBUG), true) PREPEND= @@ -16,23 +17,47 @@ else APPEND=1>/dev/null endif +node_modules: + $(PREPEND)$(NPM) install $(APPEND) + +ipfs-theme: + $(PREPEND)[ -d static-build/assets/fonts ] || mkdir -p static-build/assets/fonts + $(PREPEND)cp ./node_modules/ipfs-css/fonts/Montserrat* ./static-build/assets/fonts/ $(APPEND) + $(PREPEND)cp ./node_modules/ipfs-css/fonts/Inter-UI* ./static-build/assets/fonts/ $(APPEND) + $(PREPEND)node scripts/ipfs-css-constants.js $(APPEND) + packages: - $(PREPEND)scripts/pkg2md.sh github.com/ipfs/js-ipfs-api master $(PKGDIR) pkg - $(PREPEND)scripts/pkg2md.sh github.com/ipfs/js-ipfs master $(PKGDIR) pkg - $(PREPEND)scripts/pkg2md.sh github.com/ipfs/go-ipfs-api master $(PKGDIR) pkg - $(PREPEND)scripts/pkg2md.sh github.com/ipfs/go-ipfs/core/coreapi master $(PKGDIR) pkg + # The JS packages don't actually generate useful docs right now, so skip them + # $(PREPEND)scripts/pkg2md.sh github.com/ipfs/js-ipfs-api master $(PKGDIR) pkg + # $(PREPEND)scripts/pkg2md.sh github.com/ipfs/js-ipfs master $(PKGDIR) pkg + $(PREPEND)scripts/pkg2md.sh github.com/ipfs/go-ipfs-api v1.2.1 $(PKGDIR) go/pkg + $(PREPEND)scripts/pkg2md.sh github.com/ipfs/go-ipfs/core/coreapi v0.4.15 $(PKGDIR) go/pkg + $(PREPEND)scripts/pkg2md.sh github.com/ipfs/go-ipfs/core/coreapi/interface v0.4.15 $(PKGDIR) go/pkg + $(PREPEND)scripts/pkg2md.sh github.com/ipfs/go-ipfs/core/coreapi/interface/options v0.4.15 $(PKGDIR) go/pkg + +resources: ipfs-theme packages + +install: node_modules resources -build: clean packages +css: + # Dual calls to less because there seems to be a bug with multiple plugins in v3 :( + # https://github.com/less/less.js/issues/3187 + $(PREPEND)$(NPMBIN)/lessc -clean-css --autoprefix src/styles/main.less static-build/assets/main.css $(APPEND) + +build: clean install css $(PREPEND)hugo && \ echo "" && \ echo "Site built out to ./$(OUTPUTDIR)" +dev: css + $(PREPEND)( \ + $(NPMBIN)/nodemon --watch src/styles --ext less,css --exec "$(NPMBIN)/lessc -clean-css --autoprefix src/styles/main.less static-build/assets/main.css" & \ + hugo server -w --port $(PORT) \ + ) + serve: $(PREPEND)hugo server -node_modules: - $(PREPEND)$(NPM) i $(APPEND) - deploy: export hash=`ipfs add -r -Q $(OUTPUTDIR)`; \ echo ""; \ @@ -47,5 +72,6 @@ deploy: clean: $(PREPEND)[ ! -d $(OUTPUTDIR) ] || rm -rf $(OUTPUTDIR) $(PREPEND)[ ! -d $(PKGDIR) ] || rm -rf $(PKGDIR)/*/ + $(PREPEND)[ ! -d static-build/assets ] || rm -rf static-build/assets/* .PHONY: packages build help deploy publish-to-domain clean diff --git a/README.md b/README.md index d898e99..d6b6682 100644 --- a/README.md +++ b/README.md @@ -1,28 +1,39 @@ # IPFS Docs -> Documentation website for the IPFS project +This repo is used to: -For now: ipns://beta.docs.ipfs.io and https://beta.docs.ipfs.io +1. Organize documentation work across the IPFS project +2. Host a documentation website for IPFS meant to replace what is currently at https://ipfs.io/docs -Read the Captain's Log for updates: [ipfs/docs#47](https://github.com/ipfs/docs/issues/47) - -- Overview -- Contributing content -- Developing the site -- Automatic builds -- FAQ - - Why is it critical this is a static site? -- License +Read the Captain's Log or check the [issues](https://github.com/ipfs/docs/issues) for updates: [ipfs/docs#47](https://github.com/ipfs/docs/issues/47) ## Overview -TODO +IPFS documentation currently has several acute problems: + +- There is **no clear introduction to the overall idea of exactly how IPFS works and what it’s doing.** +- IPFS has **lots of new concepts** (whether you are knowledgeable about things like graphs or not) that are just very different from the web technologies people know today. +- **Docs are inconsistently located** and spread across a number of repos people have to hunt through. +- Clear, **standard API docs** are not always available. +- **Hunting through GitHub is hard.** (Which repos have docs? Where in the repo are they? Which projects are important and how do they relate to the others? Which repos and docs are up-to-date?) + +We aim to solve some of these problems through a documentation site (the source of which is in this repo) and others through organizing work, conventions, and practices across project repos (managed in the issues here). ## Contributing content -TODO +The documentation site contains several different kinds of content: + +1. **Introductory overviews.** This lives in `content/introduction`. If you spot a problem or have improvements, please post an issue or PR. Please also take a look at [#60](https://github.com/ipfs/docs/issues/60) for planning and ongoing work in this area. + +2. **Guides, examples, and tutorials.** Most examples currently live in other repos, like [js-ipfs examples](https://github.com/ipfs/js-ipfs/tree/master/examples). If you have thoughts on how to better integrate them, please file an issue here. If you have feedback on individual examples or want to add a new one, please file an issue or PR on the relevant repo. If you have ideas for guides or tutorials, they belong here! Please propose them in an issue here before creating a PR. + +3. **Reference Documentation.** Please see the issues in this repo for current activity around reference/API documentation. + +4. **Community.** If there are important missing community links, file an issue or PR here! + +Before posting a PR with documentation changes, please also check [out styleguide](https://github.com/ipfs/community/blob/master/docs-styleguide.md). ## Developing the site @@ -35,28 +46,32 @@ TODO ```sh npm install -g aegir ``` - + 3. Download IPFS libraries and tools (e.g. go-ipfs, js-ipfs) and generate their documentation: ```sh - make packages + make install ``` - - (Repeat this step anytime a package with autogenerated documentation has a new release.) + + This installs dependencies and generates source files from other projects (e.g. API documentation; theme resources from the `ipfs-css`, etc). + + When dependencies or external packages (like `go-ipfs`) have new releases, regenerate files based on them by running `make resources`. ### Build and Run the Site -* In the root directory, run `make serve` +* In the root directory, run `make dev` * Load http://localhost:1313 in your web browser * Edit and add things! +To create a production build, run `make build` instead. You’ll find the final static site in the `public` directory. + ## FAQ -### Why is it critical this is a static site? +### Why is this is a static site? -TODO +We believe in hosting IPFS’s documentation on IPFS, and that’s much easier when the content is static. ## License diff --git a/config.toml b/config.toml index 9daea33..b536b85 100644 --- a/config.toml +++ b/config.toml @@ -6,9 +6,284 @@ DefaultContentLanguage = "en" title = "IPFS Documentation" theme = "material" +staticDir = ["static", "static-build"] + +[blackfriday] +hrefTargetBlank = true + [params] editURL = "https://github.com/ipfs/docs/tree/master/content/" ordersectionsby = "weight" # ordersectionsby = "title" [outputs] home = [ "HTML", "RSS", "JSON"] + +[menu] + +[[menu.main]] +identifier = "introduction" +name = "Introduction" +weight = 1 + +[[menu.main]] +identifier = "guides" +name = "Guides" +weight = 2 + +[[menu.main]] +identifier = "reference" +name = "Reference" +weight = 3 + +[[menu.main]] +identifier = "community" +name = "Community" +weight = 4 + +[[menu.reference]] +identifier = "api" +name = "Commands & API" +weight = 4 +[[menu.reference]] +parent = "api" +name = "JS & Go Libraries" +url = "https://github.com/ipfs/interface-ipfs-core/tree/master/SPEC" +weight = 30 + +[[menu.reference]] +identifier = "go_implementation" +name = "Go Implementation" +weight = 5 +[[menu.reference]] +parent = "go_implementation" +name = "go-ipfs Core API" +url = "/go/pkg/go-ipfs/core/coreapi" +weight = 10 +[[menu.reference]] +parent = "go_implementation" +name = "go-ipfs Coreiface API" +url = "/go/pkg/go-ipfs/core/coreapi/interface" +weight = 11 +[[menu.reference]] +parent = "go_implementation" +name = "go-ipfs Core options API" +url = "/go/pkg/go-ipfs/core/coreapi/interface/options" +weight = 12 +[[menu.reference]] +parent = "go_implementation" +name = "go-ipfs-api Reference" +url = "/go/pkg/go-ipfs-api" +weight = 30 + +[[menu.reference]] +identifier = "js_implementation" +name = "JS Implementation" +weight = 5 +[[menu.reference]] +parent = "js_implementation" +name = "js-ipfs" +url = "https://github.com/ipfs/js-ipfs" +weight = 10 +[[menu.reference]] +parent = "js_implementation" +name = "js-ipfs-api" +url = "https://github.com/ipfs/js-ipfs-api" +weight = 20 + +[[menu.reference]] +identifier = "specs" +name = "Specifications & Planning" +weight = 6 +[[menu.reference]] +parent = "specs" +name = "IPFS Whitepaper" +url = "https://github.com/ipfs/ipfs/blob/master/papers/ipfs-cap2pfs/ipfs-p2p-file-system.pdf" +weight = 10 +[[menu.reference]] +parent = "specs" +name = "IPFS Specifications" +url = "https://github.com/ipfs/specs" +weight = 20 +[[menu.reference]] +parent = "specs" +name = "Roadmap to 1.0.0" +url = "https://github.com/ipfs/ipfs/blob/master/ROADMAP-TO-1.0.0.md" +weight = 30 +[[menu.reference]] +parent = "specs" +name = "Implementation Status" +url = "https://github.com/ipfs/ipfs/blob/master/IMPLEMENTATION_STATUS.md" +weight = 40 +[[menu.reference]] +parent = "specs" +name = "RFC List" +title = "“Requests for Changes” (RFC) are proposals for major modifications to protocols, library interfaces, and community processes." +url = "https://github.com/ipfs/rfcs" +weight = 50 + +[[menu.guides]] +identifier = "guides" +name = "Guides" +weight = 3 +[[menu.guides]] +identifier = "examples" +name = "Examples" +weight = 4 +[[menu.guides]] +parent = "guides" +name = "Replicating Large Datasets" +url = "https://github.com/ipfs/archives/tree/master/tutorials/replicating-large-datasets" +[[menu.guides]] +parent = "guides" +name = "Transferring a File" +url = "https://github.com/ipfs/go-ipfs/blob/master/docs/file-transfer.md" +[[menu.guides]] +parent = "examples" +name = "js-ipfs Examples" +url = "https://github.com/ipfs/js-ipfs/tree/master/examples" + +[[menu.community]] +identifier = "applications" +name = "Applications" +weight = 8 +[[menu.community]] +parent = "applications" +name = "IPFS Cluster" +title = "Manage a cluster of IPFS nodes across several machines to pool storage resources." +url = "http://cluster.ipfs.io" +weight = 10 +[[menu.community]] +parent = "applications" +name = "IPFS Desktop" +title = "A cross-platform GUI application for running an IPFS node." +url = "https://github.com/ipfs-shipyard/ipfs-desktop" +weight = 20 +[[menu.community]] +parent = "applications" +name = "IPFS Companion" +title = "A browser extension that makes IPFS resources securly available to web pages." +url = "https://github.com/ipfs-shipyard/ipfs-companion" +weight = 30 +[[menu.community]] +parent = "applications" +name = "IPFS Pack" +title = "Package large data collections into a standard format that works well on IPFS." +url = "https://github.com/ipfs/ipfs-pack" +weight = 40 + +[[menu.community]] +identifier = "community" +name = "Community" +weight = 9 +[[menu.community]] +parent = "community" +name = "Discussion/Support Forum" +url = "https://discuss.ipfs.io/" +weight = 10 +[[menu.community]] +parent = "community" +name = "IRC" +url = "/community/irc/" +weight = 20 +[[menu.community]] +parent = "community" +name = "Research Discussion" +url = "https://github.com/ipfs/notes" +weight = 30 +[[menu.community]] +parent = "community" +name = "Events Calendar" +url = "https://calendar.google.com/calendar/embed?src=ipfs.io_eal36ugu5e75s207gfjcu0ae84@group.calendar.google.com" +weight = 40 +[[menu.community]] +parent = "community" +name = "Community Tools" +url = "https://github.com/ipfs/community/" +weight = 50 +[[menu.community]] +parent = "community" +name = "Project Management" +url = "https://github.com/ipfs/pm/" +weight = 60 +[[menu.community]] +parent = "community" +name = "Blog" +url = "https://ipfs.io/blog/" +weight = 70 +[[menu.community]] +parent = "community" +name = "Youtube" +url = "https://www.youtube.com/channel/UCdjsUXJ3QawK4O5L1kqqsew" +weight = 80 +[[menu.community]] +parent = "community" +name = "Twitter (@IPFSbot)" +url = "https://twitter.com/IPFSbot" +weight = 90 +[[menu.community]] +parent = "community" +name = "Awesome IPFS" +url = "https://github.com/ipfs/awesome-ipfs" +[[menu.community]] +parent = "community" +name = "Public Archives on IPFS" +title = "A community project to host archives of valuable public data." +url = "https://archives.ipfs.io" +[[menu.community]] +parent="community" +name = "FAQ" +url = "https://discuss.ipfs.io/c/help/Old-FAQ" + +[[menu.community]] +identifier = "contribute" +name = "Get Involved" +weight = 10 +[[menu.community]] +parent = "contribute" +name = "GitHub" +url = "https://github.com/ipfs/ipfs" +weight = 5 +[[menu.community]] +parent = "contribute" +name = "Contribution Guidelines" +url = "https://github.com/ipfs/community/blob/master/contributing.md" +weight = 10 +[[menu.community]] +parent = "contribute" +name = "Contribution Guidelines 2" +url = "https://github.com/ipfs/community/blob/master/CONTRIBUTING-2.md" +weight = 20 +[[menu.community]] +parent = "contribute" +name = "Code of Conduct" +url = "https://github.com/ipfs/community/blob/master/code-of-conduct.md" +weight = 30 +[[menu.community]] +parent = "contribute" +name = "Go Style Guide" +url = "https://github.com/ipfs/community/blob/master/go-code-guidelines.md" +weight = 40 +[[menu.community]] +parent = "contribute" +name = "JS Style Guide" +url = "https://github.com/ipfs/community/blob/master/js-code-guidelines.md" +weight = 50 + +[[menu.community]] +identifier = "related" +name = "Related Projects" +[[menu.community]] +parent = "related" +name = "Libp2p" +url = "http://libp2p.io" +weight = 1 +[[menu.community]] +parent = "related" +name = "Multiformats" +url = "https://multiformats.io" +weight = 2 +[[menu.community]] +parent = "related" +name = "IPLD" +url = "https://ipld.io" +weight = 3 diff --git a/content/_index.md b/content/_index.md index 33715e3..4ca93d7 100644 --- a/content/_index.md +++ b/content/_index.md @@ -3,25 +3,62 @@ type: index title: IPFS Documentation --- -## Code +Welcome to the IPFS documentation portal! Whether you’re just learning about IPFS or are looking for detailed reference information, this is the place to start. You might have noticed that IPFS is a project with a big scope — and a *lot* of different tools, sites, and code. -These are links to some of the IPFS repositories. +## Introduction + +Head over to the [introduction](/introduction) section for an introduction to the basics of IPFS and a guide to getting up and running. + + +## Guides + +The guides section has an overview of major concepts in IPFS, guides, and example projects demonstrating various ways to use IPFS. + +In particular, IPFS is a complex system that aims to change a lot of things about how we use the internet, so it naturally comes with a lot of new concepts. Check the [concepts](/guides/concepts) section to learn more about the major architectural pieces of IPFS and about terms and ideas associated with distributed filesystes. + + +## Reference + +### Commands & API + +If you are using IPFS via the [command line](/reference/api/cli) or [interacting with a running IPFS node](/reference/api/http) programmatically, you’ll use IPFS’s commands API. It’s implemented in both the Go and JavaScript versions of IPFS. + + +### Go & JavaScript Implementations + +IPFS is fundamentally a set of protocols for communicating about a distributed system of files, but those protocols are informed by reference implementations in both [Go](/reference/go/overview) and [JavaScript](/reference/js/overview). The Go implemntation is more mature and implements more of the IPFS protocols, but the JS implementation can be used in a broader variety of requirements (including in web browsers). + + +### Specifications & Planning + +While IPFS has two reference implementations (in Go and JavaScript), it is fundamentally a set of protocols for formatting and communicating about distributed filesystems. You can find specifications for those protocols, whitepapers, and information about our RFC (Request for Change) process in the “specifications & planning” section. -- ipfs/go-ipfs - IPFS for raw performance and large datasets -- ipfs/js-ipfs - IPFS for decentralized web applications -- ipfs-shipyard/ipfs-companion - IPFS browser extension -- ipfs-shipyard/ipfs-desktop - IPFS desktop app -- ipfs/specs - Technical specs for IPFS -- ipfs/ipfs - Project overview ## Community -- [discuss.ipfs.io](https://discuss.ipfs.io) - Forum for IPFS discussions and support (recommended) -- [#ipfs on freenode IRC](https://riot.im/app/#/room/#ipfs:matrix.org) - Chat room focused on IPFS ([publicly logged](https://botbot.me/freenode/ipfs/)) -- [ipfs-users@groups.google.com](https://groups.google.com/forum/#!forum/ipfs-users) - Mailing list focused on IPFS -- ipfs/awesome-ipfs - Tools and applications built on IPFS -- ipfs/archives - Dataset archival with IPFS -- ipfs/community - Community management and how we work together -- ipfs/pm - IPFS weekly meetings, planning, and project management -- ipfs/in-web-browsers - IPFS in web browsers working group -- ipfs/ipfs - Project overview +Get in touch with other members of the IPFS community who are building tools on top of IPFS or even helping to build IPFS itself! You can ask questions, discuss new ideas, or get support for problems at https://discuss.ipfs.io, but you can also [hop on IRC](/community/irc) for a quick chat. + +See the other links in the community section for more information about meetings, events, apps people are building, and more. + +Information about contributing to IPFS and about other software projects in the community are also hosted here. + + +### Applications + +Both the Go and JavaScript implementations of IPFS are written to function as libraries and command-line applications with relatively restricted functionality. We are working on a variety of other applications that make use of IPFS, like GUI applications, browser extensions, and clustering tools for managing large data archives. You can find more about them here. + + +### Get Involved + +IPFS is an open-source community project. While [Protocol Labs](https://protocol.ai) is able to sponsor some of the work around it, much of the design, code, and effort is contributed by volunteers and community members like you. If you’re interested in helping improve IPFS, check the [how to help](/community/contribute/how_to_help) guide to get started. + +If you are diving in to contribute new code, make sure you check both the [contribution guidelines] and the style guide for your language ([Go](https://github.com/ipfs/community/blob/master/go-code-guidelines.md), [JavaScript](https://github.com/ipfs/community/blob/master/js-code-guidelines.md)). + + +### Related Projects + +We’ve split out some of the major parts of IPFS into separate projects over time — while they’re still critical components of IPFS, they can be useful in a variety of other contexts, too. Check their individual sites for specific information and references: + +- [Libp2p](https://libp2p.io) manages all the peer-to-peer networking parts of IFPS. +- [Multiformats](https://multiformats.io) is a variety of *self-describing* data formats. +- [IPLD](https://ipld.io) is a set of tools for describing links between content-addressed data, like IPFS files, Git commits, or Ethereum blocks. diff --git a/content/start/_index.md b/content/community/_index.md similarity index 59% rename from content/start/_index.md rename to content/community/_index.md index dacb856..1aa2470 100644 --- a/content/start/_index.md +++ b/content/community/_index.md @@ -1,5 +1,5 @@ --- -title: "Getting started" +title: "Community" headless: true opened: true --- diff --git a/content/community/contribute/_index.md b/content/community/contribute/_index.md new file mode 100644 index 0000000..8819740 --- /dev/null +++ b/content/community/contribute/_index.md @@ -0,0 +1,5 @@ +--- +title: "Get Involved" +headless: true +opened: true +--- diff --git a/content/community/contribute/how_to_help.md b/content/community/contribute/how_to_help.md new file mode 100644 index 0000000..5be1fb2 --- /dev/null +++ b/content/community/contribute/how_to_help.md @@ -0,0 +1,151 @@ +--- +title: "How to Help" +menu: + community: + parent: contribute + weight: 1 +--- + +So you want to contribute to IPFS and the ecosystem? Here is a quick listing +of things we need help with and how you can get started. Even if what you want +to do is not listed here, we probably accept contributions for it! If you're +unsure, please open a issue. + + +## Areas of contribution + +- [Code](#code) +- [Documentation](#documentation) +- [Support](#support) +- [Testing](#testing) +- [Design](#design) +- [Issues / Triaging](#issues-triaging) +- [Community](#community) +- [Applications](#applications) +- [Protocol Design](#protocol-design) +- [Research](#research) + + +### Code + +IPFS and its sister-projects are *big,* with lots of code written in +multiple languages. We always need help writing and maintaining code, but it +can be daunting to just jump in. We use the label **“Help Wanted”** on features +or bugfixes that people can help out with. They are an excellent place for you +to start contributing code. + +The biggest and most active repositories we have today are: + +- https://github.com/ipfs/go-ipfs +- https://github.com/ipfs/js-ipfs +- https://github.com/libp2p/go-libp2p +- https://github.com/libp2p/js-libp2p + +If you want to start contributing to the core of IPFS, those repositories are +a great place start. But the “Help Wanted” label exists in all of our +repositories across the Github organizations +[IPFS](https://github.com/ipfs), +[libp2p](https://github.com/libp2p), +[IPLD](https://github.com/libp2p), and +[Multiformats](https://github.com/multiformats). + + +### Documentation + +Again, IPFS is a huge project and undertaking. With lots of code comes the need +for lots of good documentation! However, we need a lot more help to write the +awesome docs the project needs. If writing technical documentation is your area, +we’d absolutely love your help! + +The best place to get started is by looking through the Github Issues at: +https://github.com/ipfs/docs + + +### Support + +IPFS already has lots of users and curious people experimenting and using +IPFS in their applications. These users sometimes get stuck or have questions +that need answering. If you’ve contributed something with code or documentation, +chances are that you can probably help a lot of people with their questions. + +We do most support via the forum we have at: https://discuss.ipfs.io/ + + +### Testing + +We’re continously improving IPFS every day, but mistakes can happen and we +could release something that doesn’t work as well as it should — or simply doesn't +work at all! If you like to dig into edge-cases or write testing scenarios, +wrangling our testing infrastructure could be the job for you. + +We work on CI tools at https://github.com/ipfs/jenkins +and plan larger scale tests at https://github.com/ipfs/kubernetes-ipfs + + +### Design + +There are no full-time designers working on IPFS and its sister-projects, but +there are many small places throughout all our projects that could use your +design love. + +**We currently don't have a single place for this. If you'd like to start it, please let us know** + + +### Issues / Triaging + +With lots of code come lots of Github Issues. We need YOU to help with +organizing all of this in some manner. We don’t yet have any proper resources +for getting started with this. Get in touch if you can contribute a sense of +extreme organization! + +**We currently don't have a single place for this. If you'd like to start it, please let us know** + + +### Community + +If interacting with people is your favorite thing to do in this world, IPFS and +co. are always happy to help you organize events and/or workshops to teach IPFS. + +We have a repository (https://github.com/ipfs/community) for organizing +community events and would love your help to have meetups in more locations or +make the existing ones more regular. + + +### Applications + +IPFS is designed for others to build applications around it! Building +applications and services using IPFS is an excellent way to find use cases +where IPFS doesn’t yet do a perfect job or uncover bugs and inefficiences. + +Get started by looking at our awesome-ipfs list. Build anything you think is +missing! If you're unsure about something, please create an issue to get help +or feedback on your specific problem/idea. + +- https://github.com/ipfs/awesome-ipfs +- https://github.com/ipfs/notes +- https://github.com/ipfs/apps +- https://discuss.ipfs.io/ + + +### Protocol Design + +IPFS is ultimately about building better protocols, and we always welcome ideas +and feedback on how to improve those protocols. Post feedback, issues, and +proposals in the `specs` projects in our Github organizations or in +[`ipfs/notes`](https://github.com/notes). + +- https://github.com/ipfs/specs +- https://github.com/libp2p/specs +- https://github.com/ipld/specs +- https://github.com/multiformats/specs +- https://github.com/ipfs/notes + + +### Research + +Finally, we see Protocol Labs as a research lab, where YOUR ideas can become +technologies that have a real impact on the world. If you're interested in +contributing to our research, please reach out to research@ipfs.io or +research@protocol.ai for more information. Include what your interests are so +we can make sure you get to work on something fun and valuable. + diff --git a/content/community/irc.md b/content/community/irc.md new file mode 100644 index 0000000..9f1aecd --- /dev/null +++ b/content/community/irc.md @@ -0,0 +1,28 @@ +--- +title: "IRC" +--- + +There are several IRC channels on Freenode dedicated to IPFS, and it’s a great place for live chat: + +- Use [#ipfs on irc.freenode.org](irc://irc.freenode.org/%23ipfs) for general IPFS usage and community chat. +- Use [#ipfs-dev on irc.freenode.org](irc://irc.freenode.org/%23ipfs-dev) for discussing implementation details, especially if you are contributing code to IPFS. + +For longer-lived discussions and for support, please use the discussion forums at https://discuss.ipfs.io instead of IRC! It’s easy for complex discussions to get lost in a sea of new messages on IRC. + +--- + +If you’re new to IRC, there are *lots* of mobile and desktop clients for working with it. Here are a few to get you started: + +- [IRCCloud][irccloud] on the web and desktop +- [Textual][textual] or [Adium][adium] on Mac OS X +- [mIRC][mirc] or [HexChat][hexchat] on Windows +- [XChat][xchat] or [Irssi][irssi] on Linux + + +[adium]: https://adium.im +[hexchat]: https://hexchat.github.io +[irccloud]: https://irccloud.com +[irssi]: https://irssi.org +[mirc]: http://standaloneinstaller.com/download-mirc +[textual]: https://www.codeux.com/textual/ +[xchat]: http://xchat.org diff --git a/content/guides/_index.md b/content/guides/_index.md new file mode 100644 index 0000000..e69de29 diff --git a/content/guides/concepts/_index.md b/content/guides/concepts/_index.md new file mode 100644 index 0000000..fa48b57 --- /dev/null +++ b/content/guides/concepts/_index.md @@ -0,0 +1,7 @@ +--- +title: "Concepts" +menu: + guides: + identifier: concepts + weight: 2 +--- diff --git a/content/guides/concepts/cid.md b/content/guides/concepts/cid.md new file mode 100644 index 0000000..748351c --- /dev/null +++ b/content/guides/concepts/cid.md @@ -0,0 +1,22 @@ +--- +title: "Content Identifiers (CIDs)" +menu: + guides: + parent: concepts +--- + +A *content identifier* is a value that addresses a single piece of content in IPFS. It is mainly a cryptographic hash of the content, but is encoded as a [multihash](https://github.com/multiformats/multihash) and [multicodec](https://github.com/multiformats/multicodec). (Note: older CIDs have a different design — see [version 0](#version-0) below.) + + + +You can read up on the details in the [CID spec](https://github.com/ipld/cid). You might also want to check out the [CID inspector](http://cid-utils.ipfs.team/#zb2rhiVd5G2DSpnbYtty8NhYHeDvNkPxjSqA7YbDPuhdihj9L) for an interactive breakdown of CIDs. + +## Version 1 + +Version 1 is the latest version of CID. It is used by default for `files` ([MFS](/concepts/mfs)) and `object` operations. + +## Version 0 + +When IPFS was first designed, we used base 58-encoded multihashes as the content identifiers. (This is simpler, but much less flexible than newer CIDs.) It is still used by default when adding files and blocks to IPFS, so you should generally try to support them. + +The CID specification includes a [decoding algorithm](https://github.com/ipld/cid/blob/ef1b2002394b15b1e6c26c30545fd485f2c4c138/README.md#decoding-algorithm) you can use to distinguish CID v0 from newer versions. diff --git a/content/guides/concepts/dnslink.md b/content/guides/concepts/dnslink.md new file mode 100644 index 0000000..18feafa --- /dev/null +++ b/content/guides/concepts/dnslink.md @@ -0,0 +1,45 @@ +--- +title: "DNSLink" +menu: + guides: + parent: concepts +--- + +DNSLink uses DNS records to map a domain name (like `ipfs.io`) to an IPFS address. Because you can edit your DNS records, you can use them to always point to the latest version of an object in IPFS (remember that an IPFS object’s address changes if you modify the object). Because DNSLink uses DNS records, the names it produces are also usually easy to type and read. + +A DNSLink address looks like an [IPNS](/concepts/ipns) address, but it uses a domain name in place of a hashed public key: + +``` +/ipns/ipfs.io +``` + +Just like normal IPFS addresses, they can include links to other files: + +``` +/ipns/ipfs.io/media/ +``` + +When an IPFS client or node attempts to resolve that address, it looks for a `TXT` record for `ipfs.io` with content like: + +``` +dnslink=/ipfs/ +``` + +For example, if you look up ipfs.io’s DNS records, you’ll see its DNSLink entry (see “answer section” at the bottom): + +``` +$ dig +noall +answer TXT ipfs.io +ipfs.io. 59 IN TXT "dnslink=/ipfs/QmYNQJoKGNHTpPxCBPh9KkDpaExgd2duMa3aF6ytMpHdao" +``` + +Based on that, this address: + +``` +/ipns/ipfs.io/media/ +``` + +Will get you this block: + +``` +/ipfs/QmYNQJoKGNHTpPxCBPh9KkDpaExgd2duMa3aF6ytMpHdao/media/ +``` diff --git a/content/guides/concepts/ipns.md b/content/guides/concepts/ipns.md new file mode 100644 index 0000000..9c9c5bb --- /dev/null +++ b/content/guides/concepts/ipns.md @@ -0,0 +1,20 @@ +--- +title: "IPNS" +menu: + guides: + parent: concepts +--- + +Inter-Planetary Name System (IPNS) is a system for creating and updating mutable links to IPFS content. Since objects in IPFS are content-addressed, their address changes every time their content does. That’s useful for a variety of things, but it makes it hard to get the latest version of something. + +A name in IPNS is the hash of a public key. It is associated with a record containing information about the hash it links to that is signed by the corresponding private key. New records can be signed and published at any time. + +When looking up an IPNS address, use the `/ipns/` prefix: + +``` +/ipns/QmSrPmbaUKA3ZodhzPWZnpFgcPMFWF4QsxXbkWfEptTBJd +``` + + + +IPNS is not the only to create mutable addresses on IPFS. You can also use [DNSLink](/concepts/dnslink) (which is currently much faster than IPNS and also uses more readable names). Other community members are exploring ways to use blockchains to store common name records. diff --git a/content/guides/concepts/mfs.md b/content/guides/concepts/mfs.md new file mode 100644 index 0000000..f2c0ce4 --- /dev/null +++ b/content/guides/concepts/mfs.md @@ -0,0 +1,16 @@ +--- +title: "Mutable File System (MFS)" +menu: + guides: + parent: concepts +--- + +Because files in IPFS are content-addressed and immutable, they can be complicated to edit. Mutable File System (MFS) is a tool built into IPFS that lets you treat files like you would a normal name-based filesystem — you can add, remove, move, and edit MFS files and have all the work of updating links and hashes taken care of for you. + +MFS is accessed through the [`files`](/api/cli/#ipfs-files) commands in the IPFS CLI and API. + + + +This video also provides a good overview of MFS: + +{{< youtube FX_AXNDsZ9k >}} diff --git a/content/guides/concepts/unixfs.md b/content/guides/concepts/unixfs.md new file mode 100644 index 0000000..f9ea4bd --- /dev/null +++ b/content/guides/concepts/unixfs.md @@ -0,0 +1,14 @@ +--- +title: "UnixFS" +menu: + guides: + parent: concepts +--- + +A file in IPFS isn’t just content. It might be too big to fit in a single block, so it needs metadata to link all its blocks together. It might be a symlink or a directory, so it needs metadata to link to other files. UnixFS is the data format used to represent files and all their links and metadata in IPFS, and is loosely based on how files work in Unix. When you add a *file* to IPFS, you are creating a block (or a tree of blocks) in the UnixFS format. + +UnixFS is a [protocol-buffers](https://developers.google.com/protocol-buffers/)-based format. You can find the definitions for it at: https://github.com/ipfs/go-ipfs/blob/master/unixfs/pb/unixfs.proto. + + + +*Note: we are currently designing an updated version of UnixFS that will be [IPLD](https://ipld.io)-compatible. You can follow along or participate [on GitHub](https://github.com/ipfs/unixfs-v2).* diff --git a/content/guides/examples.md b/content/guides/examples.md new file mode 100644 index 0000000..f2d5e2e --- /dev/null +++ b/content/guides/examples.md @@ -0,0 +1,65 @@ +--- +title: Basic Examples +menu: + guides: + parent: examples + weight: 2 +--- + +These are a few examples that cover various ways to use IPFS. They are viewed through an IPFS-hosted renderer. + +- [Dags and Objects and Blocks! (oh my)]( + https://ipfs.io/docs/examples/example-viewer/example#../data/readme.md +) +- [Be the swarm]( + https://ipfs.io/docs/examples/example-viewer/example#../network/readme.md +) +- [Pinning]( + https://ipfs.io/docs/examples/example-viewer/example#../pinning/readme.md +) +- [Roll your own ipfs!]( + https://ipfs.io/docs/examples/example-viewer/example#../api/service/readme.md +) +- [Trivial snapshots with ipfs]( + https://ipfs.io/docs/examples/example-viewer/example#../snapshots/readme.md +) +- [The Inter-Planetary Naming System]( + https://ipfs.io/docs/examples/example-viewer/example#../ipns/readme.md +) +- [Modifying the bootstrap peers list]( + https://ipfs.io/docs/examples/example-viewer/example#../bootstrap/readme.md +) +- [Configuring your node]( + https://ipfs.io/docs/examples/example-viewer/example#../config/readme.md +) +- [Adding and Playing Videos]( + https://ipfs.io/docs/examples/example-viewer/example#../videos/readme.md +) +- [Visualizing objects with graphmd]( + https://ipfs.io/docs/examples/example-viewer/example#../graphmd/README.md +) +- [Git, even more distributed]( + https://ipfs.io/docs/examples/example-viewer/example#../git/readme.md +) +- [IPFS for websites]( + https://ipfs.io/docs/examples/example-viewer/example#../websites/README.md +) + +## Simple JS Apps + +These are trivial little JS "apps" deployed through IPFS. +They are simple utilities that demonstrate how one might +build js applications and deploy them through IPFS. + +- [the example viewer](https://github.com/ipfs/website/tree/master/content/docs/examples/example-viewer) - [example]( + https://ipfs.io/docs/examples/example-viewer/example#./home/readme.md +) +- [a markdown renderer](https://github.com/ipfs/website/tree/master/content/docs/examples/markdown-viewer) - [example]( + https://ipfs.io/docs/examples/markdown-viewer/mdown#./sample.md +) +- [a js video player](https://github.com/ipfs/website/tree/master/content/docs/examples/play) - [example]( + https://ipfs.io/docs/examples/play/play#/ipfs/QmTKZgRNwDNZwHtJSjCp6r5FYefzpULfy37JvMt9DwvXse +) +- [a qr-code renderer](https://github.com/ipfs/website/tree/master/content/docs/examples/qr-render) - [example]( + https://ipfs.io/docs/examples/qr-render/qr#enter%20text%20here +) diff --git a/content/guides/viewer/api/demoapp/demo.go b/content/guides/viewer/api/demoapp/demo.go new file mode 100644 index 0000000..2b18a05 --- /dev/null +++ b/content/guides/viewer/api/demoapp/demo.go @@ -0,0 +1,62 @@ +package main + +import ( + "bufio" + "fmt" + "io" + "os" + + "github.com/ipfs/go-ipfs/core" + "github.com/ipfs/go-ipfs/core/coreunix" + "github.com/ipfs/go-ipfs/repo/fsrepo" + "golang.org/x/net/context" +) + +func CountChars(r io.Reader) map[byte]int { + m := make(map[byte]int) + buf := bufio.NewReader(r) + for { + b, err := buf.ReadByte() + if err != nil { + return m + } + m[b]++ + } +} + +func SetupIpfs() (*core.IpfsNode, error) { + // Assume the user has run 'ipfs init' + r, err := fsrepo.Open("~/.ipfs") + if err != nil { + return nil, err + } + + cfg := &core.BuildCfg{ + Repo: r, + Online: true, + } + + return core.NewNode(context.Background(), cfg) +} + +func main() { + nd, err := SetupIpfs() + if err != nil { + fmt.Println(err) + return + } + + if len(os.Args) < 2 { + fmt.Println("Please pass in an argument!") + return + } + keytofetch := os.Args[1] + + read, err := coreunix.Cat(context.Background(), nd, keytofetch) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println(CountChars(read)) +} diff --git a/content/guides/viewer/api/demoapp/readme.md b/content/guides/viewer/api/demoapp/readme.md new file mode 100644 index 0000000..bf45902 --- /dev/null +++ b/content/guides/viewer/api/demoapp/readme.md @@ -0,0 +1,98 @@ +## Ipfs Demo Application +Lets take a look at making an application that uses ipfs. Lets say that our +fictional application needs to read in a file, and count all the letters in +it. But, being tech savvy as we are, we want the program to be able to take the +files in from ipfs, so that users from around the world need only send them a +hash in order for their files to be processed! + +To Start off, lets get some imports: +``` +package main + +import ( + "bufio" + "fmt" + "io" + "os" + + "code.google.com/p/go.net/context" + "github.com/ipfs/go-ipfs/core" + "github.com/ipfs/go-ipfs/core/coreunix" + "github.com/ipfs/go-ipfs/repo/fsrepo" +) +``` + + +Now, lets make a quick function to do a frequency count on characters: + +``` +func CountChars(r io.Reader) map[byte]int { + m := make(map[byte]int) + buf := bufio.NewReader(r) + for { + b, err := buf.ReadByte() + if err != nil { + return m + } + m[b]++ + } +} +``` + +Alright, now for the ipfs goodness: + +``` +func SetupIpfs() (*core.IpfsNode, error) { + // Assume the user has run 'ipfs init' + r, err := fsrepo.Open("~/.ipfs") + if err != nil { + return nil, err + } + + cfg := &core.BuildCfg{ + Repo: r, + Online: true, + } + + cfg := new(core.BuildCfg) + cfg.Repo = r + cfg.Online = true + + return core.NewNode(context.Background(), cfg) +} +``` + +We've got our node construction out of the way now, lets move on to actually +doing something. + +``` +func main() { + nd, err := SetupIpfs() + if err != nil { + fmt.Println(err) + return + } + + if len(os.Args) < 2 { + fmt.Println("Please pass in an argument!") + return + } + keytofetch := os.Args[1] + + read, err := coreunix.Cat(nd, keytofetch) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println(CountChars(read)) +} +``` + +And thats it, the user passes in a file, and we read it from ipfs. If no such +file exists, we will error out from the `Cat` method. `Cat` returns a reader +that will manage retrieving the file specified by the given hash, whether its +stored locally on disk or if its pieces are split apart on multiple different +machines across the planet. + +By [whyrusleeping](http://github.com/whyrusleeping) diff --git a/content/guides/viewer/api/randobj/randobj.go b/content/guides/viewer/api/randobj/randobj.go new file mode 100644 index 0000000..fc065cf --- /dev/null +++ b/content/guides/viewer/api/randobj/randobj.go @@ -0,0 +1,53 @@ +package main + +import ( + "context" + "io" + "net/http" + + u "github.com/ipfs/go-ipfs-util" + "github.com/ipfs/go-ipfs/core" + "github.com/ipfs/go-ipfs/core/coreunix" + "github.com/ipfs/go-ipfs/repo/fsrepo" +) + +var gnode *core.IpfsNode + +func ServeIpfsRand(w http.ResponseWriter, r *http.Request) { + read := io.LimitReader(u.NewTimeSeededRand(), 2048) + + str, err := coreunix.Add(gnode, read) + if err != nil { + w.WriteHeader(504) + w.Write([]byte(err.Error())) + } else { + w.Write([]byte(str)) + } +} + +func main() { + r, err := fsrepo.Open("~/.ipfs") + if err != nil { + panic(err) + } + + // Make our 'master' context and defer cancelling it + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + cfg := &core.BuildCfg{ + Repo: r, + Online: true, + } + + node, err := core.NewNode(ctx, cfg) + if err != nil { + panic(err) + } + + // Set the global node for access in the handler + gnode = node + + http.HandleFunc("/ipfsobject", ServeIpfsRand) + http.ListenAndServe(":8080", nil) +} diff --git a/content/guides/viewer/api/randobj/readme.md b/content/guides/viewer/api/randobj/readme.md new file mode 100644 index 0000000..d5912e8 --- /dev/null +++ b/content/guides/viewer/api/randobj/readme.md @@ -0,0 +1,87 @@ +## Random Ipfs Objects +During the development, ive frequently found the need to just get a hash of some +random ipfs object. At first, I would just ask in irc "can someone give me a +hash?". But I decided I could do better, So I decided to make it a service. In +this article, im going to go over how I did that (hint: its really simple!) + +First, lets get some imports: +``` +package main + +import ( + "context" + "io" + "net/http" + + u "github.com/ipfs/go-ipfs-util" + "github.com/ipfs/go-ipfs/core" + "github.com/ipfs/go-ipfs/core/coreunix" + "github.com/ipfs/go-ipfs/repo/fsrepo" +) +``` + +This just pulls in some basic ipfs packages, and the default golang http server. +Now, since im lazy, im going to have a global for our ipfsnode. + +``` +var gnode *core.IpfsNode +``` + +Now, lets write the http handler func for generating our random objects. + +``` +func ServeIpfsRand(w http.ResponseWriter, r *http.Request) { + read := io.LimitReader(u.NewTimeSeededRand(), 2048) + + str, err := coreunix.Add(gnode, read) + if err != nil { + w.WriteHeader(504) + w.Write([]byte(err.Error())) + } else { + w.Write([]byte(str)) + } +} +``` + +And now, lets tie it all together in a main function. + +Set up our node configuration, and use the users standard ipfs configuration directory. + +``` +func main() { + r, err := fsrepo.Open("~/.ipfs") + if err != nil { + panic(err) + } +``` + +Now we need to set up our context + +``` + // Make our 'master' context and defer cancelling it + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() +``` + +Then create a configuration and finally create our node! + +``` + cfg := &core.BuildCfg{ + Repo: r, + Online: true, + } + + node, err := core.NewNode(ctx, cfg) + if err != nil { + panic(err) + } + + // Set the global node for access in the handler + gnode = node + + http.HandleFunc("/ipfsobject", ServeIpfsRand) + http.ListenAndServe(":8080", nil) +} +``` + +By [whyrusleeping](http://github.com/whyrusleeping) diff --git a/content/guides/viewer/api/readme.md b/content/guides/viewer/api/readme.md new file mode 100644 index 0000000..dfd8f0b --- /dev/null +++ b/content/guides/viewer/api/readme.md @@ -0,0 +1,70 @@ +## Basic API usage +using ipfs within your code is really quite simple! + +At its simplest, you only need to create a node: +``` +import "github.com/ipfs/go-ipfs/core" +. +. +// setup ctx +// setup cfg +. + +node, err := core.NewNode(ctx, cfg) +``` + +The above code snippet is the simplest way to create an ipfs node. Below is explained how to get the context and the configuration objects in place. + +### Configuration +Lets create a Node's build configuration: + +``` +cfg := &core.BuildCfg{ + Repo: r, + Online: true, + Routing: myRoutingOption, +} +``` + +A node created in 'Online' mode will start up bootstrapping, bitswap exchange, +and other network interfaces. + +#### Repo +The ipfs 'repo' or repository represents all data that persists past a single +instance. This currently includes the configuration file and the local +datastore. By default, you will be given a blank config and an in memory +datastore. To set your own, call `SetRepo` with your own repo object. +The normal way to go about doing this is with an `FSRepo`, which represents +an on disk 'repository'. This looks a bit like: +``` +import "github.com/ipfs/go-ipfs/repo/fsrepo" +. +. +. +r := fsrepo.Open("/path/to/.ipfs") +if err != nil { + // Deal with the error +} +``` + +#### SetRouting +ipfs by default will use our DHT network for getting provider information and +ipns entries. If you wish to implement a separate routing system for your node +to get this information through, just make an object that implements the +IpfsRouting interface and pass the build configuration a RoutingOption for it. + +### Context +If you have never dealt with contexts before, I highly recommend you first go read +[this wonderful explanation](https://blog.golang.org/context). Now, the context +we pass into the new `Node` we are creating is the "master" context to the entire +ipfs node, cancelling that context will shut down every single subprocess that ipfs +runs. + +The easiest way to set up a context for an ipfs node is something like this: +``` +ctx, cancel := context.WithCancel(context.Background) +``` +This creates a context, and an anonymous function that can be called to cancel +the context, and by extension, all of the ipfs node. + + diff --git a/content/guides/viewer/api/service/client.go b/content/guides/viewer/api/service/client.go new file mode 100644 index 0000000..57b7b51 --- /dev/null +++ b/content/guides/viewer/api/service/client.go @@ -0,0 +1,57 @@ +package main + +import ( + "fmt" + "io" + "os" + + core "github.com/ipfs/go-ipfs/core" + corenet "github.com/ipfs/go-ipfs/core/corenet" + // If this import breaks, have a look at the go-ipfs repository what they use + // instead: `cd && grep '\ +``` + +It should print out `Hello! This is whyrusleepings awesome ipfs service` + +Now, you might be asking yourself: "Why would I use this? How is it better than +the `net` package?". Well, here are the advantages: + +1. You dial a specific peerID, no matter what their IP address happens to be at the moment. +2. You take advantage of the NAT traversal built into our net package. +3. Instead of a 'port' number, you get a much more meaningful protocol ID string. + +By [whyrusleeping](http://github.com/whyrusleeping) diff --git a/content/guides/viewer/blocks.md b/content/guides/viewer/blocks.md new file mode 100644 index 0000000..c82f837 --- /dev/null +++ b/content/guides/viewer/blocks.md @@ -0,0 +1,72 @@ +--- +title: Dealing with Blocks +draft: true +menu: + guides: + parent: guides +--- + +The `ipfs add` command will create a Merkle DAG out of the data in the files you +specify. It follows the [unixfs data format](https://github.com/ipfs/go-ipfs/blob/master/unixfs/pb/unixfs.proto) when doing this. This means +that your files are broken down into blocks, and then arranged in a tree-like +structure using 'link nodes' to tie them together. A given file's 'hash' is +actually the hash of the root (uppermost) node in the DAG. For a given DAG, you +can easily view the sub-blocks under it with `ipfs ls`. + +For example: +``` +# ensure this file is larger than 256k +ipfs add alargefile +ipfs ls thathash +``` + +The above command should print out something like: +``` +ipfs@earth ~> ipfs ls qms2hjwx8qejwm4nmwu7ze6ndam2sfums3x6idwz5myzbn +qmv8ndh7ageh9b24zngaextmuhj7aiuw3scc8hkczvjkww 7866189 +qmuvjja4s4cgyqyppozttssquvgcv2n2v8mae3gnkrxmol 7866189 +qmrgjmlhlddhvxuieveuuwkeci4ygx8z7ujunikzpfzjuk 7866189 +qmrolalcquyo5vu5v8bvqmgjcpzow16wukq3s3vrll2tdk 7866189 +qmwk51jygpchgwr3srdnmhyerheqd22qw3vvyamb3emhuw 5244129 +``` + +This shows all of the immediate sub-blocks of your file, as well as the +size of them and their children on the disk. + +### What to do with Blocks? +If you feel adventurous, you can get a lot of different information out of these +different blocks. You can use the sub-block hashes as input to `ipfs cat` to +see only the data in any given sub-tree (the data of that block and its +children). To see just the data of a given block and not its children, use +`ipfs block get`. But be careful, as `ipfs block get` on an intermediate block +will print out the raw binary data of its DAG structure to your screen. + +`ipfs block stat` will tell you the exact size of a given block (without its +children), and `ipfs refs` will tell you all the children of that block. +Similarly, `ipfs ls` or `ipfs object links` will show you all children and +their sizes. `ipfs refs` is a more suitable command for scripting something +to run on each child block of a given object. + +### Blocks vs Objects +In IPFS, a block refers to a single unit of data, identified by its key (hash). +A block can be any sort of data, and does not necessarily have any sort of +format associated with it. An object, on the other hand, refers to a block that +follows the Merkle DAG protobuf data format. It can be parsed and manipulated +via the `ipfs object` command. Any given hash may represent an object or a block. + +### Creating a Block from scratch +Creating your own blocks is easy! Simply put your data in a file and run +`ipfs block put ` on it. Or, you can pipe your filedata into +`ipfs block put`, like so: + +``` +$ echo "This is some data" | ipfs block put +QmfQ5QAjvg4GtA3wg3adpnDJug8ktA1BxurVqBD8rtgVjM +$ ipfs block get QmfQ5QAjvg4GtA3wg3adpnDJug8ktA1BxurVqBD8rtgVjM +This is some data +``` +Note: When making your own block data, you won't be able to read the data with +`ipfs cat`. This is because you are inputting raw data without the unixfs data +format. To read raw blocks, use `ipfs block get` as shown in the example. + +By [whyrusleeping](http://github.com/whyrusleeping) diff --git a/content/guides/viewer/bootstrap.md b/content/guides/viewer/bootstrap.md new file mode 100644 index 0000000..8f1edb7 --- /dev/null +++ b/content/guides/viewer/bootstrap.md @@ -0,0 +1,62 @@ +--- +title: Bootstrap +draft: true +menu: + guides: + parent: guides +--- + +The IPFS bootstrap list is a list of peers with which the IPFS daemon learns about other peers on the network. IPFS comes with a default list of trusted peers, but you are free to modify the list to suit your needs. One popular use for a custom bootstrap list is to create a personal IPFS network. + +First, let's list your node's bootstrap list: + +``` +> ipfs bootstrap list +/ip4/104.131.131.82/tcp/4001/ipfs/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ +/ip4/104.236.151.122/tcp/4001/ipfs/QmSoLju6m7xTh3DuokvT3886QRYqxAzb1kShaanJgW36yx +/ip4/104.236.176.52/tcp/4001/ipfs/QmSoLnSGccFuZQJzRadHn95W2CrSFmZuTdDWP8HXaHca9z +/ip4/104.236.179.241/tcp/4001/ipfs/QmSoLpPVmHKQ4XTPdz8tjDFgdeRFkpV8JgYq8JVJ69RrZm +/ip4/104.236.76.40/tcp/4001/ipfs/QmSoLV4Bbm51jM9C4gDYZQ9Cy3U6aXMJDAbzgu2fzaDs64 +/ip4/128.199.219.111/tcp/4001/ipfs/QmSoLSafTMBsPKadTEgaXctDQVcqN88CNLHXMkTNwMKPnu +/ip4/162.243.248.213/tcp/4001/ipfs/QmSoLueR4xBeUbY9WZ9xGUUxunbKWcrNFTDAadQJmocnWm +/ip4/178.62.158.247/tcp/4001/ipfs/QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd +/ip4/178.62.61.185/tcp/4001/ipfs/QmSoLMeWqB7YGVLJN3pNLQpmmEk35v6wYtsMGLzSr5QBU3 +``` + +The lines listed above are the addresses of the default IPFS bootstrap nodes -- they are run by the IPFS development team. The addresses listed are fully resolved and specified in [multiaddr](https://github.com/jbenet/multiaddr) format, which makes every protocol explicit. This way, your node knows exactly where to reach the bootstrap nodes -- the location is unambiguous. + +Don't change this list unless you understand what it means to do so. Bootstrapping is an important security point of failure in distributed systems: malicious bootstrap peers could only introduce you to other malicious peers. It is recommended to keep the default list provided by the IPFS dev team, or -- in the case of setting up private networks -- a list of nodes you control. Don't add peers to this list that you don't trust. + +Here we add a new peer to the bootstrap list: +``` +> ipfs bootstrap add /ip4/25.196.147.100/tcp/4001/ipfs/QmaMqSwWShsPg2RbredZtoneFjXhim7AQkqbLxib45Lx4S +``` + +Here we remove a node from the bootstrap list: +``` +> ipfs bootstrap rm /ip4/128.199.219.111/tcp/4001/ipfs/QmSoLSafTMBsPKadTEgaXctDQVcqN88CNLHXMkTNwMKPnu +``` + +Let's say we want to create a backup of our new bootstrap list. We can easily do this by redirecting stdout of `ipfs bootstrap list` to a file: +``` +> ipfs bootstrap list >save +``` + +If we ever want to start from scratch, we can delete the entire bootstrap list at once: +``` +> ipfs bootstrap rm --all +``` + +With an empty list, we can restore the default bootstrap list: +``` +> ipfs bootstrap add --default +``` + +Remove the entire bootstrap list again, and restore our saved one by piping the contents of the saved file to `ipfs bootstrap add`: +``` +> ipfs bootstrap rm --all +> cat save | ipfs bootstrap add +``` + + +By [jbenet](http://github.com/jbenet) and [insanity54](http://github.com/insanity54) diff --git a/content/guides/viewer/config.md b/content/guides/viewer/config.md new file mode 100644 index 0000000..dc46945 --- /dev/null +++ b/content/guides/viewer/config.md @@ -0,0 +1,57 @@ +--- +title: Configuring Your Node +draft: true +menu: + guides: + parent: guides +--- + +ipfs is configured through a json formatted text file, located by default at +`~/.ipfs/config`. + +### Addresses +The config file stores a few different address types, all of which use the +multiaddr addressing format. Lets go over what each address type means. + +``` +"Addresses": { + "Swarm": [ + "/ip4/0.0.0.0/tcp/4001" + ], + "API": "/ip4/127.0.0.1/tcp/5001", + "Gateway": "/ip4/127.0.0.1/tcp/8080" + } +``` + +#### Swarm +Swarm addresses are addresses that the local daemon will listen on for +connections from other ipfs peers. You should try to ensure that these +addresses can be dialed from a separate computer and that there are no +firewalls blocking the ports you specify. + +#### API +The API address is the address that the daemon will serve the http API from. +This API is used to control the daemon through the command line, or simply +via curl if youre feeling adventurous. You should ensure that this address +is not dialable from outside of your machine, or other potentially malicious +parties may be able to send commands to your ipfs daemon. + +#### Gateway +The Gateway address is the address that the daemon will serve the gateway +interface from. The gateway may be used to view files through ipfs, and serve +static web content. This port may or may not be dialable from outside of your +machine, thats entirely up to you. The gateway address is optional, if you +leave it blank, the gateway server will not start. + +### Mounts +The mounts config values specifies the default mountpoints for the ipfs and +ipns virtual filesystems, if no other directories are specified by the +`ipfs mount` command. These folders should exist, and have permissions for your +user to be able to mount to them via fuse. + +### Bootstrap +The Bootstrap config array specifies the list of ipfs peers that your daemon +will connect to on startup. The default values for this are the 'ipfs solarnet' +nodes, which are a set of VPS servers distributed around the country. + +By [whyrusleeping](http://github.com/whyrusleeping) diff --git a/content/guides/viewer/git.md b/content/guides/viewer/git.md new file mode 100644 index 0000000..b2f0e91 --- /dev/null +++ b/content/guides/viewer/git.md @@ -0,0 +1,88 @@ +--- +title: Git, Even More Distributed +draft: true +menu: + guides: + parent: guides +--- + +Have you ever said to yourself: "Man, my git server isn't distributed enough" or +"I wish I had an easy way to serve a static git repository worldwide". Well wish +no more, I have the solution for you! + +In this article, I will be discussing how to serve a git repository through the +ipfs network. The end result will be a `git clone`able url served through ipfs! + +To start, select a git repo you want to host, and do a bare clone of it: +``` +$ git clone --bare git@myhost.io/myrepo +``` + +For those who aren't super git savvy, a bare repo means that it doesn't have +a working tree, and can be used as a server. They have a slightly different +format than your normal git repo. + +Now, to get it ready to be cloned, you need to do the following: +``` +$ cd myrepo +$ git update-server-info +``` + +Optionally, you can unpack all of gits objects: +``` +$ cp objects/pack/*.pack . +$ git unpack-objects < ./*.pack +$ rm ./*.pack +``` + +Doing this breaks up gits large packfile into all of its individual objects. +This will allow ipfs to deduplicate objects if you add multiple versions of +this git repository. + +Once youve done that, that repo is ready to be served. All thats left to do, is +to add it to ipfs: +``` +$ pwd +/code/myrepo +$ ipfs add -r . +... +... +... +added QmX679gmfyaRkKMvPA4WGNWXj9PtpvKWGPgtXaF18etC95 . +``` + +Now, all thats left is to try cloning it: +``` +$ cd /tmp +$ git clone http://localhost:8080/ipfs/QmX679gmfyaRkKMvPA4WGNWXj9PtpvKWGPgtXaF18etC95 myrepo +``` + +Note: make sure to change out that hash for yours. + +Now, you may be asking "well what good is a git repo that I can't change anything on?" +Well let me tell you an awesome usecase! I tend to program in a language called Go, +for those who don't know go uses version control paths for its imports, i.e: +```go +import ( + "github.com/whyrusleeping/mycoollibrary" +) +``` + +This is a really nice feature, and solves a lot of problems, but often times, I run into +the issue where im using someones library, and they change the API, and it breaks my code. +Using what we've done above, you could clone the library, and add it into ipfs, so your import +paths will now look something like: +```go +import ( + mylib "gateway.ipfs.io/ipfs/QmX679gmfyaRkKMvPA4WGNWXj9PtpvKWGPgtXaF18etC95" +) +``` + +And you will be guaranteed to have the same code every time! + +Note: Since go doesnt allow the usage of localhost for import paths, we use the +public http gateways. This provides no security guarantees as a man in the +middle attack could ship you bad code. You could use a domain name that redirects +to the localhost instead to avoid the issue. + +By [whyrusleeping](http://github.com/whyrusleeping) diff --git a/content/guides/viewer/graphmd/demo/cat.jpg b/content/guides/viewer/graphmd/demo/cat.jpg new file mode 100644 index 0000000..dc05ab5 Binary files /dev/null and b/content/guides/viewer/graphmd/demo/cat.jpg differ diff --git a/content/guides/viewer/graphmd/demo/test/bar b/content/guides/viewer/graphmd/demo/test/bar new file mode 100644 index 0000000..5716ca5 --- /dev/null +++ b/content/guides/viewer/graphmd/demo/test/bar @@ -0,0 +1 @@ +bar diff --git a/content/guides/viewer/graphmd/demo/test/baz/b b/content/guides/viewer/graphmd/demo/test/baz/b new file mode 100644 index 0000000..5716ca5 --- /dev/null +++ b/content/guides/viewer/graphmd/demo/test/baz/b @@ -0,0 +1 @@ +bar diff --git a/content/guides/viewer/graphmd/demo/test/baz/f b/content/guides/viewer/graphmd/demo/test/baz/f new file mode 100644 index 0000000..257cc56 --- /dev/null +++ b/content/guides/viewer/graphmd/demo/test/baz/f @@ -0,0 +1 @@ +foo diff --git a/content/guides/viewer/graphmd/demo/test/foo b/content/guides/viewer/graphmd/demo/test/foo new file mode 100644 index 0000000..257cc56 --- /dev/null +++ b/content/guides/viewer/graphmd/demo/test/foo @@ -0,0 +1 @@ +foo diff --git a/content/guides/viewer/graphmd/graphmd b/content/guides/viewer/graphmd/graphmd new file mode 100755 index 0000000..7b80b11 --- /dev/null +++ b/content/guides/viewer/graphmd/graphmd @@ -0,0 +1,26 @@ +#!/bin/sh + +if [ "$#" -ne 1 ]; then + echo "usage: $0 ..." + echo "output merkledag links in graphviz dot" + echo "" + echo "use it with dot:" + echo " $0 QmZPAMWUfLD95GsdorXt9hH7aVrarb2SuLDMVVe6gABYmx | dot -Tsvg" + echo " $0 QmZPAMWUfLD95GsdorXt9hH7aVrarb2SuLDMVVe6gABYmx | dot -Tpng" + echo " $0 QmZPAMWUfLD95GsdorXt9hH7aVrarb2SuLDMVVe6gABYmx | dot -Tpdf" + echo "" + exit 1 +fi + +src=' [fontsize=8 shape=box];' +dst=' [fontsize=8 shape=box];' +edge=' -> [label=""];' +fmt="$src +$dst +$edge" + +echo "digraph {" +echo " graph [rankdir=LR];" +ipfs refs -r --format="$fmt" "$@" | awk '{ print "\t" $0 }' +# ipfs refs -r --format="$fmt" "$@" | awk '{ print "\t" $0 }' | unflatten -l3 +echo "}" diff --git a/content/guides/viewer/graphmd/index.md b/content/guides/viewer/graphmd/index.md new file mode 100644 index 0000000..b072b5a --- /dev/null +++ b/content/guides/viewer/graphmd/index.md @@ -0,0 +1,126 @@ +--- +title: Visualizing objects with graphmd +draft: true +menu: + guides: + parent: guides +--- + +![](/ipfs/QmbefthRKDReojALJi8nGPwvUVPqe1aXdoD9ysX44aUfvG/graph.png) + +When using ipfs for storing files, or writing more complex datastructures, +it is often very useful to visualize the merkledag being created. For this, +I wrote a simple tool called `graphmd` (graph merkle dag). + +`graphmd` is a very short shell script ([source](./graphmd)). It uses the +`ipfs refs --format` flag to produce `dot` output. + +## Install graphmd + +`graphmd` will be in its own repo soon, but for now you can install it with: + +``` +ipfs cat Qmcd7Sebd46vxDWjbUERK8w82zp8sgWTtHT5c93kzr2v3M >/usr/local/bin/graphmd +chmod +x /usr/local/bin/graphmd +``` + +## graphmd usage + +``` +> graphmd +usage: graphmd ... +output merkledag links in graphviz dot + +use it with dot: + bin/graphmd QmZPAMWUfLD95GsdorXt9hH7aVrarb2SuLDMVVe6gABYmx | dot -Tsvg + bin/graphmd QmZPAMWUfLD95GsdorXt9hH7aVrarb2SuLDMVVe6gABYmx | dot -Tpng + bin/graphmd QmZPAMWUfLD95GsdorXt9hH7aVrarb2SuLDMVVe6gABYmx | dot -Tpdf +``` + +## Example + +Given this [demo](/ipfs/QmRCJXG7HSmprrYwDrK1GctXHgbV7EYpVcJPQPwevoQuqF) directory: + +```sh +> tree demo +demo +├── cat.jpg +└── test + ├── bar + ├── baz + │   ├── b + │   └── f + └── foo + +2 directories, 5 files +``` + +Add the files to ipfs + +```sh +> ipfs add -r demo +added QmajFHHivh25Qb2cNbnnnEeUe1gDLHX9ta7hs2XKX1vazb demo/cat.jpg +added QmTz3oc4gdpRMKP2sdGUPZTAGRngqjsi99BPoztyP53JMM demo/test/bar +added QmTz3oc4gdpRMKP2sdGUPZTAGRngqjsi99BPoztyP53JMM demo/test/baz/b +added QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6 demo/test/baz/f +added QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt demo/test/baz +added QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6 demo/test/foo +added QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv demo/test +added QmRCJXG7HSmprrYwDrK1GctXHgbV7EYpVcJPQPwevoQuqF demo +``` + +Use `graphmd` to generate the dot output + +```sh +> graphmd QmRCJXG7HSmprrYwDrK1GctXHgbV7EYpVcJPQPwevoQuqF >graph.dot +digraph { + graph [rankdir=LR]; + QmRCJXG7HSmprrYwDrK1GctXHgbV7EYpVcJPQPwevoQuqF [fontsize=8 shape=box]; + QmajFHHivh25Qb2cNbnnnEeUe1gDLHX9ta7hs2XKX1vazb [fontsize=8 shape=box]; + QmRCJXG7HSmprrYwDrK1GctXHgbV7EYpVcJPQPwevoQuqF -> QmajFHHivh25Qb2cNbnnnEeUe1gDLHX9ta7hs2XKX1vazb [label="cat.jpg"]; + QmRCJXG7HSmprrYwDrK1GctXHgbV7EYpVcJPQPwevoQuqF [fontsize=8 shape=box]; + QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv [fontsize=8 shape=box]; + QmRCJXG7HSmprrYwDrK1GctXHgbV7EYpVcJPQPwevoQuqF -> QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv [label="test"]; + QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv [fontsize=8 shape=box]; + QmTz3oc4gdpRMKP2sdGUPZTAGRngqjsi99BPoztyP53JMM [fontsize=8 shape=box]; + QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv -> QmTz3oc4gdpRMKP2sdGUPZTAGRngqjsi99BPoztyP53JMM [label="bar"]; + QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv [fontsize=8 shape=box]; + QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt [fontsize=8 shape=box]; + QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv -> QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt [label="baz"]; + QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt [fontsize=8 shape=box]; + QmTz3oc4gdpRMKP2sdGUPZTAGRngqjsi99BPoztyP53JMM [fontsize=8 shape=box]; + QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt -> QmTz3oc4gdpRMKP2sdGUPZTAGRngqjsi99BPoztyP53JMM [label="b"]; + QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt [fontsize=8 shape=box]; + QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6 [fontsize=8 shape=box]; + QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt -> QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6 [label="f"]; + QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv [fontsize=8 shape=box]; + QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6 [fontsize=8 shape=box]; + QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv -> QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6 [label="foo"]; +} +``` + +Pipe it to `dot` to produce `svg`, `pdf`, `png` or [whatever](http://www.graphviz.org/Documentation/dotguide.pdf) + +``` +graphmd QmRCJXG7HSmprrYwDrK1GctXHgbV7EYpVcJPQPwevoQuqF | dot -Tsvg >output/graph.svg +graphmd QmRCJXG7HSmprrYwDrK1GctXHgbV7EYpVcJPQPwevoQuqF | dot -Tpdf >output/graph.pdf +graphmd QmRCJXG7HSmprrYwDrK1GctXHgbV7EYpVcJPQPwevoQuqF | dot -Tpng >output/graph.png +``` + +Et voilà: [svg](/ipfs/QmbefthRKDReojALJi8nGPwvUVPqe1aXdoD9ysX44aUfvG/graph.svg), [pdf](/ipfs/QmbefthRKDReojALJi8nGPwvUVPqe1aXdoD9ysX44aUfvG/graph.pdf), [png](/ipfs/QmbefthRKDReojALJi8nGPwvUVPqe1aXdoD9ysX44aUfvG/graph.png) + +![](/ipfs/QmbefthRKDReojALJi8nGPwvUVPqe1aXdoD9ysX44aUfvG/graph.png) + +## File blocks + +`graphmd` is particularly useful to inspect file blocking algorithms. +For example, here is what the `ipfs` binary looks like with the default +semi-balanced indirect block chunking: + +- [dot output](/ipfs/QmQ8yWC1SGn73P1SPSw8iqSBGEscve1N6sQpzd1xzD5EV1/graph.dot) +- [svg render](/ipfs/QmQ8yWC1SGn73P1SPSw8iqSBGEscve1N6sQpzd1xzD5EV1/graph.svg) +- [pdf render](/ipfs/QmQ8yWC1SGn73P1SPSw8iqSBGEscve1N6sQpzd1xzD5EV1/graph.pdf) + +![](/ipfs/QmQ8yWC1SGn73P1SPSw8iqSBGEscve1N6sQpzd1xzD5EV1/graph.svg) + +by [Juan Benet](https://github.com/jbenet) diff --git a/content/guides/viewer/graphmd/ipfsbin/graph.dot b/content/guides/viewer/graphmd/ipfsbin/graph.dot new file mode 100644 index 0000000..94a785e --- /dev/null +++ b/content/guides/viewer/graphmd/ipfsbin/graph.dot @@ -0,0 +1,240 @@ +digraph { + graph [rankdir=LR]; + QmUhGxNotmJDRVtoYWvCc2xvTe9PpynpDHZwD3y2UdaeR4 [fontsize=8 shape=box]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box]; + QmUhGxNotmJDRVtoYWvCc2xvTe9PpynpDHZwD3y2UdaeR4 -> QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [label=""]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box]; + QmVHHcWx7Uro5CN5GPt8YMjncLfpSftSq9xVRpopdPwoFM [fontsize=8 shape=box]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmVHHcWx7Uro5CN5GPt8YMjncLfpSftSq9xVRpopdPwoFM [label=""]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box]; + QmRUfpiX9CM7sKAfGLr9JbiqzpGdFCN3FJBx85QueTNzhP [fontsize=8 shape=box]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmRUfpiX9CM7sKAfGLr9JbiqzpGdFCN3FJBx85QueTNzhP [label=""]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box]; + QmaazzgnFYyVL9jBf1oy2Zn4HJex1DdrdkRPfCueutxu2J [fontsize=8 shape=box]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmaazzgnFYyVL9jBf1oy2Zn4HJex1DdrdkRPfCueutxu2J [label=""]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box]; + QmcFH4SYu4nW4kFYfX9o8wr2WRYiz733FAwhP3zeWDi7Bt [fontsize=8 shape=box]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmcFH4SYu4nW4kFYfX9o8wr2WRYiz733FAwhP3zeWDi7Bt [label=""]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box]; + QmPkwiwb99YSHCuEGA5iz2QHRgWgq2oD7k97Eqnr1om7UQ [fontsize=8 shape=box]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmPkwiwb99YSHCuEGA5iz2QHRgWgq2oD7k97Eqnr1om7UQ [label=""]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box]; + QmYDG5nR7JjX4sHKR4qKNrxvdm9zQw4UiXH2Y45GexMkNF [fontsize=8 shape=box]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmYDG5nR7JjX4sHKR4qKNrxvdm9zQw4UiXH2Y45GexMkNF [label=""]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box]; + Qme5qh3zcVTQ3hKPZ6uesRaCgyY9WUrFZo2T7YKM4xkW3X [fontsize=8 shape=box]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> Qme5qh3zcVTQ3hKPZ6uesRaCgyY9WUrFZo2T7YKM4xkW3X [label=""]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box]; + QmPxUYaiVte9yDxooJL9SYPxLBL9tmYujTjaxejJxYKNwo [fontsize=8 shape=box]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmPxUYaiVte9yDxooJL9SYPxLBL9tmYujTjaxejJxYKNwo [label=""]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box]; + QmPofAYvmrBNgkABgQj3nEPdAKdFurrwnCB8FNgozhr2Lh [fontsize=8 shape=box]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmPofAYvmrBNgkABgQj3nEPdAKdFurrwnCB8FNgozhr2Lh [label=""]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box]; + QmTAaogaiuasr7JrWPBordJF7gW56JobUQRbsKfSNNH8fR [fontsize=8 shape=box]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmTAaogaiuasr7JrWPBordJF7gW56JobUQRbsKfSNNH8fR [label=""]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box]; + QmXX3S8J2Vik74M1ND4zneoWnGAJNthB7Q79vwdQz5eoat [fontsize=8 shape=box]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmXX3S8J2Vik74M1ND4zneoWnGAJNthB7Q79vwdQz5eoat [label=""]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box]; + Qme1YSxUvETdARr3QtWgsf9VMZk1guRP9Mn6pZEGhVLzdB [fontsize=8 shape=box]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> Qme1YSxUvETdARr3QtWgsf9VMZk1guRP9Mn6pZEGhVLzdB [label=""]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box]; + QmcNw2ufVvgV7pEmMWKn78Wn4rnn8HCidDTVp1gPC2jkuc [fontsize=8 shape=box]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmcNw2ufVvgV7pEmMWKn78Wn4rnn8HCidDTVp1gPC2jkuc [label=""]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box]; + QmQrthQNznw7FwdWCjgT3eTy3X6sdsD2wk46F9vGAuVTxh [fontsize=8 shape=box]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmQrthQNznw7FwdWCjgT3eTy3X6sdsD2wk46F9vGAuVTxh [label=""]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box]; + QmPpJJZSU4wNWqGdK77uqDSuMju9cd2d7rBrPFa8AGHWeL [fontsize=8 shape=box]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmPpJJZSU4wNWqGdK77uqDSuMju9cd2d7rBrPFa8AGHWeL [label=""]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box]; + QmTFgwHuBSTEH7vjw6avYv7Mu8bguSmeygpExHMLXfyYjN [fontsize=8 shape=box]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmTFgwHuBSTEH7vjw6avYv7Mu8bguSmeygpExHMLXfyYjN [label=""]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box]; + QmUWrk9Fy7PgogkqxuQKRm5QiNWosXxKx6FbdvCtMaKV8G [fontsize=8 shape=box]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmUWrk9Fy7PgogkqxuQKRm5QiNWosXxKx6FbdvCtMaKV8G [label=""]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box]; + QmZg6Qmi4SXv63zCKS5AWjT2SEDTpd5XnFZ5qmX3fNX9aE [fontsize=8 shape=box]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmZg6Qmi4SXv63zCKS5AWjT2SEDTpd5XnFZ5qmX3fNX9aE [label=""]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box]; + QmTqo4QFHyuHGWVTW2dB1Whdd2nBJnjbLGoR4pbpZQzEyx [fontsize=8 shape=box]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmTqo4QFHyuHGWVTW2dB1Whdd2nBJnjbLGoR4pbpZQzEyx [label=""]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box]; + QmXm7ZcAdndVZ83s4Wnc6PQ57eVymQLZ5YshA4Dfxnoxvx [fontsize=8 shape=box]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmXm7ZcAdndVZ83s4Wnc6PQ57eVymQLZ5YshA4Dfxnoxvx [label=""]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box]; + QmW3o7HJgcnsD3YrASFtmquavfADahYx73ck33bnFntF5r [fontsize=8 shape=box]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmW3o7HJgcnsD3YrASFtmquavfADahYx73ck33bnFntF5r [label=""]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box]; + QmdR4c6tkvrgw1cNYdEJJZHeeJgw2WUVu5HqwEk4cEipMH [fontsize=8 shape=box]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmdR4c6tkvrgw1cNYdEJJZHeeJgw2WUVu5HqwEk4cEipMH [label=""]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box]; + QmYScEDTJHPf3b4j2PqQnaAnQeZ81W2GWy151CuP3bVuSv [fontsize=8 shape=box]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmYScEDTJHPf3b4j2PqQnaAnQeZ81W2GWy151CuP3bVuSv [label=""]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box]; + QmVAgdT3iwBJDhZCiNQqD3KSH5EYMTK23Q4uNFZhVugkzk [fontsize=8 shape=box]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmVAgdT3iwBJDhZCiNQqD3KSH5EYMTK23Q4uNFZhVugkzk [label=""]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box]; + QmXoFm8N1SJaL5rus5aDFoNoucciAYpmgB4HQYwVZXGAFQ [fontsize=8 shape=box]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmXoFm8N1SJaL5rus5aDFoNoucciAYpmgB4HQYwVZXGAFQ [label=""]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box]; + Qmafzn6npzkyCXDx2F9AFhDDTuNdmA7WpGCVEyvaUgJ3ZR [fontsize=8 shape=box]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> Qmafzn6npzkyCXDx2F9AFhDDTuNdmA7WpGCVEyvaUgJ3ZR [label=""]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box]; + QmPbT16NCqauqrUfFAQ987EaUVNagRuxx9a1W7guRawMyn [fontsize=8 shape=box]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmPbT16NCqauqrUfFAQ987EaUVNagRuxx9a1W7guRawMyn [label=""]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box]; + QmR6sjyKdrRA4iBue1EnMjaVSHpF43E39V6ZeefiRPqdhz [fontsize=8 shape=box]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmR6sjyKdrRA4iBue1EnMjaVSHpF43E39V6ZeefiRPqdhz [label=""]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box]; + QmeBTS3QteTLrxL3u3jF3C4UG9GJunHknuBkUsGy8hwrk6 [fontsize=8 shape=box]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmeBTS3QteTLrxL3u3jF3C4UG9GJunHknuBkUsGy8hwrk6 [label=""]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box]; + QmYNyQ4tJ2VpVpq7RUx4XVTCtc5CRBX7Zv5rMDATH5pWDT [fontsize=8 shape=box]; + QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmYNyQ4tJ2VpVpq7RUx4XVTCtc5CRBX7Zv5rMDATH5pWDT [label=""]; + QmUhGxNotmJDRVtoYWvCc2xvTe9PpynpDHZwD3y2UdaeR4 [fontsize=8 shape=box]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box]; + QmUhGxNotmJDRVtoYWvCc2xvTe9PpynpDHZwD3y2UdaeR4 -> QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [label=""]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box]; + QmcLMn25VWARy5V4SgCdK49yVgWrzSguZeJP5pm4eNGVYM [fontsize=8 shape=box]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmcLMn25VWARy5V4SgCdK49yVgWrzSguZeJP5pm4eNGVYM [label=""]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box]; + QmZodojoY8nKHBVYoujmsDsT4pV8s9GY3BHA51Aa5dw62o [fontsize=8 shape=box]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmZodojoY8nKHBVYoujmsDsT4pV8s9GY3BHA51Aa5dw62o [label=""]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box]; + QmcmEuLjtJzizQjgSEs8m2SJW1GSRLCXP4Y3KHYgpfuKqb [fontsize=8 shape=box]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmcmEuLjtJzizQjgSEs8m2SJW1GSRLCXP4Y3KHYgpfuKqb [label=""]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box]; + QmZPsekJNcq7jSVn8TGnxbxy9P4n6kCN1Swko2me4vfqTH [fontsize=8 shape=box]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmZPsekJNcq7jSVn8TGnxbxy9P4n6kCN1Swko2me4vfqTH [label=""]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box]; + QmTRzfEDBEoJyYjunu6RTXToJYZof4jhW15c4J27viKiuo [fontsize=8 shape=box]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmTRzfEDBEoJyYjunu6RTXToJYZof4jhW15c4J27viKiuo [label=""]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box]; + QmVVjqe2HcyUWRw8CxFzUyf5oJAmFwKa59birETu9CTdEv [fontsize=8 shape=box]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmVVjqe2HcyUWRw8CxFzUyf5oJAmFwKa59birETu9CTdEv [label=""]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box]; + QmPUm5ZsvQhu9sqTNDLNBiAiT4UCsWzVbN72LUXqrxMjdz [fontsize=8 shape=box]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmPUm5ZsvQhu9sqTNDLNBiAiT4UCsWzVbN72LUXqrxMjdz [label=""]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box]; + QmWC6MtcD6TvZ24eNciTjc9pyLzFF9LcMXfGv5qYRaujgG [fontsize=8 shape=box]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmWC6MtcD6TvZ24eNciTjc9pyLzFF9LcMXfGv5qYRaujgG [label=""]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box]; + QmVUc4eK4Re6qwPBVMXe1euBXVvjuHGhrV8pD9YejP1KD9 [fontsize=8 shape=box]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmVUc4eK4Re6qwPBVMXe1euBXVvjuHGhrV8pD9YejP1KD9 [label=""]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box]; + QmXhN1TAwCXacRVbxbNcDDTikC6fYMsYqSm2arWCL9xcxf [fontsize=8 shape=box]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmXhN1TAwCXacRVbxbNcDDTikC6fYMsYqSm2arWCL9xcxf [label=""]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box]; + QmUyinoH95zsagdKUpu9nibn2kV6oUJKnvWNvfRsMxjazx [fontsize=8 shape=box]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmUyinoH95zsagdKUpu9nibn2kV6oUJKnvWNvfRsMxjazx [label=""]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box]; + QmQY3GzGMxHBJiFU2KhezKazU9rjRWs9QP8gGxbwQ3SCfL [fontsize=8 shape=box]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmQY3GzGMxHBJiFU2KhezKazU9rjRWs9QP8gGxbwQ3SCfL [label=""]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box]; + QmVAsMczDCuXJGy1wnhzWis7bnDUQXPokiSGi7ahC1cvLv [fontsize=8 shape=box]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmVAsMczDCuXJGy1wnhzWis7bnDUQXPokiSGi7ahC1cvLv [label=""]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box]; + QmS7mjXVd9GeLcLVf5eAxa5gtBZwyvEd7Roye1hzcjioWG [fontsize=8 shape=box]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmS7mjXVd9GeLcLVf5eAxa5gtBZwyvEd7Roye1hzcjioWG [label=""]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box]; + QmTzNVP3sgRaaaABvmQvQD6QbdawAwyxxnUt7EtCAhixko [fontsize=8 shape=box]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmTzNVP3sgRaaaABvmQvQD6QbdawAwyxxnUt7EtCAhixko [label=""]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box]; + QmXMbwtHJqphFKRuWhJxVFP3wVHrwbkTBj5Ld4Xzawyook [fontsize=8 shape=box]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmXMbwtHJqphFKRuWhJxVFP3wVHrwbkTBj5Ld4Xzawyook [label=""]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box]; + QmZKkYQtRTPdb2HLEJJ5L9JJ8ptZAWaoxEfQzrJtR8zVgk [fontsize=8 shape=box]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmZKkYQtRTPdb2HLEJJ5L9JJ8ptZAWaoxEfQzrJtR8zVgk [label=""]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box]; + QmdDTrRzkhGXJS2HJ3W912NYieDrpXJ2DgHwx47X4EH3HD [fontsize=8 shape=box]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmdDTrRzkhGXJS2HJ3W912NYieDrpXJ2DgHwx47X4EH3HD [label=""]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box]; + QmUu9sg3PkCAw5xtovb5ZqNN7TqYAMiznTFysYhmo9uLBd [fontsize=8 shape=box]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmUu9sg3PkCAw5xtovb5ZqNN7TqYAMiznTFysYhmo9uLBd [label=""]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box]; + QmSmk6E99Qe8iTWPXhBkAQbdoieKkCxXd8cL6YgLi66Cg1 [fontsize=8 shape=box]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmSmk6E99Qe8iTWPXhBkAQbdoieKkCxXd8cL6YgLi66Cg1 [label=""]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box]; + QmNPcQZTFPoUzQrBqJMjxezJtUXXDGxpr9tGAhf1qPtQ7V [fontsize=8 shape=box]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmNPcQZTFPoUzQrBqJMjxezJtUXXDGxpr9tGAhf1qPtQ7V [label=""]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box]; + QmPuTWcqGRQHJjEPPh9Bky5qGMvo24s1kcpnngKsUUkdLY [fontsize=8 shape=box]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmPuTWcqGRQHJjEPPh9Bky5qGMvo24s1kcpnngKsUUkdLY [label=""]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box]; + QmRWG2TU4sqRESq543S6kAMXv7T9bUfqApRV24vd25nHJh [fontsize=8 shape=box]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmRWG2TU4sqRESq543S6kAMXv7T9bUfqApRV24vd25nHJh [label=""]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box]; + Qmb8RW7gTd4UeGL3iP3e9b8Jv1Hzpa6Fj7c3khkP81Kvq4 [fontsize=8 shape=box]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> Qmb8RW7gTd4UeGL3iP3e9b8Jv1Hzpa6Fj7c3khkP81Kvq4 [label=""]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box]; + QmVW2kxapQYUbZN75gNFea3ifQQWKKt41fexNgZGPgwhbC [fontsize=8 shape=box]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmVW2kxapQYUbZN75gNFea3ifQQWKKt41fexNgZGPgwhbC [label=""]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box]; + QmZC16QUatu28r76C3kmgxsuv3Zk63ivB9mureDtdVTtPy [fontsize=8 shape=box]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmZC16QUatu28r76C3kmgxsuv3Zk63ivB9mureDtdVTtPy [label=""]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box]; + QmU5yw59zPcoNcQ1Yt266sx5ZQW3PpDjqppRjRgFM1ehbj [fontsize=8 shape=box]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmU5yw59zPcoNcQ1Yt266sx5ZQW3PpDjqppRjRgFM1ehbj [label=""]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box]; + QmTnAZEQfBj4wfkKkAUSCifxTcvrAkEqnbwqwMkesUQ2yn [fontsize=8 shape=box]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmTnAZEQfBj4wfkKkAUSCifxTcvrAkEqnbwqwMkesUQ2yn [label=""]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box]; + QmZvEW9WXpSXRDxcFALQ7p4jRJKZncNdNy9UFcy5vbXnZM [fontsize=8 shape=box]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmZvEW9WXpSXRDxcFALQ7p4jRJKZncNdNy9UFcy5vbXnZM [label=""]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box]; + QmcBe5xGrxFXhCoMZUTDe85dTyx99FfES7CkaLsZKzY5Hn [fontsize=8 shape=box]; + QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmcBe5xGrxFXhCoMZUTDe85dTyx99FfES7CkaLsZKzY5Hn [label=""]; + QmUhGxNotmJDRVtoYWvCc2xvTe9PpynpDHZwD3y2UdaeR4 [fontsize=8 shape=box]; + QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH [fontsize=8 shape=box]; + QmUhGxNotmJDRVtoYWvCc2xvTe9PpynpDHZwD3y2UdaeR4 -> QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH [label=""]; + QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH [fontsize=8 shape=box]; + QmPWMnC7VBE7BnrKfawdQYMxtkjfaKeqLqEHjHy4Akx6AN [fontsize=8 shape=box]; + QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH -> QmPWMnC7VBE7BnrKfawdQYMxtkjfaKeqLqEHjHy4Akx6AN [label=""]; + QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH [fontsize=8 shape=box]; + QmbhqPW251ueXCwaHqDoE1ZQefukARhso5FHmGn5oSNN4Y [fontsize=8 shape=box]; + QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH -> QmbhqPW251ueXCwaHqDoE1ZQefukARhso5FHmGn5oSNN4Y [label=""]; + QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH [fontsize=8 shape=box]; + QmcyJjYp2mgD24orivoiuStqu7jDJtxsUFWTFtbgFYJ9yW [fontsize=8 shape=box]; + QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH -> QmcyJjYp2mgD24orivoiuStqu7jDJtxsUFWTFtbgFYJ9yW [label=""]; + QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH [fontsize=8 shape=box]; + QmV3df7xsnWpQhNGynkHZNXUcSaHvfdempiZ3TtYhLUw3w [fontsize=8 shape=box]; + QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH -> QmV3df7xsnWpQhNGynkHZNXUcSaHvfdempiZ3TtYhLUw3w [label=""]; + QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH [fontsize=8 shape=box]; + QmSDTCDY3cn7niCxWLwhY94wsodMo8iaJkXWFkk2T64cB4 [fontsize=8 shape=box]; + QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH -> QmSDTCDY3cn7niCxWLwhY94wsodMo8iaJkXWFkk2T64cB4 [label=""]; + QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH [fontsize=8 shape=box]; + QmdYzjaRXhrx4gMQ29MMzVmE4aUNLWaXu8Eb7piY8Mbfus [fontsize=8 shape=box]; + QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH -> QmdYzjaRXhrx4gMQ29MMzVmE4aUNLWaXu8Eb7piY8Mbfus [label=""]; + QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH [fontsize=8 shape=box]; + QmczEoRPanoknpuBuKNghu59r94UUx1KfDhgHKRxEpQn8Q [fontsize=8 shape=box]; + QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH -> QmczEoRPanoknpuBuKNghu59r94UUx1KfDhgHKRxEpQn8Q [label=""]; + QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH [fontsize=8 shape=box]; + QmbVXn6yXFuyXcw7ykPpWuprRkPferRPGbgvCY7DNy1U5R [fontsize=8 shape=box]; + QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH -> QmbVXn6yXFuyXcw7ykPpWuprRkPferRPGbgvCY7DNy1U5R [label=""]; + QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH [fontsize=8 shape=box]; + QmYyEnwiNCn8HgtM1PDT4oUhc3BMSVfkkPVCr4YqQarDnx [fontsize=8 shape=box]; + QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH -> QmYyEnwiNCn8HgtM1PDT4oUhc3BMSVfkkPVCr4YqQarDnx [label=""]; + QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH [fontsize=8 shape=box]; + QmQjq29oa8oGtvMrGmFfEcU1JCddaoF78BeU2jzSMU2mH3 [fontsize=8 shape=box]; + QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH -> QmQjq29oa8oGtvMrGmFfEcU1JCddaoF78BeU2jzSMU2mH3 [label=""]; + QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH [fontsize=8 shape=box]; + Qmcqpjgdh28TGdjYat3PDUxBccRqu5Nr8hUPvdt8PF4eVq [fontsize=8 shape=box]; + QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH -> Qmcqpjgdh28TGdjYat3PDUxBccRqu5Nr8hUPvdt8PF4eVq [label=""]; + QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH [fontsize=8 shape=box]; + QmT2zjcD5Cf4B7nLCnu6TngNuPcKciprAYTtzD3REXvzcR [fontsize=8 shape=box]; + QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH -> QmT2zjcD5Cf4B7nLCnu6TngNuPcKciprAYTtzD3REXvzcR [label=""]; + QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH [fontsize=8 shape=box]; + QmeyCHUPSF2ke9B6nnQHdUno32D8ej98vHWyezYi6QPPSY [fontsize=8 shape=box]; + QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH -> QmeyCHUPSF2ke9B6nnQHdUno32D8ej98vHWyezYi6QPPSY [label=""]; + QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH [fontsize=8 shape=box]; + QmSHHkLpaSTBFfvtSJdTmxvP2cPMKrso66nB2d9wz4WVWE [fontsize=8 shape=box]; + QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH -> QmSHHkLpaSTBFfvtSJdTmxvP2cPMKrso66nB2d9wz4WVWE [label=""]; + QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH [fontsize=8 shape=box]; + QmNPGySRo1GA1EXJgferHsD43zqy5dX6urKXYsfYFXyCG5 [fontsize=8 shape=box]; + QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH -> QmNPGySRo1GA1EXJgferHsD43zqy5dX6urKXYsfYFXyCG5 [label=""]; + QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH [fontsize=8 shape=box]; + Qma3aC6KJB4Vit2f9Mi9Z7ZbKP2FfFCRbHbXY9b86fFS6B [fontsize=8 shape=box]; + QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH -> Qma3aC6KJB4Vit2f9Mi9Z7ZbKP2FfFCRbHbXY9b86fFS6B [label=""]; +} diff --git a/content/guides/viewer/graphmd/ipfsbin/graph.pdf b/content/guides/viewer/graphmd/ipfsbin/graph.pdf new file mode 100644 index 0000000..77bc72a Binary files /dev/null and b/content/guides/viewer/graphmd/ipfsbin/graph.pdf differ diff --git a/content/guides/viewer/graphmd/ipfsbin/graph.svg b/content/guides/viewer/graphmd/ipfsbin/graph.svg new file mode 100644 index 0000000..6edf740 --- /dev/null +++ b/content/guides/viewer/graphmd/ipfsbin/graph.svg @@ -0,0 +1,808 @@ + + + + + + +%3 + + +QmUhGxNotmJDRVtoYWvCc2xvTe9PpynpDHZwD3y2UdaeR4 + +QmUhGxNotmJDRVtoYWvCc2xvTe9PpynpDHZwD3y2UdaeR4 + + +QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV + +QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV + + +QmUhGxNotmJDRVtoYWvCc2xvTe9PpynpDHZwD3y2UdaeR4->QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV + + + + +QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD + +QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD + + +QmUhGxNotmJDRVtoYWvCc2xvTe9PpynpDHZwD3y2UdaeR4->QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD + + + + +QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH + +QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH + + +QmUhGxNotmJDRVtoYWvCc2xvTe9PpynpDHZwD3y2UdaeR4->QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH + + + + +QmVHHcWx7Uro5CN5GPt8YMjncLfpSftSq9xVRpopdPwoFM + +QmVHHcWx7Uro5CN5GPt8YMjncLfpSftSq9xVRpopdPwoFM + + +QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmVHHcWx7Uro5CN5GPt8YMjncLfpSftSq9xVRpopdPwoFM + + + + +QmRUfpiX9CM7sKAfGLr9JbiqzpGdFCN3FJBx85QueTNzhP + +QmRUfpiX9CM7sKAfGLr9JbiqzpGdFCN3FJBx85QueTNzhP + + +QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmRUfpiX9CM7sKAfGLr9JbiqzpGdFCN3FJBx85QueTNzhP + + + + +QmaazzgnFYyVL9jBf1oy2Zn4HJex1DdrdkRPfCueutxu2J + +QmaazzgnFYyVL9jBf1oy2Zn4HJex1DdrdkRPfCueutxu2J + + +QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmaazzgnFYyVL9jBf1oy2Zn4HJex1DdrdkRPfCueutxu2J + + + + +QmcFH4SYu4nW4kFYfX9o8wr2WRYiz733FAwhP3zeWDi7Bt + +QmcFH4SYu4nW4kFYfX9o8wr2WRYiz733FAwhP3zeWDi7Bt + + +QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmcFH4SYu4nW4kFYfX9o8wr2WRYiz733FAwhP3zeWDi7Bt + + + + +QmPkwiwb99YSHCuEGA5iz2QHRgWgq2oD7k97Eqnr1om7UQ + +QmPkwiwb99YSHCuEGA5iz2QHRgWgq2oD7k97Eqnr1om7UQ + + +QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmPkwiwb99YSHCuEGA5iz2QHRgWgq2oD7k97Eqnr1om7UQ + + + + +QmYDG5nR7JjX4sHKR4qKNrxvdm9zQw4UiXH2Y45GexMkNF + +QmYDG5nR7JjX4sHKR4qKNrxvdm9zQw4UiXH2Y45GexMkNF + + +QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmYDG5nR7JjX4sHKR4qKNrxvdm9zQw4UiXH2Y45GexMkNF + + + + +Qme5qh3zcVTQ3hKPZ6uesRaCgyY9WUrFZo2T7YKM4xkW3X + +Qme5qh3zcVTQ3hKPZ6uesRaCgyY9WUrFZo2T7YKM4xkW3X + + +QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->Qme5qh3zcVTQ3hKPZ6uesRaCgyY9WUrFZo2T7YKM4xkW3X + + + + +QmPxUYaiVte9yDxooJL9SYPxLBL9tmYujTjaxejJxYKNwo + +QmPxUYaiVte9yDxooJL9SYPxLBL9tmYujTjaxejJxYKNwo + + +QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmPxUYaiVte9yDxooJL9SYPxLBL9tmYujTjaxejJxYKNwo + + + + +QmPofAYvmrBNgkABgQj3nEPdAKdFurrwnCB8FNgozhr2Lh + +QmPofAYvmrBNgkABgQj3nEPdAKdFurrwnCB8FNgozhr2Lh + + +QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmPofAYvmrBNgkABgQj3nEPdAKdFurrwnCB8FNgozhr2Lh + + + + +QmTAaogaiuasr7JrWPBordJF7gW56JobUQRbsKfSNNH8fR + +QmTAaogaiuasr7JrWPBordJF7gW56JobUQRbsKfSNNH8fR + + +QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmTAaogaiuasr7JrWPBordJF7gW56JobUQRbsKfSNNH8fR + + + + +QmXX3S8J2Vik74M1ND4zneoWnGAJNthB7Q79vwdQz5eoat + +QmXX3S8J2Vik74M1ND4zneoWnGAJNthB7Q79vwdQz5eoat + + +QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmXX3S8J2Vik74M1ND4zneoWnGAJNthB7Q79vwdQz5eoat + + + + +Qme1YSxUvETdARr3QtWgsf9VMZk1guRP9Mn6pZEGhVLzdB + +Qme1YSxUvETdARr3QtWgsf9VMZk1guRP9Mn6pZEGhVLzdB + + +QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->Qme1YSxUvETdARr3QtWgsf9VMZk1guRP9Mn6pZEGhVLzdB + + + + +QmcNw2ufVvgV7pEmMWKn78Wn4rnn8HCidDTVp1gPC2jkuc + +QmcNw2ufVvgV7pEmMWKn78Wn4rnn8HCidDTVp1gPC2jkuc + + +QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmcNw2ufVvgV7pEmMWKn78Wn4rnn8HCidDTVp1gPC2jkuc + + + + +QmQrthQNznw7FwdWCjgT3eTy3X6sdsD2wk46F9vGAuVTxh + +QmQrthQNznw7FwdWCjgT3eTy3X6sdsD2wk46F9vGAuVTxh + + +QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmQrthQNznw7FwdWCjgT3eTy3X6sdsD2wk46F9vGAuVTxh + + + + +QmPpJJZSU4wNWqGdK77uqDSuMju9cd2d7rBrPFa8AGHWeL + +QmPpJJZSU4wNWqGdK77uqDSuMju9cd2d7rBrPFa8AGHWeL + + +QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmPpJJZSU4wNWqGdK77uqDSuMju9cd2d7rBrPFa8AGHWeL + + + + +QmTFgwHuBSTEH7vjw6avYv7Mu8bguSmeygpExHMLXfyYjN + +QmTFgwHuBSTEH7vjw6avYv7Mu8bguSmeygpExHMLXfyYjN + + +QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmTFgwHuBSTEH7vjw6avYv7Mu8bguSmeygpExHMLXfyYjN + + + + +QmUWrk9Fy7PgogkqxuQKRm5QiNWosXxKx6FbdvCtMaKV8G + +QmUWrk9Fy7PgogkqxuQKRm5QiNWosXxKx6FbdvCtMaKV8G + + +QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmUWrk9Fy7PgogkqxuQKRm5QiNWosXxKx6FbdvCtMaKV8G + + + + +QmZg6Qmi4SXv63zCKS5AWjT2SEDTpd5XnFZ5qmX3fNX9aE + +QmZg6Qmi4SXv63zCKS5AWjT2SEDTpd5XnFZ5qmX3fNX9aE + + +QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmZg6Qmi4SXv63zCKS5AWjT2SEDTpd5XnFZ5qmX3fNX9aE + + + + +QmTqo4QFHyuHGWVTW2dB1Whdd2nBJnjbLGoR4pbpZQzEyx + +QmTqo4QFHyuHGWVTW2dB1Whdd2nBJnjbLGoR4pbpZQzEyx + + +QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmTqo4QFHyuHGWVTW2dB1Whdd2nBJnjbLGoR4pbpZQzEyx + + + + +QmXm7ZcAdndVZ83s4Wnc6PQ57eVymQLZ5YshA4Dfxnoxvx + +QmXm7ZcAdndVZ83s4Wnc6PQ57eVymQLZ5YshA4Dfxnoxvx + + +QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmXm7ZcAdndVZ83s4Wnc6PQ57eVymQLZ5YshA4Dfxnoxvx + + + + +QmW3o7HJgcnsD3YrASFtmquavfADahYx73ck33bnFntF5r + +QmW3o7HJgcnsD3YrASFtmquavfADahYx73ck33bnFntF5r + + +QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmW3o7HJgcnsD3YrASFtmquavfADahYx73ck33bnFntF5r + + + + +QmdR4c6tkvrgw1cNYdEJJZHeeJgw2WUVu5HqwEk4cEipMH + +QmdR4c6tkvrgw1cNYdEJJZHeeJgw2WUVu5HqwEk4cEipMH + + +QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmdR4c6tkvrgw1cNYdEJJZHeeJgw2WUVu5HqwEk4cEipMH + + + + +QmYScEDTJHPf3b4j2PqQnaAnQeZ81W2GWy151CuP3bVuSv + +QmYScEDTJHPf3b4j2PqQnaAnQeZ81W2GWy151CuP3bVuSv + + +QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmYScEDTJHPf3b4j2PqQnaAnQeZ81W2GWy151CuP3bVuSv + + + + +QmVAgdT3iwBJDhZCiNQqD3KSH5EYMTK23Q4uNFZhVugkzk + +QmVAgdT3iwBJDhZCiNQqD3KSH5EYMTK23Q4uNFZhVugkzk + + +QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmVAgdT3iwBJDhZCiNQqD3KSH5EYMTK23Q4uNFZhVugkzk + + + + +QmXoFm8N1SJaL5rus5aDFoNoucciAYpmgB4HQYwVZXGAFQ + +QmXoFm8N1SJaL5rus5aDFoNoucciAYpmgB4HQYwVZXGAFQ + + +QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmXoFm8N1SJaL5rus5aDFoNoucciAYpmgB4HQYwVZXGAFQ + + + + +Qmafzn6npzkyCXDx2F9AFhDDTuNdmA7WpGCVEyvaUgJ3ZR + +Qmafzn6npzkyCXDx2F9AFhDDTuNdmA7WpGCVEyvaUgJ3ZR + + +QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->Qmafzn6npzkyCXDx2F9AFhDDTuNdmA7WpGCVEyvaUgJ3ZR + + + + +QmPbT16NCqauqrUfFAQ987EaUVNagRuxx9a1W7guRawMyn + +QmPbT16NCqauqrUfFAQ987EaUVNagRuxx9a1W7guRawMyn + + +QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmPbT16NCqauqrUfFAQ987EaUVNagRuxx9a1W7guRawMyn + + + + +QmR6sjyKdrRA4iBue1EnMjaVSHpF43E39V6ZeefiRPqdhz + +QmR6sjyKdrRA4iBue1EnMjaVSHpF43E39V6ZeefiRPqdhz + + +QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmR6sjyKdrRA4iBue1EnMjaVSHpF43E39V6ZeefiRPqdhz + + + + +QmeBTS3QteTLrxL3u3jF3C4UG9GJunHknuBkUsGy8hwrk6 + +QmeBTS3QteTLrxL3u3jF3C4UG9GJunHknuBkUsGy8hwrk6 + + +QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmeBTS3QteTLrxL3u3jF3C4UG9GJunHknuBkUsGy8hwrk6 + + + + +QmYNyQ4tJ2VpVpq7RUx4XVTCtc5CRBX7Zv5rMDATH5pWDT + +QmYNyQ4tJ2VpVpq7RUx4XVTCtc5CRBX7Zv5rMDATH5pWDT + + +QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmYNyQ4tJ2VpVpq7RUx4XVTCtc5CRBX7Zv5rMDATH5pWDT + + + + +QmcLMn25VWARy5V4SgCdK49yVgWrzSguZeJP5pm4eNGVYM + +QmcLMn25VWARy5V4SgCdK49yVgWrzSguZeJP5pm4eNGVYM + + +QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmcLMn25VWARy5V4SgCdK49yVgWrzSguZeJP5pm4eNGVYM + + + + +QmZodojoY8nKHBVYoujmsDsT4pV8s9GY3BHA51Aa5dw62o + +QmZodojoY8nKHBVYoujmsDsT4pV8s9GY3BHA51Aa5dw62o + + +QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmZodojoY8nKHBVYoujmsDsT4pV8s9GY3BHA51Aa5dw62o + + + + +QmcmEuLjtJzizQjgSEs8m2SJW1GSRLCXP4Y3KHYgpfuKqb + +QmcmEuLjtJzizQjgSEs8m2SJW1GSRLCXP4Y3KHYgpfuKqb + + +QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmcmEuLjtJzizQjgSEs8m2SJW1GSRLCXP4Y3KHYgpfuKqb + + + + +QmZPsekJNcq7jSVn8TGnxbxy9P4n6kCN1Swko2me4vfqTH + +QmZPsekJNcq7jSVn8TGnxbxy9P4n6kCN1Swko2me4vfqTH + + +QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmZPsekJNcq7jSVn8TGnxbxy9P4n6kCN1Swko2me4vfqTH + + + + +QmTRzfEDBEoJyYjunu6RTXToJYZof4jhW15c4J27viKiuo + +QmTRzfEDBEoJyYjunu6RTXToJYZof4jhW15c4J27viKiuo + + +QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmTRzfEDBEoJyYjunu6RTXToJYZof4jhW15c4J27viKiuo + + + + +QmVVjqe2HcyUWRw8CxFzUyf5oJAmFwKa59birETu9CTdEv + +QmVVjqe2HcyUWRw8CxFzUyf5oJAmFwKa59birETu9CTdEv + + +QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmVVjqe2HcyUWRw8CxFzUyf5oJAmFwKa59birETu9CTdEv + + + + +QmPUm5ZsvQhu9sqTNDLNBiAiT4UCsWzVbN72LUXqrxMjdz + +QmPUm5ZsvQhu9sqTNDLNBiAiT4UCsWzVbN72LUXqrxMjdz + + +QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmPUm5ZsvQhu9sqTNDLNBiAiT4UCsWzVbN72LUXqrxMjdz + + + + +QmWC6MtcD6TvZ24eNciTjc9pyLzFF9LcMXfGv5qYRaujgG + +QmWC6MtcD6TvZ24eNciTjc9pyLzFF9LcMXfGv5qYRaujgG + + +QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmWC6MtcD6TvZ24eNciTjc9pyLzFF9LcMXfGv5qYRaujgG + + + + +QmVUc4eK4Re6qwPBVMXe1euBXVvjuHGhrV8pD9YejP1KD9 + +QmVUc4eK4Re6qwPBVMXe1euBXVvjuHGhrV8pD9YejP1KD9 + + +QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmVUc4eK4Re6qwPBVMXe1euBXVvjuHGhrV8pD9YejP1KD9 + + + + +QmXhN1TAwCXacRVbxbNcDDTikC6fYMsYqSm2arWCL9xcxf + +QmXhN1TAwCXacRVbxbNcDDTikC6fYMsYqSm2arWCL9xcxf + + +QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmXhN1TAwCXacRVbxbNcDDTikC6fYMsYqSm2arWCL9xcxf + + + + +QmUyinoH95zsagdKUpu9nibn2kV6oUJKnvWNvfRsMxjazx + +QmUyinoH95zsagdKUpu9nibn2kV6oUJKnvWNvfRsMxjazx + + +QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmUyinoH95zsagdKUpu9nibn2kV6oUJKnvWNvfRsMxjazx + + + + +QmQY3GzGMxHBJiFU2KhezKazU9rjRWs9QP8gGxbwQ3SCfL + +QmQY3GzGMxHBJiFU2KhezKazU9rjRWs9QP8gGxbwQ3SCfL + + +QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmQY3GzGMxHBJiFU2KhezKazU9rjRWs9QP8gGxbwQ3SCfL + + + + +QmVAsMczDCuXJGy1wnhzWis7bnDUQXPokiSGi7ahC1cvLv + +QmVAsMczDCuXJGy1wnhzWis7bnDUQXPokiSGi7ahC1cvLv + + +QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmVAsMczDCuXJGy1wnhzWis7bnDUQXPokiSGi7ahC1cvLv + + + + +QmS7mjXVd9GeLcLVf5eAxa5gtBZwyvEd7Roye1hzcjioWG + +QmS7mjXVd9GeLcLVf5eAxa5gtBZwyvEd7Roye1hzcjioWG + + +QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmS7mjXVd9GeLcLVf5eAxa5gtBZwyvEd7Roye1hzcjioWG + + + + +QmTzNVP3sgRaaaABvmQvQD6QbdawAwyxxnUt7EtCAhixko + +QmTzNVP3sgRaaaABvmQvQD6QbdawAwyxxnUt7EtCAhixko + + +QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmTzNVP3sgRaaaABvmQvQD6QbdawAwyxxnUt7EtCAhixko + + + + +QmXMbwtHJqphFKRuWhJxVFP3wVHrwbkTBj5Ld4Xzawyook + +QmXMbwtHJqphFKRuWhJxVFP3wVHrwbkTBj5Ld4Xzawyook + + +QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmXMbwtHJqphFKRuWhJxVFP3wVHrwbkTBj5Ld4Xzawyook + + + + +QmZKkYQtRTPdb2HLEJJ5L9JJ8ptZAWaoxEfQzrJtR8zVgk + +QmZKkYQtRTPdb2HLEJJ5L9JJ8ptZAWaoxEfQzrJtR8zVgk + + +QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmZKkYQtRTPdb2HLEJJ5L9JJ8ptZAWaoxEfQzrJtR8zVgk + + + + +QmdDTrRzkhGXJS2HJ3W912NYieDrpXJ2DgHwx47X4EH3HD + +QmdDTrRzkhGXJS2HJ3W912NYieDrpXJ2DgHwx47X4EH3HD + + +QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmdDTrRzkhGXJS2HJ3W912NYieDrpXJ2DgHwx47X4EH3HD + + + + +QmUu9sg3PkCAw5xtovb5ZqNN7TqYAMiznTFysYhmo9uLBd + +QmUu9sg3PkCAw5xtovb5ZqNN7TqYAMiznTFysYhmo9uLBd + + +QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmUu9sg3PkCAw5xtovb5ZqNN7TqYAMiznTFysYhmo9uLBd + + + + +QmSmk6E99Qe8iTWPXhBkAQbdoieKkCxXd8cL6YgLi66Cg1 + +QmSmk6E99Qe8iTWPXhBkAQbdoieKkCxXd8cL6YgLi66Cg1 + + +QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmSmk6E99Qe8iTWPXhBkAQbdoieKkCxXd8cL6YgLi66Cg1 + + + + +QmNPcQZTFPoUzQrBqJMjxezJtUXXDGxpr9tGAhf1qPtQ7V + +QmNPcQZTFPoUzQrBqJMjxezJtUXXDGxpr9tGAhf1qPtQ7V + + +QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmNPcQZTFPoUzQrBqJMjxezJtUXXDGxpr9tGAhf1qPtQ7V + + + + +QmPuTWcqGRQHJjEPPh9Bky5qGMvo24s1kcpnngKsUUkdLY + +QmPuTWcqGRQHJjEPPh9Bky5qGMvo24s1kcpnngKsUUkdLY + + +QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmPuTWcqGRQHJjEPPh9Bky5qGMvo24s1kcpnngKsUUkdLY + + + + +QmRWG2TU4sqRESq543S6kAMXv7T9bUfqApRV24vd25nHJh + +QmRWG2TU4sqRESq543S6kAMXv7T9bUfqApRV24vd25nHJh + + +QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmRWG2TU4sqRESq543S6kAMXv7T9bUfqApRV24vd25nHJh + + + + +Qmb8RW7gTd4UeGL3iP3e9b8Jv1Hzpa6Fj7c3khkP81Kvq4 + +Qmb8RW7gTd4UeGL3iP3e9b8Jv1Hzpa6Fj7c3khkP81Kvq4 + + +QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->Qmb8RW7gTd4UeGL3iP3e9b8Jv1Hzpa6Fj7c3khkP81Kvq4 + + + + +QmVW2kxapQYUbZN75gNFea3ifQQWKKt41fexNgZGPgwhbC + +QmVW2kxapQYUbZN75gNFea3ifQQWKKt41fexNgZGPgwhbC + + +QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmVW2kxapQYUbZN75gNFea3ifQQWKKt41fexNgZGPgwhbC + + + + +QmZC16QUatu28r76C3kmgxsuv3Zk63ivB9mureDtdVTtPy + +QmZC16QUatu28r76C3kmgxsuv3Zk63ivB9mureDtdVTtPy + + +QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmZC16QUatu28r76C3kmgxsuv3Zk63ivB9mureDtdVTtPy + + + + +QmU5yw59zPcoNcQ1Yt266sx5ZQW3PpDjqppRjRgFM1ehbj + +QmU5yw59zPcoNcQ1Yt266sx5ZQW3PpDjqppRjRgFM1ehbj + + +QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmU5yw59zPcoNcQ1Yt266sx5ZQW3PpDjqppRjRgFM1ehbj + + + + +QmTnAZEQfBj4wfkKkAUSCifxTcvrAkEqnbwqwMkesUQ2yn + +QmTnAZEQfBj4wfkKkAUSCifxTcvrAkEqnbwqwMkesUQ2yn + + +QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmTnAZEQfBj4wfkKkAUSCifxTcvrAkEqnbwqwMkesUQ2yn + + + + +QmZvEW9WXpSXRDxcFALQ7p4jRJKZncNdNy9UFcy5vbXnZM + +QmZvEW9WXpSXRDxcFALQ7p4jRJKZncNdNy9UFcy5vbXnZM + + +QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmZvEW9WXpSXRDxcFALQ7p4jRJKZncNdNy9UFcy5vbXnZM + + + + +QmcBe5xGrxFXhCoMZUTDe85dTyx99FfES7CkaLsZKzY5Hn + +QmcBe5xGrxFXhCoMZUTDe85dTyx99FfES7CkaLsZKzY5Hn + + +QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmcBe5xGrxFXhCoMZUTDe85dTyx99FfES7CkaLsZKzY5Hn + + + + +QmPWMnC7VBE7BnrKfawdQYMxtkjfaKeqLqEHjHy4Akx6AN + +QmPWMnC7VBE7BnrKfawdQYMxtkjfaKeqLqEHjHy4Akx6AN + + +QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmPWMnC7VBE7BnrKfawdQYMxtkjfaKeqLqEHjHy4Akx6AN + + + + +QmbhqPW251ueXCwaHqDoE1ZQefukARhso5FHmGn5oSNN4Y + +QmbhqPW251ueXCwaHqDoE1ZQefukARhso5FHmGn5oSNN4Y + + +QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmbhqPW251ueXCwaHqDoE1ZQefukARhso5FHmGn5oSNN4Y + + + + +QmcyJjYp2mgD24orivoiuStqu7jDJtxsUFWTFtbgFYJ9yW + +QmcyJjYp2mgD24orivoiuStqu7jDJtxsUFWTFtbgFYJ9yW + + +QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmcyJjYp2mgD24orivoiuStqu7jDJtxsUFWTFtbgFYJ9yW + + + + +QmV3df7xsnWpQhNGynkHZNXUcSaHvfdempiZ3TtYhLUw3w + +QmV3df7xsnWpQhNGynkHZNXUcSaHvfdempiZ3TtYhLUw3w + + +QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmV3df7xsnWpQhNGynkHZNXUcSaHvfdempiZ3TtYhLUw3w + + + + +QmSDTCDY3cn7niCxWLwhY94wsodMo8iaJkXWFkk2T64cB4 + +QmSDTCDY3cn7niCxWLwhY94wsodMo8iaJkXWFkk2T64cB4 + + +QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmSDTCDY3cn7niCxWLwhY94wsodMo8iaJkXWFkk2T64cB4 + + + + +QmdYzjaRXhrx4gMQ29MMzVmE4aUNLWaXu8Eb7piY8Mbfus + +QmdYzjaRXhrx4gMQ29MMzVmE4aUNLWaXu8Eb7piY8Mbfus + + +QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmdYzjaRXhrx4gMQ29MMzVmE4aUNLWaXu8Eb7piY8Mbfus + + + + +QmczEoRPanoknpuBuKNghu59r94UUx1KfDhgHKRxEpQn8Q + +QmczEoRPanoknpuBuKNghu59r94UUx1KfDhgHKRxEpQn8Q + + +QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmczEoRPanoknpuBuKNghu59r94UUx1KfDhgHKRxEpQn8Q + + + + +QmbVXn6yXFuyXcw7ykPpWuprRkPferRPGbgvCY7DNy1U5R + +QmbVXn6yXFuyXcw7ykPpWuprRkPferRPGbgvCY7DNy1U5R + + +QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmbVXn6yXFuyXcw7ykPpWuprRkPferRPGbgvCY7DNy1U5R + + + + +QmYyEnwiNCn8HgtM1PDT4oUhc3BMSVfkkPVCr4YqQarDnx + +QmYyEnwiNCn8HgtM1PDT4oUhc3BMSVfkkPVCr4YqQarDnx + + +QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmYyEnwiNCn8HgtM1PDT4oUhc3BMSVfkkPVCr4YqQarDnx + + + + +QmQjq29oa8oGtvMrGmFfEcU1JCddaoF78BeU2jzSMU2mH3 + +QmQjq29oa8oGtvMrGmFfEcU1JCddaoF78BeU2jzSMU2mH3 + + +QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmQjq29oa8oGtvMrGmFfEcU1JCddaoF78BeU2jzSMU2mH3 + + + + +Qmcqpjgdh28TGdjYat3PDUxBccRqu5Nr8hUPvdt8PF4eVq + +Qmcqpjgdh28TGdjYat3PDUxBccRqu5Nr8hUPvdt8PF4eVq + + +QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->Qmcqpjgdh28TGdjYat3PDUxBccRqu5Nr8hUPvdt8PF4eVq + + + + +QmT2zjcD5Cf4B7nLCnu6TngNuPcKciprAYTtzD3REXvzcR + +QmT2zjcD5Cf4B7nLCnu6TngNuPcKciprAYTtzD3REXvzcR + + +QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmT2zjcD5Cf4B7nLCnu6TngNuPcKciprAYTtzD3REXvzcR + + + + +QmeyCHUPSF2ke9B6nnQHdUno32D8ej98vHWyezYi6QPPSY + +QmeyCHUPSF2ke9B6nnQHdUno32D8ej98vHWyezYi6QPPSY + + +QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmeyCHUPSF2ke9B6nnQHdUno32D8ej98vHWyezYi6QPPSY + + + + +QmSHHkLpaSTBFfvtSJdTmxvP2cPMKrso66nB2d9wz4WVWE + +QmSHHkLpaSTBFfvtSJdTmxvP2cPMKrso66nB2d9wz4WVWE + + +QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmSHHkLpaSTBFfvtSJdTmxvP2cPMKrso66nB2d9wz4WVWE + + + + +QmNPGySRo1GA1EXJgferHsD43zqy5dX6urKXYsfYFXyCG5 + +QmNPGySRo1GA1EXJgferHsD43zqy5dX6urKXYsfYFXyCG5 + + +QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmNPGySRo1GA1EXJgferHsD43zqy5dX6urKXYsfYFXyCG5 + + + + +Qma3aC6KJB4Vit2f9Mi9Z7ZbKP2FfFCRbHbXY9b86fFS6B + +Qma3aC6KJB4Vit2f9Mi9Z7ZbKP2FfFCRbHbXY9b86fFS6B + + +QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->Qma3aC6KJB4Vit2f9Mi9Z7ZbKP2FfFCRbHbXY9b86fFS6B + + + + + diff --git a/content/guides/viewer/graphmd/output/graph.dot b/content/guides/viewer/graphmd/output/graph.dot new file mode 100644 index 0000000..9cb78b4 --- /dev/null +++ b/content/guides/viewer/graphmd/output/graph.dot @@ -0,0 +1,24 @@ +digraph { + graph [rankdir=LR]; + QmRCJXG7HSmprrYwDrK1GctXHgbV7EYpVcJPQPwevoQuqF [fontsize=8 shape=box]; + QmajFHHivh25Qb2cNbnnnEeUe1gDLHX9ta7hs2XKX1vazb [fontsize=8 shape=box]; + QmRCJXG7HSmprrYwDrK1GctXHgbV7EYpVcJPQPwevoQuqF -> QmajFHHivh25Qb2cNbnnnEeUe1gDLHX9ta7hs2XKX1vazb [label="cat.jpg"]; + QmRCJXG7HSmprrYwDrK1GctXHgbV7EYpVcJPQPwevoQuqF [fontsize=8 shape=box]; + QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv [fontsize=8 shape=box]; + QmRCJXG7HSmprrYwDrK1GctXHgbV7EYpVcJPQPwevoQuqF -> QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv [label="test"]; + QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv [fontsize=8 shape=box]; + QmTz3oc4gdpRMKP2sdGUPZTAGRngqjsi99BPoztyP53JMM [fontsize=8 shape=box]; + QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv -> QmTz3oc4gdpRMKP2sdGUPZTAGRngqjsi99BPoztyP53JMM [label="bar"]; + QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv [fontsize=8 shape=box]; + QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt [fontsize=8 shape=box]; + QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv -> QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt [label="baz"]; + QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt [fontsize=8 shape=box]; + QmTz3oc4gdpRMKP2sdGUPZTAGRngqjsi99BPoztyP53JMM [fontsize=8 shape=box]; + QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt -> QmTz3oc4gdpRMKP2sdGUPZTAGRngqjsi99BPoztyP53JMM [label="b"]; + QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt [fontsize=8 shape=box]; + QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6 [fontsize=8 shape=box]; + QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt -> QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6 [label="f"]; + QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv [fontsize=8 shape=box]; + QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6 [fontsize=8 shape=box]; + QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv -> QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6 [label="foo"]; +} diff --git a/content/guides/viewer/graphmd/output/graph.pdf b/content/guides/viewer/graphmd/output/graph.pdf new file mode 100644 index 0000000..e966b11 Binary files /dev/null and b/content/guides/viewer/graphmd/output/graph.pdf differ diff --git a/content/guides/viewer/graphmd/output/graph.png b/content/guides/viewer/graphmd/output/graph.png new file mode 100644 index 0000000..3d7ccf5 Binary files /dev/null and b/content/guides/viewer/graphmd/output/graph.png differ diff --git a/content/guides/viewer/graphmd/output/graph.svg b/content/guides/viewer/graphmd/output/graph.svg new file mode 100644 index 0000000..3e06c2c --- /dev/null +++ b/content/guides/viewer/graphmd/output/graph.svg @@ -0,0 +1,85 @@ + + + + + + +%3 + + +QmRCJXG7HSmprrYwDrK1GctXHgbV7EYpVcJPQPwevoQuqF + +QmRCJXG7HSmprrYwDrK1GctXHgbV7EYpVcJPQPwevoQuqF + + +QmajFHHivh25Qb2cNbnnnEeUe1gDLHX9ta7hs2XKX1vazb + +QmajFHHivh25Qb2cNbnnnEeUe1gDLHX9ta7hs2XKX1vazb + + +QmRCJXG7HSmprrYwDrK1GctXHgbV7EYpVcJPQPwevoQuqF->QmajFHHivh25Qb2cNbnnnEeUe1gDLHX9ta7hs2XKX1vazb + + +cat.jpg + + +QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv + +QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv + + +QmRCJXG7HSmprrYwDrK1GctXHgbV7EYpVcJPQPwevoQuqF->QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv + + +test + + +QmTz3oc4gdpRMKP2sdGUPZTAGRngqjsi99BPoztyP53JMM + +QmTz3oc4gdpRMKP2sdGUPZTAGRngqjsi99BPoztyP53JMM + + +QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv->QmTz3oc4gdpRMKP2sdGUPZTAGRngqjsi99BPoztyP53JMM + + +bar + + +QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt + +QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt + + +QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv->QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt + + +baz + + +QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6 + +QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6 + + +QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv->QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6 + + +foo + + +QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt->QmTz3oc4gdpRMKP2sdGUPZTAGRngqjsi99BPoztyP53JMM + + +b + + +QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt->QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6 + + +f + + + diff --git a/content/guides/viewer/ipns.md b/content/guides/viewer/ipns.md new file mode 100644 index 0000000..93682c5 --- /dev/null +++ b/content/guides/viewer/ipns.md @@ -0,0 +1,65 @@ +--- +title: The Inter-Planetary Naming System +draft: true +menu: + guides: + parent: guides +--- + +ipns is a way to add a small amount of mutability to the permanent immutability +that is ipfs. It allows you to store a reference to an ipfs hash under the +namespace of your peerID ( the hash of your public key ). The commands to set it up +are quite simple. + +First, you'll need some content to publish: + +``` +$ echo 'Let us have some mutable fun!' | ipfs add +``` + +Note the hash that was printed out, and use it here to publish it to the network: + +``` +$ ipfs name publish +Published to : +``` + +Now, to test that it worked, you could try a couple of different things: + +``` +$ ipfs name resolve + +``` + +If you ran that on the same machine, it should return instantly, as you have +cached the entry locally; give it a shot on another computer running ipfs. + +Another thing to try is viewing it on a gateway: + +``` +https://ipfs.io/ipns/ +``` + +So, now comes the fun part: Lets change things. + +``` +$ echo 'Look! Things have changed!' | ipfs add +``` + +Next, take the hash from there and... +``` +$ ipfs name publish +Published to : +``` + +Voila! Now, if you resolve that entry again, you'll see your new object. + +Congratulations! You just successfully published and resolved an ipns entry! +Note that updating an ipns entry can "break links" because anything referencing an ipns +entry might no longer point to the content it expected. There is no way around +this ( you know, mutability ), therefore, ipns links should be used carefully if +you want to ensure permanence. In the future, we may have ipns entries work as +a git commit chain, with each successive entry pointing back in time to other +values. + +By [whyrusleeping](http://github.com/whyrusleeping) diff --git a/content/guides/viewer/network.md b/content/guides/viewer/network.md new file mode 100644 index 0000000..7bb5365 --- /dev/null +++ b/content/guides/viewer/network.md @@ -0,0 +1,30 @@ +--- +title: Playing with the Network +draft: true +menu: + guides: + parent: guides +--- + +IPFS is all about networking! Included are a useful set of commands +to aid in observing the network. + +See who you're directly connected to: + +```sh +ipfs swarm peers +``` + +Manually connect to a specific peer. If the peer below doesn't work, choose one from the output of `ipfs swarm peers`. + +```sh +ipfs swarm connect /ip4/104.236.176.52/tcp/4001/ipfs/QmSoLnSGccFuZQJzRadHn95W2CrSFmZuTdDWP8HXaHca9z +``` + +Search for a given peer on the network: + +```sh +ipfs dht findpeer QmSoLnSGccFuZQJzRadHn95W2CrSFmZuTdDWP8HXaHca9z +``` + +By [whyrusleeping](http://github.com/whyrusleeping) diff --git a/content/guides/viewer/pinning.md b/content/guides/viewer/pinning.md new file mode 100644 index 0000000..6c4c2de --- /dev/null +++ b/content/guides/viewer/pinning.md @@ -0,0 +1,50 @@ +--- +title: Pinning +draft: true +menu: + guides: + parent: guides +--- + +Pinning is a very important concept in ipfs. ipfs semantics try +to make it feel like every single object is local, there is no "retrieve this +file for me from a remote server", just `ipfs cat` or `ipfs get` which act +the same way no matter where the actual object is located. While this is nice, +sometimes you want to be able to control what you keep around. Pinning is the +mechanism that allows you to tell ipfs to always keep a given object local. +ipfs has a fairly aggressive caching mechanism that will keep an object local +for a short time after you perform any ipfs operation on it, but these objects +may get garbage collected fairly regularly. To prevent that garbage collection +simply pin the hash you care about. Objects added through `ipfs add` are pinned +recursively by default. +``` +echo "ipfs rocks" > foo +ipfs add foo +ipfs pin ls --type=all +ipfs pin rm +ipfs pin rm -r +ipfs pin ls --type=all +``` + +As you may have noticed, the first `ipfs pin rm` command didnt work, it should +have warned you that the given hash was "pinned recursively". There are three +types of pins in the ipfs world; direct pins, which pin just a single block, and +no others in relation to it. recursive pins, which pin a given block and all of +its children, and indirect pins, which are the result of a given blocks parent +being pinned recursively. + +A pinned object cannot be garbage collected, if you dont believe me try this: +``` +ipfs add foo +ipfs repo gc +ipfs cat +``` + +But if foo were to somehow become unpinned... +``` +ipfs pin rm -r +ipfs repo gc +ipfs cat +``` + +By [whyrusleeping](http://github.com/whyrusleeping) diff --git a/content/guides/viewer/snapshots.md b/content/guides/viewer/snapshots.md new file mode 100644 index 0000000..3cd5402 --- /dev/null +++ b/content/guides/viewer/snapshots.md @@ -0,0 +1,52 @@ +--- +title: Snapshots +draft: true +menu: + guides: + parent: guides +--- + +Lets take a quick look at how ipfs can be used to take basic snapshots. + +Save your directory: +``` +$ ipfs add -r ~/code/myproject +``` + +Note the hash: +``` +$ echo $hash `date` >> snapshots +``` + + +Or all at once: +``` +$ echo `ipfs add -q -r ~/code/myproject | tail -n1` `date` >> snapshots +``` +(Note: the `-q` makes the output only contain the hashes, piping through +`tail -n1` ensures only the hash of the top folder is output.) + +Make sure to have the placeholders for the mount points: +``` +$ sudo mkdir /ipfs /ipns +$ sudo chown `whoami` /ipfs /ipns +``` + +You will need to have `Fuse` installed on your machine in order to be able to `mount` directories from the ipfs. You can find instructions of how to [install `Fuse` in the `go-ipfs` docs](https://github.com/ipfs/go-ipfs/blob/master/docs/fuse.md) + + +View the snapshots live: +``` +$ ipfs mount +$ ls /ipfs/$hash/ + +# can also + +$ cd /ipfs/$hash/ +$ ls +``` + +Through the fuse interface, youll be able to access your files exactly as +they were when you took the snapshot. + +By [whyrusleeping](http://github.com/whyrusleeping) diff --git a/content/guides/viewer/videos.md b/content/guides/viewer/videos.md new file mode 100644 index 0000000..54c77f0 --- /dev/null +++ b/content/guides/viewer/videos.md @@ -0,0 +1,32 @@ +--- +title: Playing Videos +draft: true +menu: + guides: + parent: guides +--- + +ipfs can be used to store and play videos. Suppose we add a video: + +``` +ipfs add -q sintel.mp4 | tail -n1 +``` + +Take the resulting hash, You can view it a couple different ways: + +On the command line: +``` +ipfs cat $vidhash | mplayer -vo xv - +``` + +Via local gateway: +``` +mplayer http://localhost:8080/ipfs/$vidhash + +# or open it up in a tab in chrome (or firefox) + +chromium http://localhost:8080/ipfs/$vidhash +``` +(Note: the gateway method works with most video players and browsers) + +By [whyrusleeping](http://github.com/whyrusleeping) diff --git a/content/guides/viewer/websites.md b/content/guides/viewer/websites.md new file mode 100644 index 0000000..61dffe6 --- /dev/null +++ b/content/guides/viewer/websites.md @@ -0,0 +1,92 @@ +--- +title: IPFS for Websites +draft: true +menu: + guides: + parent: guides +--- + +### A short guide to hosting your site on ipfs + +Adding your static website to ipfs is quite simple! Simply turn on your daemon: +```bash +$ ipfs daemon +``` + +And add the directory containing your website: +```bash +$ ls mysite +img index.html +$ ipfs add -r mysite +added QmcMN2wqoun88SVF5own7D5LUpnHwDA6ALZnVdFXhnYhAs mysite/img/spacecat.jpg +added QmS8tC5NJqajBB5qFhcA1auav14iHMnoMZJWfmr4k3EY6w mysite/img +added QmYh6HbZhHABQXrkQZ4aRRSoSa6bb9vaKoHeumWex6HRsT mysite/index.html +added QmYeAiiK1UfB8MGLRefok1N7vBTyX8hGPuMXZ4Xq1DPyt7 mysite/ +``` + +The very last hash next to the folder name is the one you want, let's call it +`$SITE_HASH` for now. + +Now, you can test it out locally by opening `http://localhost:8080/ipfs/$SITE_HASH` +in your web browser! Next, to view it coming from another ipfs node, you can try +`http://gateway.ipfs.io/ipfs/$SITE_HASH`. Cool, right? But those hashes are +rather ugly. Let's look at some ways to get rid of them. + +First, you can do a simple DNS TXT record, containing `dnslink=/ipfs/$SITE_HASH`. +Once that record propagates, you should be able to view your site at +`http://localhost:8080/ipns/your.domain`. Now that's quite a bit cleaner. +You can also try this on the gateway at `http://gateway.ipfs.io/ipns/your.domain` + +Next, you might be asking "well what if i want to change my website, DNS is slow!" +Well let me tell you about this little thing called Ipns (note the 'n'). Ipns is +the Interplanetary Naming System, you might have noticed the above link has +`/ipns/` instead of `/ipfs/`. Ipns is used for mutable content in the ipfs +network, it's relatively easy to use, and will allow you to change your website +without updating the dns record every time! So how do you use it? + +After adding your webpage, simply do: +```bash +$ ipfs name publish $SITE_HASH +Published to : /ipfs/$SITE_HASH +``` + +(Disclaimer: When using IPNS to update websites, it's important to think about that +assets could be loaded from two different resolved hashes when updating your website, +leading to outdated/missing assets unless accounted for) + +Now, you can test that it worked by viewing: `http://localhost:8080/ipns/`. +And also try the same link on the public gateway. Once you're convinced that works, +let's again hide the hash. Change your DNS TXT record to `dnslink=/ipns/`, +wait for that record to propagate, and then try accessing `http://localhost:8080/ipns/your.domain`. + +At this point, you have a website on ipfs/ipns, and you may be wondering how +you could expose it at `http://your.domain`, so that the Internet users of +today may access it too without them having to know about any of this. It's +actually surprisingly simple to do, all you need for this is your previously +created TXT record and to point the A record of `your.domain` to the IP +address of an ipfs daemon that listens on port 80 for HTTP requests (such as +`gateway.ipfs.io`). The users' browsers will send `your.domain` in the Host +header of the requests, and you have your dnslink TXT records, so the ipfs +gateway will recognize `your.domain` as an IPNS name, and so it will serve +from under `/ipns/your.domain/` instead of `/`. + +So, if you point `your.domain`'s A record to the IP of `gateway.ipfs.io`, and +then wait for the DNS to propagate, then anyone should be able to access your +ipfs-hosted site without any extra configuration simply at +`http://your.domain`. + +Alternatively, it is possible to use CNAME records to point at the DNS records +of the gateway. This way, IP addresses of the gateway are automatically +updated. Note however that CNAME records to not allow for other records, such +as a TXT to refer to the ipfs/ipns record. Because of this, ipfs allows to +create a DNS TXT record for `_dnslink.your.domain` with +`dnslink=/ipns/`. + +So by creating a CNAME for `your.domain` to `gateway.ipfs.io` and adding a +`_dnslink.your.domain` record with `dnslink=/ipns/` you can host +your website without explicitly referring to IP addresses of the ipfs gateway. + +Happy Hacking! + +By +[Whyrusleeping](https://github.com/whyrusleeping) diff --git a/content/introduction/_index.md b/content/introduction/_index.md new file mode 100644 index 0000000..17c3837 --- /dev/null +++ b/content/introduction/_index.md @@ -0,0 +1,9 @@ +--- +title: "Introduction" +headless: true +opened: true +# menu: +# docs: +# identifier: section:start +# weight: 1 +--- diff --git a/content/introduction/faq.md b/content/introduction/faq.md new file mode 100644 index 0000000..9ea158a --- /dev/null +++ b/content/introduction/faq.md @@ -0,0 +1,6 @@ +--- +title: FAQ +# This is a terrible hack to get external links in `section:` sections +# TODO: fix the nav so this isn't needed. +external: "https://discuss.ipfs.io/c/help/Old-FAQ" +--- diff --git a/content/introduction/install.md b/content/introduction/install.md new file mode 100644 index 0000000..fe0c847 --- /dev/null +++ b/content/introduction/install.md @@ -0,0 +1,217 @@ +--- +title: Install IPFS +weight: 1 +--- + + + +There are a variety of ways to install a copy of IPFS on your system. We generally recommend [installing a prebuilt package](#installing-from-a-prebuilt-package), but here are a few other supported options: + +* [Installing from a Prebuilt Package](#installing-from-a-prebuilt-package) (recommended) +* [Installing with ipfs-update](#installing-with-ipfs-update) +* [Building from source](#building-from-source) +* [Upgrading IPFS](#upgrading-ipfs) +* [Troubleshooting](#troubleshooting) + +Note these instructions all make use of the **command line.** We use `$` to indicate the command prompt — commands to type are on lines that are prefixed with that, while output lines are un-prefixed. + +--- + +## Installing from a Prebuilt Package + +First, download the right version of IPFS for your platform: + + + Download IPFS for your platform    + + +### Mac OS X and Linux + +After downloading, untar the archive, and move the `ipfs` binary somewhere in your executables `$PATH` using the `install.sh` script: + +```sh +$ tar xvfz go-ipfs.tar.gz +$ cd go-ipfs +$ ./install.sh +``` + +Test it out: + +```sh +$ ipfs help +USAGE: + + ipfs - Global p2p merkle-dag filesystem. +... +``` + +Congratulations! You now have a working IPFS installation on your computer. + +}}" role="button"> + General Usage    + + +### Windows + +After downloading, unzip the archive, and move `ipfs.exe` somewhere in your `%PATH%`. + +Test it out: + +```sh +$ ipfs help +USAGE: + + ipfs - Global p2p merkle-dag filesystem. +... +``` + +Congratulations! You now have a working IPFS installation on your computer. + +}}" role="button"> + General Usage    + + + +--- + +## Installing with ipfs-update + +`ipfs-update` is a command-line tool to install and upgrade the `ipfs` binary. + +### Getting ipfs-update + +`ipfs-update` can be downloaded for your platform at: https://dist.ipfs.io/#ipfs-update + +If you have a working Go environment (>=1.8), you can also install it with: +``` +$ go get -u github.com/ipfs/ipfs-update +``` + + +When installing new versions of `ipfs` or upgrading make sure you are using the latest version of `ipfs-update`. + +### Installing ipfs with ipfs-update + +`ipfs-update versions` lists all the available `ipfs` versions which are available for download: + +``` +$ ipfs-update versions +v0.3.2 +v0.3.4 +v0.3.5 +v0.3.6 +v0.3.7 +v0.3.8 +v0.3.9 +v0.3.10 +v0.3.11 +v0.4.0 +v0.4.1 +v0.4.2 +v0.4.3 +v0.4.4 +v0.4.5 +v0.4.6 +v0.4.7-rc1 +``` + + +`ipfs-update install latest` will install the latest available version: + +``` +$ ipfs-update install latest +fetching go-ipfs version v0.4.7-rc1 +binary downloaded, verifying... +success! +stashing old binary +installing new binary to /home/hector/go/bin/ipfs +checking if repo migration is needed... +Installation complete! +``` + +Note that the latest available version may not be stable (i.e. release candidates +in the form `vX.X.X-rcX`). So it is recommended to specify the version you want +to install, for example: `ipfs-update install v0.4.6`. + +--- + +## Building from Source + +
+ Warning: In the past you could install IPFS using go get. This + does not work anymore! +
+ +If you want, you can also build IPFS from source. +If you are on Mac OS X or Linux take a look at [the readme](https://github.com/ipfs/go-ipfs#build-from-source) for install instructions. +If you are on Windows take a look at [this document](https://github.com/ipfs/go-ipfs/blob/master/docs/windows.md) for instructions. + +--- + +## Upgrading IPFS + +`ipfs` upgrades (and downgrades) may involve a repository upgrade process performed by the +[fs-repo-migrations](https://dist.ipfs.io/#fs-repo-migrations) tool. + +### Upgrading using ipfs-update + +`ipfs-update install` will download and run `fs-repo-migrations` when needed, during the installation of +a newer or older `ipfs` version (as explained above). This is the easiest way of upgrading. + +
+ Warning: Make sure that the ipfs daemon is not running during an upgrade +
+ + +### Upgrading manually + +In order to perform a manual upgrade of `ipfs`, you will need to manually run any repository migrations. The +procedure is as follows: + +* Stop the `ipfs` daemon if it is running +* Optionally backup your `ipfs` data folder (i.e. `cp -aL ~/.ipfs ~/.ipfs.bk`) +* Download and install the latest version of `ipfs` from [https://dist.ipfs.io/#go-ipfs](https://dist.ipfs.io/#go-ipfs) +* Run `ipfs daemon`. + +When a repository migration is necessary, `ipfs` will inform the user, download and install `fs-repo-migrations` +and perform the upgrade. If you wish the procedure to happen unattended, launch the daemon with the `--migrate` +flag. + +Migrations can be also run manually by downloading the latest version of `fs-repo-migrations` +from [https://dist.ipfs.io/#fs-repo-migrations](https://dist.ipfs.io/#fs-repo-migrations) and +[following these instructions](https://github.com/ipfs/fs-repo-migrations/blob/master/run.md). + +--- + +## Troubleshooting + +### Help! + +If you have any problems, come get live help at +[#ipfs](../#community) or via [the mailing list](../#community). + +### Check Go Version + +IPFS works with Go 1.7.0 or later. +To check what go version you have installed, type `go version`. +Here's what I get: + +```sh +$ go version +go version go1.7 linux/amd64 +``` + +If you need to update, it is recommended to install from the +[canonical Go packages](https://golang.org/doc/install). +Package managers often contain out-of-date Go packages. + +### Install FUSE + +For more details on setting up FUSE (so that you can mount the filesystem), see [github.com/ipfs/go-ipfs/blob/master/docs/fuse.md](https://github.com/ipfs/go-ipfs/blob/master/docs/fuse.md) diff --git a/content/introduction/usage.md b/content/introduction/usage.md new file mode 100644 index 0000000..0ac6d27 --- /dev/null +++ b/content/introduction/usage.md @@ -0,0 +1,171 @@ +--- +title: Basic Usage +weight: 2 +--- + +If you haven't done so, [install IPFS](../install). + +During this tutorial, if you have any questions, feel free to ask them in [https://discuss.ipfs.io/](https://discuss.ipfs.io/) or in [#ipfs on chat.freenode.net](irc://chat.freenode.net/%23ipfs). + +## Initialize the repository + +`ipfs` stores all its settings and internal data in a directory called the *repository.* Before using IPFS for the first time, you’ll need to initialize the repository with the `ipfs init` command: + +```sh +> ipfs init +initializing ipfs node at /Users/jbenet/.go-ipfs +generating 2048-bit RSA keypair...done +peer identity: Qmcpo2iLBikrdf1d6QU6vXuNb6P7hwrbNPW9kLAH8eG67z +to get started, enter: + + ipfs cat /ipfs/QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG/readme + +``` + +
+

+ If you are running on a server in a data center, you should initialize IPFS with the server profile. This will prevent IPFS from creating a lot of data center-internal traffic trying to discover local nodes: +

+ +
> ipfs init --profile server
+ +

+ There are a whole host of other configuration options you may want to set — check the full reference for more. +

+
+ +
+ The hash after peer identity: is your node’s ID and will be different from the one shown in the above output. Other nodes on the network use it to find and connect to you. You can run ipfs id at any time to get it again if you need it. +
+ +
+ The HASH in the ipfs cat /ipfs/HASH/readme line above may differ from the HASH in your output. If it does, use the one you got in the following instructions. Be sure not to confuse these hashes with your peer identity hash; ipfs cat /ipfs/PEER_ID/readme won't work. +
+ +Now, try running: + +```sh +ipfs cat /ipfs/QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG/readme +``` + +You should see something like this: + +``` +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 + +``` + +You can explore other objects in there. In particular, check out `quick-start`: + + +```sh +ipfs cat /ipfs/QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG/quick-start +``` + +Which will walk you through several interesting examples. + +## Going Online + +Once you're ready to take things online, run the daemon in another terminal: + +```sh +> ipfs daemon +Initializing daemon... +API server listening on /ip4/127.0.0.1/tcp/5001 +Gateway server listening on /ip4/127.0.0.1/tcp/8080 +``` + +Wait for all three lines to appear. + +
+Make note of the tcp ports you get. If they are different, use yours in the commands below. +
+ +Now, switch back to your original terminal. If you're connected to the network, +you should be able to see the ipfs addresses of your peers when you run: + +```sh +> ipfs swarm peers +/ip4/104.131.131.82/tcp/4001/ipfs/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ +/ip4/104.236.151.122/tcp/4001/ipfs/QmSoLju6m7xTh3DuokvT3886QRYqxAzb1kShaanJgW36yx +/ip4/134.121.64.93/tcp/1035/ipfs/QmWHyrPWQnsz1wxHR219ooJDYTvxJPyZuDUPSDpdsAovN5 +/ip4/178.62.8.190/tcp/4002/ipfs/QmdXzZ25cyzSF99csCQmmPZ1NTbWTe8qtKFaZKpZQPdTFB +``` + +These are a combination of `/ipfs/`. + +Now, you should be able to get objects from the network. Try: + +``` +ipfs cat /ipfs/QmW2WQi7j6c7UgJTarActp7tDNikE4B2qXtFCfLPdsgaTQ/cat.jpg >cat.jpg +open cat.jpg +``` + +And, you should be able to give the network objects. Try adding one, and then +viewing it in your favorite browser. In this example, we are using `curl` +as our browser, but you can open the IPFS URL in other browsers as well: + +``` +> hash=`echo "I <3 IPFS -$(whoami)" | ipfs add -q` +> curl "https://ipfs.io/ipfs/$hash" +I <3 IPFS - +``` + +Cool, huh? The gateway served a file _from your computer_. The gateway queried +the DHT, found your machine, requested the file, your machine sent it to the +gateway, and the gateway sent it to your browser. + +
+ Note: depending on the state of the network, curl may take a while. The public gateways may be overloaded or having a hard time reaching you. +
+ +You can also check it out at your own local gateway: + +``` +> curl "http://127.0.0.1:8080/ipfs/$hash" +I <3 IPFS - +``` + +By default, your gateway is not exposed to the world, it only works locally. + +## Fancy Web Console + +We also have a web console you can use to check the state of your node. +On your favorite web browser, go to: + +
http://localhost:5001/webui
+ +This should bring up a console like this: + +Web console connection view + +Now, you're ready: + +}}" role="button"> + Onward to more Examples    + diff --git a/content/introduction/webui-connection.png b/content/introduction/webui-connection.png new file mode 100644 index 0000000..f9edd31 Binary files /dev/null and b/content/introduction/webui-connection.png differ diff --git a/content/reference/api/_index.md b/content/reference/api/_index.md new file mode 100644 index 0000000..1b02f42 --- /dev/null +++ b/content/reference/api/_index.md @@ -0,0 +1,5 @@ +--- +title: "Commands & API" +headless: true +opened: true +--- diff --git a/content/reference/api/cli.md b/content/reference/api/cli.md new file mode 100644 index 0000000..be3f632 --- /dev/null +++ b/content/reference/api/cli.md @@ -0,0 +1,3870 @@ +--- +title: "CLI Commands" +identifier: clicommands +weight: 10 +menu: + reference: + parent: api +--- + + + + +**Note:** IPFS can run in either “online” (you have IPFS running separately as a daemon process) or “offline” mode, but some commands are only supported when online. For example `ipfs swarm peers` only works in online mode because you won’t be connected to a swarm at all if you’re offline. For more about running IPFS as a daemon, see [“going online” in the usage documentation]({{< relref "usage.md#going-online" >}}). + +*Generated on 2018-04-09 13:54:54.079504* + +- [ipfs](#ipfs) +- [ipfs add](#ipfs-add) +- [ipfs bitswap](#ipfs-bitswap) +- [ipfs bitswap ledger](#ipfs-bitswap-ledger) +- [ipfs bitswap reprovide](#ipfs-bitswap-reprovide) +- [ipfs bitswap stat](#ipfs-bitswap-stat) +- [ipfs bitswap unwant](#ipfs-bitswap-unwant) +- [ipfs bitswap wantlist](#ipfs-bitswap-wantlist) +- [ipfs block](#ipfs-block) +- [ipfs block get](#ipfs-block-get) +- [ipfs block put](#ipfs-block-put) +- [ipfs block rm](#ipfs-block-rm) +- [ipfs block stat](#ipfs-block-stat) +- [ipfs bootstrap](#ipfs-bootstrap) +- [ipfs bootstrap add](#ipfs-bootstrap-add) +- [ipfs bootstrap add default](#ipfs-bootstrap-add-default) +- [ipfs bootstrap list](#ipfs-bootstrap-list) +- [ipfs bootstrap rm](#ipfs-bootstrap-rm) +- [ipfs bootstrap rm all](#ipfs-bootstrap-rm-all) +- [ipfs cat](#ipfs-cat) +- [ipfs commands](#ipfs-commands) +- [ipfs config](#ipfs-config) +- [ipfs config edit](#ipfs-config-edit) +- [ipfs config profile](#ipfs-config-profile) +- [ipfs config profile apply](#ipfs-config-profile-apply) +- [ipfs config replace](#ipfs-config-replace) +- [ipfs config show](#ipfs-config-show) +- [ipfs daemon](#ipfs-daemon) +- [ipfs dag](#ipfs-dag) +- [ipfs dag get](#ipfs-dag-get) +- [ipfs dag put](#ipfs-dag-put) +- [ipfs dag resolve](#ipfs-dag-resolve) +- [ipfs dht](#ipfs-dht) +- [ipfs dht findpeer](#ipfs-dht-findpeer) +- [ipfs dht findprovs](#ipfs-dht-findprovs) +- [ipfs dht get](#ipfs-dht-get) +- [ipfs dht provide](#ipfs-dht-provide) +- [ipfs dht put](#ipfs-dht-put) +- [ipfs dht query](#ipfs-dht-query) +- [ipfs diag](#ipfs-diag) +- [ipfs diag cmds](#ipfs-diag-cmds) +- [ipfs diag cmds clear](#ipfs-diag-cmds-clear) +- [ipfs diag cmds set-time](#ipfs-diag-cmds-set-time) +- [ipfs diag sys](#ipfs-diag-sys) +- [ipfs dns](#ipfs-dns) +- [ipfs file](#ipfs-file) +- [ipfs file ls](#ipfs-file-ls) +- [ipfs files](#ipfs-files) +- [ipfs files chcid](#ipfs-files-chcid) +- [ipfs files cp](#ipfs-files-cp) +- [ipfs files flush](#ipfs-files-flush) +- [ipfs files ls](#ipfs-files-ls) +- [ipfs files mkdir](#ipfs-files-mkdir) +- [ipfs files mv](#ipfs-files-mv) +- [ipfs files read](#ipfs-files-read) +- [ipfs files rm](#ipfs-files-rm) +- [ipfs files stat](#ipfs-files-stat) +- [ipfs files write](#ipfs-files-write) +- [ipfs filestore](#ipfs-filestore) +- [ipfs filestore dups](#ipfs-filestore-dups) +- [ipfs filestore ls](#ipfs-filestore-ls) +- [ipfs filestore verify](#ipfs-filestore-verify) +- [ipfs get](#ipfs-get) +- [ipfs id](#ipfs-id) +- [ipfs init](#ipfs-init) +- [ipfs key](#ipfs-key) +- [ipfs key gen](#ipfs-key-gen) +- [ipfs key list](#ipfs-key-list) +- [ipfs key rename](#ipfs-key-rename) +- [ipfs key rm](#ipfs-key-rm) +- [ipfs log](#ipfs-log) +- [ipfs log level](#ipfs-log-level) +- [ipfs log ls](#ipfs-log-ls) +- [ipfs log tail](#ipfs-log-tail) +- [ipfs ls](#ipfs-ls) +- [ipfs mount](#ipfs-mount) +- [ipfs name](#ipfs-name) +- [ipfs name publish](#ipfs-name-publish) +- [ipfs name pubsub](#ipfs-name-pubsub) +- [ipfs name pubsub cancel](#ipfs-name-pubsub-cancel) +- [ipfs name pubsub state](#ipfs-name-pubsub-state) +- [ipfs name pubsub subs](#ipfs-name-pubsub-subs) +- [ipfs name resolve](#ipfs-name-resolve) +- [ipfs object](#ipfs-object) +- [ipfs object data](#ipfs-object-data) +- [ipfs object diff](#ipfs-object-diff) +- [ipfs object get](#ipfs-object-get) +- [ipfs object links](#ipfs-object-links) +- [ipfs object new](#ipfs-object-new) +- [ipfs object patch](#ipfs-object-patch) +- [ipfs object patch add-link](#ipfs-object-patch-add-link) +- [ipfs object patch append-data](#ipfs-object-patch-append-data) +- [ipfs object patch rm-link](#ipfs-object-patch-rm-link) +- [ipfs object patch set-data](#ipfs-object-patch-set-data) +- [ipfs object put](#ipfs-object-put) +- [ipfs object stat](#ipfs-object-stat) +- [ipfs p2p](#ipfs-p2p) +- [ipfs p2p listener](#ipfs-p2p-listener) +- [ipfs p2p listener close](#ipfs-p2p-listener-close) +- [ipfs p2p listener ls](#ipfs-p2p-listener-ls) +- [ipfs p2p listener open](#ipfs-p2p-listener-open) +- [ipfs p2p stream](#ipfs-p2p-stream) +- [ipfs p2p stream close](#ipfs-p2p-stream-close) +- [ipfs p2p stream dial](#ipfs-p2p-stream-dial) +- [ipfs p2p stream ls](#ipfs-p2p-stream-ls) +- [ipfs pin](#ipfs-pin) +- [ipfs pin add](#ipfs-pin-add) +- [ipfs pin ls](#ipfs-pin-ls) +- [ipfs pin rm](#ipfs-pin-rm) +- [ipfs pin update](#ipfs-pin-update) +- [ipfs pin verify](#ipfs-pin-verify) +- [ipfs ping](#ipfs-ping) +- [ipfs pubsub](#ipfs-pubsub) +- [ipfs pubsub ls](#ipfs-pubsub-ls) +- [ipfs pubsub peers](#ipfs-pubsub-peers) +- [ipfs pubsub pub](#ipfs-pubsub-pub) +- [ipfs pubsub sub](#ipfs-pubsub-sub) +- [ipfs refs](#ipfs-refs) +- [ipfs refs local](#ipfs-refs-local) +- [ipfs repo](#ipfs-repo) +- [ipfs repo fsck](#ipfs-repo-fsck) +- [ipfs repo gc](#ipfs-repo-gc) +- [ipfs repo stat](#ipfs-repo-stat) +- [ipfs repo verify](#ipfs-repo-verify) +- [ipfs repo version](#ipfs-repo-version) +- [ipfs resolve](#ipfs-resolve) +- [ipfs shutdown](#ipfs-shutdown) +- [ipfs stats](#ipfs-stats) +- [ipfs stats bitswap](#ipfs-stats-bitswap) +- [ipfs stats bw](#ipfs-stats-bw) +- [ipfs stats repo](#ipfs-stats-repo) +- [ipfs swarm](#ipfs-swarm) +- [ipfs swarm addrs](#ipfs-swarm-addrs) +- [ipfs swarm addrs listen](#ipfs-swarm-addrs-listen) +- [ipfs swarm addrs local](#ipfs-swarm-addrs-local) +- [ipfs swarm connect](#ipfs-swarm-connect) +- [ipfs swarm disconnect](#ipfs-swarm-disconnect) +- [ipfs swarm filters](#ipfs-swarm-filters) +- [ipfs swarm filters add](#ipfs-swarm-filters-add) +- [ipfs swarm filters rm](#ipfs-swarm-filters-rm) +- [ipfs swarm peers](#ipfs-swarm-peers) +- [ipfs tar](#ipfs-tar) +- [ipfs tar add](#ipfs-tar-add) +- [ipfs tar cat](#ipfs-tar-cat) +- [ipfs update](#ipfs-update) +- [ipfs version](#ipfs-version) + +## ipfs + +``` +USAGE + ipfs - Global p2p merkle-dag filesystem. + +SYNOPSIS + ipfs [--config= | -c] [--debug= | -D] [--help=] [-h=] [--local= | -L] [--api=] ... + +OPTIONS + + -c, --config string - Path to the configuration file to use. + -D, --debug bool - Operate in debug mode. + --help bool - Show the full command help text. + -h bool - Show a short version of the command help text. + -L, --local bool - Run the command locally, instead of using the daemon. + --api string - Use a specific API instance (defaults to /ip4/127.0.0.1/tcp/5001). + --enc, --encoding string - The encoding type the output should be encoded with (json, xml, or text). Default: text. + --stream-channels bool - Stream channel output. + --timeout string - set a global timeout on the command. + +SUBCOMMANDS + BASIC COMMANDS + init Initialize ipfs local configuration + add Add a file to IPFS + cat Show IPFS object data + get Download IPFS objects + ls List links from an object + refs List hashes of links from an object + + DATA STRUCTURE COMMANDS + block Interact with raw blocks in the datastore + object Interact with raw dag nodes + files Interact with objects as if they were a unix filesystem + dag Interact with IPLD documents (experimental) + + ADVANCED COMMANDS + daemon Start a long-running daemon process + mount Mount an IPFS read-only mountpoint + resolve Resolve any type of name + name Publish and resolve IPNS names + key Create and list IPNS name keypairs + dns Resolve DNS links + pin Pin objects to local storage + repo Manipulate the IPFS repository + stats Various operational stats + p2p Libp2p stream mounting + filestore Manage the filestore (experimental) + + NETWORK COMMANDS + id Show info about IPFS peers + bootstrap Add or remove bootstrap peers + swarm Manage connections to the p2p network + dht Query the DHT for values or peers + ping Measure the latency of a connection + diag Print diagnostics + + TOOL COMMANDS + config Manage configuration + version Show ipfs version information + update Download and apply go-ipfs updates + commands List all available commands + + Use 'ipfs --help' to learn more about each command. + + ipfs uses a repository in the local file system. By default, the repo is + located at ~/.ipfs. To change the repo location, set the $IPFS_PATH + environment variable: + + export IPFS_PATH=/path/to/ipfsrepo + + EXIT STATUS + + The CLI will exit with one of the following values: + + 0 Successful execution. + 1 Failed executions. + + Use 'ipfs --help' for more information about each command. +``` + +## ipfs add + +``` +USAGE + ipfs add ... - Add a file or directory to ipfs. + +SYNOPSIS + ipfs add [--recursive | -r] [--quiet | -q] [--quieter | -Q] [--silent] [--progress | -p] [--trickle | -t] [--only-hash | -n] [--wrap-with-directory | -w] [--hidden | -H] [--chunker= | -s] [--pin=false] [--raw-leaves] [--nocopy] [--fscache] [--cid-version=] [--hash=] [--] ... + +ARGUMENTS + + ... - The path to a file to be added to ipfs. + +OPTIONS + + -r, --recursive bool - Add directory paths recursively. Default: false. + -q, --quiet bool - Write minimal output. + -Q, --quieter bool - Write only final hash. + --silent bool - Write no output. + -p, --progress bool - Stream progress data. + -t, --trickle bool - Use trickle-dag format for dag generation. + -n, --only-hash bool - Only chunk and hash - do not write to disk. + -w, --wrap-with-directory bool - Wrap files with a directory object. + -H, --hidden bool - Include files that are hidden. Only takes effect on recursive add. + -s, --chunker string - Chunking algorithm, size-[bytes] or rabin-[min]-[avg]-[max]. Default: size-262144. + --pin bool - Pin this object when adding. Default: true. + --raw-leaves bool - Use raw blocks for leaf nodes. (experimental). + --nocopy bool - Add the file using filestore. Implies raw-leaves. (experimental). + --fscache bool - Check the filestore for pre-existing blocks. (experimental). + --cid-version int - CID version. Defaults to 0 unless an option that depends on CIDv1 is passed. (experimental). + --hash string - Hash function to use. Implies CIDv1 if not sha2-256. (experimental). Default: sha2-256. + +DESCRIPTION + + Adds contents of to ipfs. Use -r to add directories. + Note that directories are added recursively, to form the ipfs + MerkleDAG. + + The wrap option, '-w', wraps the file (or files, if using the + recursive option) in a directory. This directory contains only + the files which have been added, and means that the file retains + its filename. For example: + + > ipfs add example.jpg + added QmbFMke1KXqnYyBBWxB74N4c5SBnJMVAiMNRcGu6x1AwQH example.jpg + > ipfs add example.jpg -w + added QmbFMke1KXqnYyBBWxB74N4c5SBnJMVAiMNRcGu6x1AwQH example.jpg + added QmaG4FuMqEBnQNn3C8XJ5bpW8kLs7zq2ZXgHptJHbKDDVx + + You can now refer to the added file in a gateway, like so: + + /ipfs/QmaG4FuMqEBnQNn3C8XJ5bpW8kLs7zq2ZXgHptJHbKDDVx/example.jpg + + The chunker option, '-s', specifies the chunking strategy that dictates + how to break files into blocks. Blocks with same content can + be deduplicated. The default is a fixed block size of + 256 * 1024 bytes, 'size-262144'. Alternatively, you can use the + rabin chunker for content defined chunking by specifying + rabin-[min]-[avg]-[max] (where min/avg/max refer to the resulting + chunk sizes). Using other chunking strategies will produce + different hashes for the same file. + + > ipfs add --chunker=size-2048 ipfs-logo.svg + added QmafrLBfzRLV4XSH1XcaMMeaXEUhDJjmtDfsYU95TrWG87 ipfs-logo.svg + > ipfs add --chunker=rabin-512-1024-2048 ipfs-logo.svg + added Qmf1hDN65tR55Ubh2RN1FPxr69xq3giVBz1KApsresY8Gn ipfs-logo.svg + + You can now check what blocks have been created by: + + > ipfs object links QmafrLBfzRLV4XSH1XcaMMeaXEUhDJjmtDfsYU95TrWG87 + QmY6yj1GsermExDXoosVE3aSPxdMNYr6aKuw3nA8LoWPRS 2059 + Qmf7ZQeSxq2fJVJbCmgTrLLVN9tDR9Wy5k75DxQKuz5Gyt 1195 + > ipfs object links Qmf1hDN65tR55Ubh2RN1FPxr69xq3giVBz1KApsresY8Gn + QmY6yj1GsermExDXoosVE3aSPxdMNYr6aKuw3nA8LoWPRS 2059 + QmerURi9k4XzKCaaPbsK6BL5pMEjF7PGphjDvkkjDtsVf3 868 + QmQB28iwSriSUSMqG2nXDTLtdPHgWb4rebBrU7Q1j4vxPv 338 +``` + +## ipfs bitswap + +``` +USAGE + ipfs bitswap - Interact with the bitswap agent. + +SYNOPSIS + ipfs bitswap + +SUBCOMMANDS + ipfs bitswap ledger - Show the current ledger for a peer. + ipfs bitswap reprovide - Trigger reprovider. + ipfs bitswap stat - Show some diagnostic information on the bitswap agent. + ipfs bitswap unwant ... - Remove a given block from your wantlist. + ipfs bitswap wantlist - Show blocks currently on the wantlist. + + Use 'ipfs bitswap --help' for more information about each command. +``` + +## ipfs bitswap ledger + +``` +USAGE + ipfs bitswap ledger - Show the current ledger for a peer. + +SYNOPSIS + ipfs bitswap ledger [--] + +ARGUMENTS + + - The PeerID (B58) of the ledger to inspect. + +DESCRIPTION + + The Bitswap decision engine tracks the number of bytes exchanged between IPFS + nodes, and stores this information as a collection of ledgers. This command + prints the ledger associated with a given peer. +``` + +## ipfs bitswap reprovide + +``` +USAGE + ipfs bitswap reprovide - Trigger reprovider. + +SYNOPSIS + ipfs bitswap reprovide + +DESCRIPTION + + Trigger reprovider to announce our data to network. +``` + +## ipfs bitswap stat + +``` +USAGE + ipfs bitswap stat - Show some diagnostic information on the bitswap agent. + +SYNOPSIS + ipfs bitswap stat +``` + +## ipfs bitswap unwant + +``` +USAGE + ipfs bitswap unwant ... - Remove a given block from your wantlist. + +SYNOPSIS + ipfs bitswap unwant [--] ... + +ARGUMENTS + + ... - Key(s) to remove from your wantlist. +``` + +## ipfs bitswap wantlist + +``` +USAGE + ipfs bitswap wantlist - Show blocks currently on the wantlist. + +SYNOPSIS + ipfs bitswap wantlist [--peer= | -p] + +OPTIONS + + -p, --peer string - Specify which peer to show wantlist for. Default: self. + +DESCRIPTION + + Print out all blocks currently on the bitswap wantlist for the local peer. +``` + +## ipfs block + +``` +USAGE + ipfs block - Interact with raw IPFS blocks. + +SYNOPSIS + ipfs block + +DESCRIPTION + + 'ipfs block' is a plumbing command used to manipulate raw IPFS blocks. + Reads from stdin or writes to stdout, and is a base58 encoded + multihash. + +SUBCOMMANDS + ipfs block get - Get a raw IPFS block. + ipfs block put - Store input as an IPFS block. + ipfs block rm ... - Remove IPFS block(s). + ipfs block stat - Print information of a raw IPFS block. + + Use 'ipfs block --help' for more information about each command. +``` + +## ipfs block get + +``` +USAGE + ipfs block get - Get a raw IPFS block. + +SYNOPSIS + ipfs block get [--] + +ARGUMENTS + + - The base58 multihash of an existing block to get. + +DESCRIPTION + + 'ipfs block get' is a plumbing command for retrieving raw IPFS blocks. + It outputs to stdout, and is a base58 encoded multihash. +``` + +## ipfs block put + +``` +USAGE + ipfs block put - Store input as an IPFS block. + +SYNOPSIS + ipfs block put [--format= | -f] [--mhtype=] [--mhlen=] [--] + +ARGUMENTS + + - The data to be stored as an IPFS block. + +OPTIONS + + -f, --format string - cid format for blocks to be created with. Default: v0. + --mhtype string - multihash hash function. Default: sha2-256. + --mhlen int - multihash hash length. Default: -1. + +DESCRIPTION + + 'ipfs block put' is a plumbing command for storing raw IPFS blocks. + It reads from stdin, and is a base58 encoded multihash. +``` + +## ipfs block rm + +``` +USAGE + ipfs block rm ... - Remove IPFS block(s). + +SYNOPSIS + ipfs block rm [--force | -f] [--quiet | -q] [--] ... + +ARGUMENTS + + ... - Bash58 encoded multihash of block(s) to remove. + +OPTIONS + + -f, --force bool - Ignore nonexistent blocks. + -q, --quiet bool - Write minimal output. + +DESCRIPTION + + 'ipfs block rm' is a plumbing command for removing raw ipfs blocks. + It takes a list of base58 encoded multihashs to remove. +``` + +## ipfs block stat + +``` +USAGE + ipfs block stat - Print information of a raw IPFS block. + +SYNOPSIS + ipfs block stat [--] + +ARGUMENTS + + - The base58 multihash of an existing block to stat. + +DESCRIPTION + + 'ipfs block stat' is a plumbing command for retrieving information + on raw IPFS blocks. It outputs the following to stdout: + + Key - the base58 encoded multihash + Size - the size of the block in bytes +``` + +## ipfs bootstrap + +``` +USAGE + ipfs bootstrap - Show or edit the list of bootstrap peers. + +SYNOPSIS + ipfs bootstrap + +DESCRIPTION + + Running 'ipfs bootstrap' with no arguments will run 'ipfs bootstrap list'. + + SECURITY WARNING: + + The bootstrap command manipulates the "bootstrap list", which contains + the addresses of bootstrap nodes. These are the *trusted peers* from + which to learn about other peers in the network. Only edit this list + if you understand the risks of adding or removing nodes from this list. + +SUBCOMMANDS + ipfs bootstrap add []... - Add peers to the bootstrap list. + ipfs bootstrap list - Show peers in the bootstrap list. + ipfs bootstrap rm []... - Remove peers from the bootstrap list. + + Use 'ipfs bootstrap --help' for more information about each command. +``` + +## ipfs bootstrap add + +``` +USAGE + ipfs bootstrap add []... - Add peers to the bootstrap list. + +SYNOPSIS + ipfs bootstrap add [--default] [--] [...] + +ARGUMENTS + + []... - A peer to add to the bootstrap list (in the format '/') + +OPTIONS + + --default bool - Add default bootstrap nodes. (Deprecated, use 'default' subcommand instead). + +DESCRIPTION + + Outputs a list of peers that were added (that weren't already + in the bootstrap list). + + SECURITY WARNING: + + The bootstrap command manipulates the "bootstrap list", which contains + the addresses of bootstrap nodes. These are the *trusted peers* from + which to learn about other peers in the network. Only edit this list + if you understand the risks of adding or removing nodes from this list. + +SUBCOMMANDS + ipfs bootstrap add default - Add default peers to the bootstrap list. + + Use 'ipfs bootstrap add --help' for more information about each command. +``` + +## ipfs bootstrap add default + +``` +USAGE + ipfs bootstrap add default - Add default peers to the bootstrap list. + +SYNOPSIS + ipfs bootstrap add default + +DESCRIPTION + + Outputs a list of peers that were added (that weren't already + in the bootstrap list). +``` + +## ipfs bootstrap list + +``` +USAGE + ipfs bootstrap list - Show peers in the bootstrap list. + +SYNOPSIS + ipfs bootstrap list + +DESCRIPTION + + Peers are output in the format '/'. +``` + +## ipfs bootstrap rm + +``` +USAGE + ipfs bootstrap rm []... - Remove peers from the bootstrap list. + +SYNOPSIS + ipfs bootstrap rm [--all] [--] [...] + +ARGUMENTS + + []... - A peer to add to the bootstrap list (in the format '/') + +OPTIONS + + --all bool - Remove all bootstrap peers. (Deprecated, use 'all' subcommand). + +DESCRIPTION + + Outputs the list of peers that were removed. + + SECURITY WARNING: + + The bootstrap command manipulates the "bootstrap list", which contains + the addresses of bootstrap nodes. These are the *trusted peers* from + which to learn about other peers in the network. Only edit this list + if you understand the risks of adding or removing nodes from this list. + +SUBCOMMANDS + ipfs bootstrap rm all - Remove all peers from the bootstrap list. + + Use 'ipfs bootstrap rm --help' for more information about each command. +``` + +## ipfs bootstrap rm all + +``` +USAGE + ipfs bootstrap rm all - Remove all peers from the bootstrap list. + +SYNOPSIS + ipfs bootstrap rm all + +DESCRIPTION + + Outputs the list of peers that were removed. +``` + +## ipfs cat + +``` +USAGE + ipfs cat ... - Show IPFS object data. + +SYNOPSIS + ipfs cat [--offset= | -o] [--length= | -l] [--] ... + +ARGUMENTS + + ... - The path to the IPFS object(s) to be outputted. + +OPTIONS + + -o, --offset int - Byte offset to begin reading from. + -l, --length int - Maximum number of bytes to read. + +DESCRIPTION + + Displays the data contained by an IPFS or IPNS object(s) at the given path. +``` + +## ipfs commands + +``` +USAGE + ipfs commands - List all available commands. + +SYNOPSIS + ipfs commands [--flags | -f] + +OPTIONS + + -f, --flags bool - Show command flags. + +DESCRIPTION + + Lists all available commands (and subcommands) and exits. +``` + +## ipfs config + +``` +USAGE + ipfs config [] - Get and set ipfs config values. + +SYNOPSIS + ipfs config [--bool] [--json] [--] [] + +ARGUMENTS + + - The key of the config entry (e.g. "Addresses.API"). + [] - The value to set the config entry to. + +OPTIONS + + --bool bool - Set a boolean value. + --json bool - Parse stringified JSON. + +DESCRIPTION + + 'ipfs config' controls configuration variables. It works + much like 'git config'. The configuration values are stored in a config + file inside your IPFS repository. + + Examples: + + Get the value of the 'Datastore.Path' key: + + $ ipfs config Datastore.Path + + Set the value of the 'Datastore.Path' key: + + $ ipfs config Datastore.Path ~/.ipfs/datastore + +SUBCOMMANDS + ipfs config edit - Open the config file for editing in $EDITOR. + ipfs config profile - Apply profiles to config. + ipfs config replace - Replace the config with . + ipfs config show - Output config file contents. + + Use 'ipfs config --help' for more information about each command. +``` + +## ipfs config edit + +``` +USAGE + ipfs config edit - Open the config file for editing in $EDITOR. + +SYNOPSIS + ipfs config edit + +DESCRIPTION + + To use 'ipfs config edit', you must have the $EDITOR environment + variable set to your preferred text editor. +``` + +## ipfs config profile + +``` +USAGE + ipfs config profile - Apply profiles to config. + +SYNOPSIS + ipfs config profile + +SUBCOMMANDS + ipfs config profile apply - Apply profile to config. + + Use 'ipfs config profile --help' for more information about each command. +``` + +## ipfs config profile apply + +``` +USAGE + ipfs config profile apply - Apply profile to config. + +SYNOPSIS + ipfs config profile apply [--] + +ARGUMENTS + + - The profile to apply to the config. +``` + +## ipfs config replace + +``` +USAGE + ipfs config replace - Replace the config with . + +SYNOPSIS + ipfs config replace [--] + +ARGUMENTS + + - The file to use as the new config. + +DESCRIPTION + + Make sure to back up the config file first if necessary, as this operation + can't be undone. +``` + +## ipfs config show + +``` +USAGE + ipfs config show - Output config file contents. + +SYNOPSIS + ipfs config show + +DESCRIPTION + + NOTE: For security reasons, this command will omit your private key. If you would like to make a full backup of your config (private key included), you must copy the config file from your repo. +``` + +## ipfs daemon + +``` +USAGE + ipfs daemon - Run a network-connected IPFS node. + +SYNOPSIS + ipfs daemon [--init] [--routing=] [--mount] [--writable] [--mount-ipfs=] [--mount-ipns=] [--unrestricted-api] [--disable-transport-encryption] [--enable-gc] [--manage-fdlimit=false] [--offline] [--migrate] [--enable-pubsub-experiment] [--enable-namesys-pubsub] [--enable-mplex-experiment=false] + +OPTIONS + + --init bool - Initialize ipfs with default settings if not already initialized. + --routing string - Overrides the routing option. Default: dht. + --mount bool - Mounts IPFS to the filesystem. + --writable bool - Enable writing objects (with POST, PUT and DELETE). + --mount-ipfs string - Path to the mountpoint for IPFS (if using --mount). Defaults to config setting. + --mount-ipns string - Path to the mountpoint for IPNS (if using --mount). Defaults to config setting. + --unrestricted-api bool - Allow API access to unlisted hashes. + --disable-transport-encryption bool - Disable transport encryption (for debugging protocols). + --enable-gc bool - Enable automatic periodic repo garbage collection. + --manage-fdlimit bool - Check and raise file descriptor limits if needed. Default: true. + --offline bool - Run offline. Do not connect to the rest of the network but provide local API. + --migrate bool - If true, assume yes at the migrate prompt. If false, assume no. + --enable-pubsub-experiment bool - Instantiate the ipfs daemon with the experimental pubsub feature enabled. + --enable-namesys-pubsub bool - Enable IPNS record distribution through pubsub; enables pubsub. + --enable-mplex-experiment bool - Add the experimental 'go-multiplex' stream muxer to libp2p on construction. Default: true. + +DESCRIPTION + + The daemon will start listening on ports on the network, which are + documented in (and can be modified through) 'ipfs config Addresses'. + For example, to change the 'Gateway' port: + + ipfs config Addresses.Gateway /ip4/127.0.0.1/tcp/8082 + + The API address can be changed the same way: + + ipfs config Addresses.API /ip4/127.0.0.1/tcp/5002 + + Make sure to restart the daemon after changing addresses. + + By default, the gateway is only accessible locally. To expose it to + other computers in the network, use 0.0.0.0 as the ip address: + + ipfs config Addresses.Gateway /ip4/0.0.0.0/tcp/8080 + + Be careful if you expose the API. It is a security risk, as anyone could + control your node remotely. If you need to control the node remotely, + make sure to protect the port as you would other services or database + (firewall, authenticated proxy, etc). + + HTTP Headers + + ipfs supports passing arbitrary headers to the API and Gateway. You can + do this by setting headers on the API.HTTPHeaders and Gateway.HTTPHeaders + keys: + + ipfs config --json API.HTTPHeaders.X-Special-Header '["so special :)"]' + ipfs config --json Gateway.HTTPHeaders.X-Special-Header '["so special :)"]' + + Note that the value of the keys is an _array_ of strings. This is because + headers can have more than one value, and it is convenient to pass through + to other libraries. + + CORS Headers (for API) + + You can setup CORS headers the same way: + + ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["example.com"]' + ipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods '["PUT", "GET", "POST"]' + ipfs config --json API.HTTPHeaders.Access-Control-Allow-Credentials '["true"]' + + Shutdown + + To shutdown the daemon, send a SIGINT signal to it (e.g. by pressing 'Ctrl-C') + or send a SIGTERM signal to it (e.g. with 'kill'). It may take a while for the + daemon to shutdown gracefully, but it can be killed forcibly by sending a + second signal. + + IPFS_PATH environment variable + + ipfs uses a repository in the local file system. By default, the repo is + located at ~/.ipfs. To change the repo location, set the $IPFS_PATH + environment variable: + + export IPFS_PATH=/path/to/ipfsrepo + + Routing + + IPFS by default will use a DHT for content routing. There is a highly + experimental alternative that operates the DHT in a 'client only' mode that + can be enabled by running the daemon as: + + ipfs daemon --routing=dhtclient + + This will later be transitioned into a config option once it gets out of the + 'experimental' stage. + + DEPRECATION NOTICE + + Previously, ipfs used an environment variable as seen below: + + export API_ORIGIN="http://localhost:8888/" + + This is deprecated. It is still honored in this version, but will be removed + in a future version, along with this notice. Please move to setting the HTTP + Headers. +``` + +## ipfs dag + +``` +USAGE + ipfs dag - Interact with ipld dag objects. + +SYNOPSIS + ipfs dag + +DESCRIPTION + + 'ipfs dag' is used for creating and manipulating dag objects. + + This subcommand is currently an experimental feature, but it is intended + to deprecate and replace the existing 'ipfs object' command moving forward. + + +SUBCOMMANDS + ipfs dag get - Get a dag node from ipfs. + ipfs dag put ... - Add a dag node to ipfs. + ipfs dag resolve - Resolve ipld block + + Use 'ipfs dag --help' for more information about each command. +``` + +## ipfs dag get + +``` +USAGE + ipfs dag get - Get a dag node from ipfs. + +SYNOPSIS + ipfs dag get [--] + +ARGUMENTS + + - The object to get + +DESCRIPTION + + 'ipfs dag get' fetches a dag node from ipfs and prints it out in the specifed + format. +``` + +## ipfs dag put + +``` +USAGE + ipfs dag put ... - Add a dag node to ipfs. + +SYNOPSIS + ipfs dag put [--format= | -f] [--input-enc=] [--pin] [--hash=] [--] ... + +ARGUMENTS + + ... - The object to put + +OPTIONS + + -f, --format string - Format that the object will be added as. Default: cbor. + --input-enc string - Format that the input object will be. Default: json. + --pin bool - Pin this object when adding. + --hash string - Hash function to use. Default: . + +DESCRIPTION + + 'ipfs dag put' accepts input from a file or stdin and parses it + into an object of the specified format. +``` + +## ipfs dag resolve + +``` +USAGE + ipfs dag resolve - Resolve ipld block + +SYNOPSIS + ipfs dag resolve [--] + +ARGUMENTS + + - The path to resolve + +DESCRIPTION + + 'ipfs dag resolve' fetches a dag node from ipfs, prints it's address and remaining path. +``` + +## ipfs dht + +``` +USAGE + ipfs dht - Issue commands directly through the DHT. + +SYNOPSIS + ipfs dht + +SUBCOMMANDS + ipfs dht findpeer ... - Query the DHT for all of the multiaddresses associated with a Peer ID. + ipfs dht findprovs ... - Find peers in the DHT that can provide a specific value, given a key. + ipfs dht get ... - Given a key, query the DHT for its best value. + ipfs dht provide ... - Announce to the network that you are providing given values. + ipfs dht put - Write a key/value pair to the DHT. + ipfs dht query ... - Find the closest Peer IDs to a given Peer ID by querying the DHT. + + Use 'ipfs dht --help' for more information about each command. +``` + +## ipfs dht findpeer + +``` +USAGE + ipfs dht findpeer ... - Query the DHT for all of the multiaddresses associated with a Peer ID. + +SYNOPSIS + ipfs dht findpeer [--verbose | -v] [--] ... + +ARGUMENTS + + ... - The ID of the peer to search for. + +OPTIONS + + -v, --verbose bool - Print extra information. + +DESCRIPTION + + Outputs a list of newline-delimited multiaddresses. +``` + +## ipfs dht findprovs + +``` +USAGE + ipfs dht findprovs ... - Find peers in the DHT that can provide a specific value, given a key. + +SYNOPSIS + ipfs dht findprovs [--verbose | -v] [--num-providers= | -n] [--] ... + +ARGUMENTS + + ... - The key to find providers for. + +OPTIONS + + -v, --verbose bool - Print extra information. + -n, --num-providers int - The number of providers to find. Default: 20. + +DESCRIPTION + + Outputs a list of newline-delimited provider Peer IDs. +``` + +## ipfs dht get + +``` +USAGE + ipfs dht get ... - Given a key, query the DHT for its best value. + +SYNOPSIS + ipfs dht get [--verbose | -v] [--] ... + +ARGUMENTS + + ... - The key to find a value for. + +OPTIONS + + -v, --verbose bool - Print extra information. + +DESCRIPTION + + Outputs the best value for the given key. + + There may be several different values for a given key stored in the DHT; in + this context 'best' means the record that is most desirable. There is no one + metric for 'best': it depends entirely on the key type. For IPNS, 'best' is + the record that is both valid and has the highest sequence number (freshest). + Different key types can specify other 'best' rules. +``` + +## ipfs dht provide + +``` +USAGE + ipfs dht provide ... - Announce to the network that you are providing given values. + +SYNOPSIS + ipfs dht provide [--verbose | -v] [--recursive | -r] [--] ... + +ARGUMENTS + + ... - The key[s] to send provide records for. + +OPTIONS + + -v, --verbose bool - Print extra information. + -r, --recursive bool - Recursively provide entire graph. +``` + +## ipfs dht put + +``` +USAGE + ipfs dht put - Write a key/value pair to the DHT. + +SYNOPSIS + ipfs dht put [--verbose | -v] [--] + +ARGUMENTS + + - The key to store the value at. + - The value to store. + +OPTIONS + + -v, --verbose bool - Print extra information. + +DESCRIPTION + + Given a key of the form /foo/bar and a value of any form, this will write that + value to the DHT with that key. + + Keys have two parts: a keytype (foo) and the key name (bar). IPNS uses the + /ipns keytype, and expects the key name to be a Peer ID. IPNS entries are + specifically formatted (protocol buffer). + + You may only use keytypes that are supported in your ipfs binary: currently + this is only /ipns. Unless you have a relatively deep understanding of the + go-ipfs DHT internals, you likely want to be using 'ipfs name publish' instead + of this. + + Value is arbitrary text. Standard input can be used to provide value. + + NOTE: A value may not exceed 2048 bytes. +``` + +## ipfs dht query + +``` +USAGE + ipfs dht query ... - Find the closest Peer IDs to a given Peer ID by querying the DHT. + +SYNOPSIS + ipfs dht query [--verbose | -v] [--] ... + +ARGUMENTS + + ... - The peerID to run the query against. + +OPTIONS + + -v, --verbose bool - Print extra information. + +DESCRIPTION + + Outputs a list of newline-delimited Peer IDs. +``` + +## ipfs diag + +``` +USAGE + ipfs diag - Generate diagnostic reports. + +SYNOPSIS + ipfs diag + +SUBCOMMANDS + ipfs diag cmds - List commands run on this IPFS node. + ipfs diag sys - Print system diagnostic information. + + Use 'ipfs diag --help' for more information about each command. +``` + +## ipfs diag cmds + +``` +USAGE + ipfs diag cmds - List commands run on this IPFS node. + +SYNOPSIS + ipfs diag cmds [--verbose | -v] + +OPTIONS + + -v, --verbose bool - Print extra information. + +DESCRIPTION + + Lists running and recently run commands. + +SUBCOMMANDS + ipfs diag cmds clear - Clear inactive requests from the log. + ipfs diag cmds set-time