IPFS

Usage

ifps init

echo “Hello World” > hello.txt

ipfs add hello.txt

ipfs daemon
开启的时候要注意,ipfs daemon要使用8080端口;服务器上如果有web服务器在运行,恰好又用了8080端口,启动会失败;

development

to develop ipfs
look a gawk scrpit at first;

BEGIN{
print "# Generated by script.gawk; used for collecting dependencies."
print "# go build 2> temp.txt"
print "# gawk -f script.gawk temp.txt"
print ""
print "# Created by AprilCal on 2019/5/7."
print ""
}

/"/{
print "echo go get",$5
print "go get",$5
}
go get github.com/ipfs/go-ipfs
# and you will find github.com/ipfs/go-ipfs inside $GOPATH/src/

cd $GOPATH/github.com/ipfs/go-ipfs/cmd/ipfs

#retrieve dependencies from go build err output
go build 2> temp.txt
gawk -f script.gawk temp.txt > getdependencies.sh
mv getdependencies.sh $GOPATH/
cd $GOPATH
sh getdependencies.sh
# should be executed times, cause new pkg will yield new dependencies;
# there are still some pkg can not be got via go get.
# git clone them manually under dir github.com/ipfs/.

Merkle Tree/DAG

  • 这里是Merkle Tree的定义&相关操作;顺便看下应用里的4,介绍了IPFS里用的MerkleDAG;
  • 这里是MerkleDAG的一点说明,和在以太坊里的应用,看一下文件切分的思路;
  • 这里是一个IPFS中用的DAG的例子
  • IPFS中MerkleDAG的定义见论文

balanced DAG

hierarchy

建议自底向上看
±----------------+
|    MFS    | File system.
±----------------+
|   UnixFS   | Files and directories.
±----------------+
|    DAG    | Nodes.
±----------------+
|    Block    | Stream of bits.
±----------------+

block

all file will be sliced into chunks, stored into datastore as well as its hash
non-leaf node of dag is also stored in datastore;
block layer concern nothing but saving k-v pairs;
block layer does not know the links between blocks;

DAG

block wrapped by some extra information is called node;
nodes are stored in block layer;
but dag layer knows the relationship between blocks;

Unixfs

MFS

Code flow

  • ifps add code flow
    这里是一份解释add功能流程的文档,但是时间是18年,相关部分代码已更新;
    block就是存储数据的
    block中加上链接信息后,是node,这些node组成DAG,由DAGservice来操作

  • ipfs get code flow
    a pic
    UnixfsAPI就是一个CoreAPI,
    UnixfsAPI.Add()

// acts on the input data or files, to build a merkledag node (in essence it is the entire tree represented by the root node)
// and adds it to the blockstore. Within the function, a new Adder is created with the configured Blockstore and DAG service`.
// and returns the key representing that node.
func (api *UnixfsAPI) Add(ctx context.Context, files files.Node, opts ...options.UnixfsAddOption) (coreiface.ResolvedPath, error)

执行 ipfs add dir1
构建了一个fileAdder,而后执行AddAllAndPin()方法;
AddAllAndPin()中,处理了一些东西,将文件交给AddFileNode()

AddFileNode()中,检查文件的类型,是目录,SymLink,或是普通文件,此处假设是普通文件,交给AddFile()

AddFile()中不知道处理了什么乱七八糟的东西,转而用io.reader打开文件,交给add()处理,add()返回一个ipld.Node,也就是一个DAGNode

add()中,首先把字符串add.Chunker交给chunk包中的FromString(),

按照FromString()->DefaultSplitter()->NewSizeSplitter()的顺序调用,最后返回一个sizeSplitterv2,这个结构体中持有一个io.Reader,就是传递进去的那个。

构造了这个chunker之后,add()将参数包装成DagBuilderParams,然后调用DagBuilderParams的New()方法,构造出一个DagBuilderHelperdb
balanced.Layout(db),产生一个ipldNode,并返回到AddFile()中;AddFile()又将刚返回的Node交给AddNode()

mfsRoot()
func FromString(r io.Reader, chunker string) (Splitter, error)

case chunker == "" || chunker == "default":
		return DefaultSplitter(r), nil

假设就采用默认的chunker,FromString()会调用一个DefaultSplitter(),这个函数又去调用NewSizeSplitter(r, DefaultBlockSize)

// NewSizeSplitter returns a new size-based Splitter with the given block size.
func NewSizeSplitter(r io.Reader, size int64) Splitter {
	return &sizeSplitterv2{
		r:    r,
		size: uint32(size),
	}
}

默认的size是 var DefaultBlockSize int64 = 1024 * 256,256KB
sizeSplitterv2的定义见sizeSplitterv2

// NewDAGService constructs a new DAGService (using the default implementation).
// Note that the default implementation is also an ipld.LinkGetter.
func NewDAGService(bs bserv.BlockService) *dagService {
	return &dagService{Blocks: bs}
}

// dagService is an IPFS Merkle DAG service.
// - the root is virtual (like a forest)
// - stores nodes' data in a BlockService
// TODO: should cache Nodes that are in memory, and be
//       able to free some of them when vm pressure is high
type dagService struct {
	Blocks bserv.BlockService
}
// Add adds a node to the dagService, storing the block in the BlockService
func (n *dagService) Add(ctx context.Context, nd ipld.Node) error {
	if n == nil { // FIXME remove this assertion. protect with constructor invariant
		return fmt.Errorf("dagService is nil")
	}

	return n.Blocks.AddBlock(nd)
}

func (n *dagService) AddMany(ctx context.Context, nds []ipld.Node) error {
	blks := make([]blocks.Block, len(nds))
	for i, nd := range nds {
		blks[i] = nd
	}
	return n.Blocks.AddBlocks(blks)
}

MerkleDag相关接口定义在go-ipld-format中

merkledag.go中定义了NodeGetter NodeAdder DAGService等接口,实现DAGService必须先实现NodeGetter&NodeAdder
batch.go中定义了一个BufferedDAG和一个Batch,batch就是个缓冲区;
dagservice包中实现了MerkleDAG

这里应该补一张接口的继承关系图

format.go中定义了Node和Link相关过程

你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

API

新的改变

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 全新的界面设计 ,将会带来全新的写作体验;
  2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
  3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
  4. 全新的 KaTeX数学公式 语法;
  5. 增加了支持甘特图的mermaid语法1 功能;
  6. 增加了 多屏幕编辑 Markdown文章功能;
  7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
  8. 增加了 检查列表 功能。

如何改变文本的样式

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

插入链接与图片

链接: link.

图片: Alt

带尺寸的图片: Alt

居中的图片: Alt

居中并且带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block
var foo = 'bar';
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目 Value
电脑 $1600
手机 $12
导管 $1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列 第二列 第三列
第一列文本居中 第二列文本居右 第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPE ASCII HTML
Single backticks 'Isn't this fun?' ‘Isn’t this fun?’
Quotes "Isn't this fun?" “Isn’t this fun?”
Dashes -- is en-dash, --- is em-dash – is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。2

注释也是必不可少的

Markdown将文本转换为 HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n1)!nN 是通过欧拉积分

Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=0tz1etdt.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

Mon 06 Mon 13 Mon 20 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::

张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

Created with Raphaël 2.2.0 开始 我的操作 确认? 结束 yes no
  • 关于 Flowchart流程图 语法,参考 这儿.

  1. mermaid语法说明 ↩︎

  2. 注脚的解释 ↩︎

你可能感兴趣的:(IPFS,Network)