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编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:
- 全新的界面设计 ,将会带来全新的写作体验;
- 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
- 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
- 全新的 KaTeX数学公式 语法;
- 增加了支持甘特图的mermaid语法1 功能;
- 增加了 多屏幕编辑 Markdown文章功能;
- 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
- 增加了 检查列表 功能。
如何改变文本的样式
强调文本 强调文本
加粗文本 加粗文本
标记文本
删除文本
引用文本
H2O is是液体。
210 运算结果是 1024.
插入链接与图片
链接: link.
图片:
带尺寸的图片:
居中的图片:
居中并且带尺寸的图片:
当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。
如何插入一段漂亮的代码片
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
// 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)=(n−1)!∀n∈N 是通过欧拉积分
Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞tz−1e−tdt.
你可以找到更多关于的信息 LaTeX 数学表达式here.
新的甘特图功能,丰富你的文章
- 关于 甘特图 语法,参考 这儿,
UML 图表
可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::
这将产生一个流程图。:
- 关于 Mermaid 语法,参考 这儿,
FLowchart流程图
我们依旧会支持flowchart的流程图:
- 关于 Flowchart流程图 语法,参考 这儿.
注脚的解释 ↩︎