IPFS:如何将文件添加到现有文件夹?
IPFS: How to add a file to an existing folder?
给定一个相当大的文件夹,已经被推送到网络,并在本地删除。如何将文件添加到该文件夹,而不重新下载整个文件夹呢?
您只能使用 ipns 在使用 ipfs get
再次下载后执行此操作,如果它仍然固定在您的本地存储中,应该会很快:
(1) 首先将您的文件夹递归添加(即重新添加)到 ipfs:ipfs add -r /path/to/folder
。最后 stdout 行的第二列包含您刚刚添加的父文件夹的 ipfs 哈希。 (原始文件仍然相同,因此哈希值也将相同。)
(2) 然后发布该散列:ipfs name publish /ipfs/<CURRENT_PARENTFOLDER_HASH>
。这将 return 您的同伴 ID,您可以将 link 共享为 /ipns/<PEER_ID>
;每当文件夹内容(以及父文件夹哈希)发生变化时,重复此步骤 (ipfs name publish
)。 ipns 对象将始终指向您的文件夹的最新版本。
(3) 如果您打算共享很多内容,您可以为共享的每个文件夹创建一个新的密钥对:ipfs key gen --type=rsa --size=2048 new-share-key
…然后使用该密钥(而不是您的默认密钥)发布(和稍后重新发布)那个文件夹:ipfs name publish --key=new-share-key /ipfs/<CURRENT_PARENTFOLDER_HASH>
另请参阅此处的文档:https://docs.ipfs.io/reference/cli/#ipfs-name-publish
使用文件 API 应该很容易。假设您已经将新文件添加到 ipfs 并获得了它的哈希值,请尝试:
ipfs files cp /ipfs/QmExistingLargeFolderHash /folder-to-modify
ipfs files cp /ipfs/QmNewFileHash /folder-to-modify/new-file
这当然不会将文件添加到现有文件夹(因为文件夹和文件是不可变的),它只是创建一个添加了新文件的文件夹的 copy/new 版本。因此,它将有一个新的散列:
ipfs files stat /folder-to-modify
除非必要,否则文件 API 不会固定引用的文件或检索任何子文件夹,因此这可以在网络中的任何节点上完成,而不会产生大量流量。
[编辑]
过了一会儿,我了解到您还可以做一些事情:
而不是
ipfs files cp /ipfs/QmNewFileHash /folder-to-modify/new-file
如果你还没有将文件添加到 ipfs,你可以使用 ipfs files write -te
。
- 您可以启用 HTTP API 的写入功能以使用
PUT
请求获取文件夹新版本的哈希值。参见 this blogpost。
- 可以通过fuse挂载ipns写入
…/ipns/local
.
- 可能是最好的:您可以使用
ipfs object patch add-link /ipfs/QmExistingLargeFolderHash new-file /ipfs/QmNewFileHash
一步完成
我来晚了回答这个问题,但我发现现有的 2 个答案有点不清楚。
Tl;博士;只有命令和最少的信息
如果您想要全面详细的解释,请向下滚动到以 The 2 keys to mutability
开头的部分。
如果您只需要您应该 运行 的命令和准系统使用信息,以便您了解如何实际调整您的用例的命令,请阅读此 TL;DR;部分。
使用 IPNS / DNSLink 引用可更新的 IPFS 对象
IPNS
创建一个密钥,如果在生产中使用,请备份它,然后使用 ipfs name publish
更改您的密钥当前指向的对象。通过在命令/URL 前加上 /ipns/
而不是 /ipfs/
.
来访问您的密钥
ipfs key gen test
# backup your key if used in production
ipfs key export -o /home/somewhere/safe/test.key test
umount /ipns
ipfs name publish -k test QmWRsWoZjiandZUXLyczXSoWi84hXNHvBQ49BiQx9hPdjs
# Published to k51qzi5uqu5dkqxbxeulacqmz5ekmopr3nsh9zmgve1dji0dccdy86uqyhq1m0: /ipfs/QmWRsWoZjiandZUXLyczXSoWi84hXNHvBQ49BiQx9hPdjs
ipfs ls /ipns/k51qzi5uqu5dkqxbxeulacqmz5ekmopr3nsh9zmgve1dji0dccdy86uqyhq1m0
# Qme85tx5Wnsjc5pZZs1JGogBNUVM2WThC18ERh6t2YFJSK 37 lorem.txt
ipfs name publish -k test QmaDDLFL3fM4sQkQfV82LdNqtNnyaeAmgC46Qc7FDQdkq8
# Published to k51qzi5uqu5dkqxbxeulacqmz5ekmopr3nsh9zmgve1dji0dccdy86uqyhq1m0: /ipfs/QmaDDLFL3fM4sQkQfV82LdNqtNnyaeAmgC46Qc7FDQdkq8
# Since it's not a folder this time, we use 'ipfs cat' to read
# it to the console, since we know the file was plain text.
ipfs cat /ipns/k51qzi5uqu5dkqxbxeulacqmz5ekmopr3nsh9zmgve1dji0dccdy86uqyhq1m0
# foo bar foo bar foo foo foo
# bar foo foo bar bar foo bar
DNS 链接
在您要用作 IPNS 参考的(子)域上方的 _dnslink
上设置 TXT 记录。根据您是将其指向 IPFS 对象还是 IPNS 地址,将值设置为 dnslink=/ipns/<id>
或 dnslink=/ipfs/<id>
,并将 <id>
替换为您要指向的对象 ID / IPNS 地址
Domain: privex.io
(Subdomain) Name: _dnslink.test
Record Type: TXT
Value: dnslink=/ipns/k51qzi5uqu5dkqxbxeulacqmz5ekmopr3nsh9zmgve1dji0dccdy86uqyhq1m0
TTL (expiry): 120 (seconds)
就像普通的 IPNS 一样,您现在应该能够使用 IPFS CLI 工具或 IPFS 网关查询它,使用 /ipns/<your_domain>
而不是 /ipfs/<object_id>
。
如果我们现在 cat /ipns/test.privex.io
我们可以看到它工作正常,指向 foo 栏文本文件(没有包装文件夹)。
ipfs@privex ~ $ ipfs cat /ipns/test.privex.io
foo bar foo bar foo foo foo
bar foo foo bar bar foo bar
将现有的 IPFS 对象 ID 添加到另一个 IPFS 对象(包装文件夹)
使用以下命令,您可以使用各自的对象 ID 将单个 IPFS 文件或整个包装文件夹添加到现有对象,该命令将输出一个新的对象 ID,引用包含这两个文件的新对象原始文件夹数据,以及您要添加的新数据。
命令的语法是:ipfs object patch add-link [object-to-add-to] [name-of-newly-added-file-or-folder] [object-to-inject]
ipfs@privex:~$ ipfs object patch add-link QmXCfnzXHThHwaTvSSAKeErxK48XkyVoL6ZNEhkpKmZyW3 hello/foo.txt QmaDDLFL3fM4sQkQfV82LdNqtNnyaeAmgC46Qc7FDQdkq8
QmaWoYZnSXnKqzskrBwtmZPE74qKe4AF5YfwaY83nzeCCL
可变性的两个关键
1。尽管内容发生变化,但 IPFS 对象 ID 保持不变
不幸的是,IPFS object ID(以 Q 开头的那些)是不可变的,这意味着它们的内容将来不能在没有新 ID 的情况下更改,因为事实上对象 ID 实际上是一个哈希值(通常是 SHA256 的一种形式)。
但是,IPNS 和 DNSLink 都有针对此问题的解决方案。
IPNS 是“Interplantary Name System”,它被强烈集成到 IPFS 中。它允许您生成地址(public 密钥)和私钥,类似于比特币和许多其他加密货币的工作方式。使用您的私钥,您可以指向您的 IPNS
首先,您需要生成一个密钥(注意:每个 IPNS 地址都需要一个密钥)
ipfs@privex:~$ ipfs key gen test
k51qzi5uqu5dkqxbxeulacqmz5ekmopr3nsh9zmgve1dji0dccdy86uqyhq1m0
如果您打算将您的 IPNS 地址用于测试以外的用途,您应该导出私钥并将其副本保存在安全的地方。请注意,私钥是一个二进制文件,因此如果您想将其存储在需要纯文本的地方,您可以将其转换为 base64,如下所示:base64 test.key
ipfs key export -o /home/somewhere/safe/test.key test
接下来我们将向 IPNS 地址发布一个随机 IPFS 文件夹,其中包含一个文件 (lorem.txt),其中包含几行 lorem ipsum 文本。如果您使用 FUSE /ipns
文件夹,您可能需要卸载它才能通过 IPNS 发布:
ipfs@privex:~$ umount /ipns
ipfs@privex:~$ ipfs name publish -k test QmWRsWoZjiandZUXLyczXSoWi84hXNHvBQ49BiQx9hPdjs
Published to k51qzi5uqu5dkqxbxeulacqmz5ekmopr3nsh9zmgve1dji0dccdy86uqyhq1m0: /ipfs/QmWRsWoZjiandZUXLyczXSoWi84hXNHvBQ49BiQx9hPdjs
ipfs@privex:~$ ipfs ls /ipns/k51qzi5uqu5dkqxbxeulacqmz5ekmopr3nsh9zmgve1dji0dccdy86uqyhq1m0
Qme85tx5Wnsjc5pZZs1JGogBNUVM2WThC18ERh6t2YFJSK 37 lorem.txt
虽然这只是一个示例 - 为了证明 IPNS 地址实际上可以用不同的内容更新,在下一个示例中,我将直接向 IPNS 地址发布一个单独的文本文件(而不是包装文件夹)。
# Publish the IPFS object 'QmaDDLFL3fM4sQkQfV82LdNqtNnyaeAmgC46Qc7FDQdkq8'
# to our existing named key 'test'
ipfs@privex:~$ ipfs name publish -k test QmaDDLFL3fM4sQkQfV82LdNqtNnyaeAmgC46Qc7FDQdkq8
# Since it's not a folder this time, 'ipfs ls' won't return anything.
# So instead, we use 'ipfs cat' to read it to the console, since we
# know the file was plain text.
ipfs@privex:~$ ipfs cat /ipns/k51qzi5uqu5dkqxbxeulacqmz5ekmopr3nsh9zmgve1dji0dccdy86uqyhq1m0
foo bar foo bar foo foo foo
bar foo foo bar bar foo bar
DNS 链接
DNSLink 是 IPNS 的一部分,允许通过标准域系统(例如 example.com)获得人类可读的 IPNS 地址。
由于 IPNS 部分相当长,我将保持这一部分简短而有趣。如果您想了解更多有关 DNSLink 的信息,请访问 [dnslink.io](https://dnslink.io].
首先,要么您已经有一个域可以使用,要么您从注册商那里获得了一个域,例如 Namecheap.
转到您的域记录管理面板 - 如果您使用 Cloudflare,那么它们就是您的域管理面板。为 _dnslink.yourdomain.com
添加 TXT 记录,或者如果您想使用子域,_dnslink.mysub.yourdomain.com
(在大多数注册商,您只需输入您管理的域之前的部分,即 _dnslink
或 _dnslink.mysub
).
在值框中,输入 dnslink=
,然后输入 /ipfs/
或 /ipns/
,具体取决于您是要使用 IPFS 对象 ID 还是 IPNS 名称地址,然后输入您的对象 ID / IPNS 名称到最后。
例如,如果您将域指向前面示例中的 IPNS 地址,则应输入:
dnslink=/ipns/k51qzi5uqu5dkqxbxeulacqmz5ekmopr3nsh9zmgve1dji0dccdy86uqyhq1m0
或者,如果您想将其指向包含 lorem.txt
的示例文件夹以及几行 lorem ipsum,它将是
dnslink=/ipfs/QmWRsWoZjiandZUXLyczXSoWi84hXNHvBQ49BiQx9hPdjs
作为示例,这里是我如何设置的摘要 test.privex.io
Domain: privex.io
(Subdomain) Name: _dnslink.test
Record Type: TXT
Value: dnslink=/ipns/k51qzi5uqu5dkqxbxeulacqmz5ekmopr3nsh9zmgve1dji0dccdy86uqyhq1m0
TTL (expiry): 120 (seconds)
(note: most people are fine with "auto" TTL, or the somewhat standard 600 TTL. If you intend to change the DNSLink value regularly, or you're experimenting and likely updating it constantly, you may want a low TTL of 60 or even 30)
设置好后,IPNS地址仍然指向原始的foo bar文本数据,我用ipfs cat
读取域指向的数据:
ipfs@privex:~$ ipfs cat /ipns/test.privex.io
foo bar foo bar foo foo foo
bar foo foo bar bar foo bar
2。将现有的 IPFS 对象添加到您的对象中,而无需 download/organise 正在添加的对象。
首先我们创建 IPFS 对象 - 一个包含 hello/lorem.txt
的包装文件夹 - 它具有对象 ID QmXCfnzXHThHwaTvSSAKeErxK48XkyVoL6ZNEhkpKmZyW3
ipfs@privex:~$ mkdir hello
ipfs@privex:~$ echo -e "lorem ipsum dolor\nlorem ipsum dolor\n" > hello/lorem.txt
ipfs@privex:~$ ipfs add -p -r -w hello
added Qme85tx5Wnsjc5pZZs1JGogBNUVM2WThC18ERh6t2YFJSK hello/lorem.txt
added QmWRsWoZjiandZUXLyczXSoWi84hXNHvBQ49BiQx9hPdjs hello
added QmXCfnzXHThHwaTvSSAKeErxK48XkyVoL6ZNEhkpKmZyW3
37 B / 37 B [=======================================================================] 100.00%
ipfs@privex:~$ ipfs ls QmXCfnzXHThHwaTvSSAKeErxK48XkyVoL6ZNEhkpKmZyW3
QmWRsWoZjiandZUXLyczXSoWi84hXNHvBQ49BiQx9hPdjs - hello/
ipfs@privex:~$ ipfs ls QmXCfnzXHThHwaTvSSAKeErxK48XkyVoL6ZNEhkpKmZyW3/hello
Qme85tx5Wnsjc5pZZs1JGogBNUVM2WThC18ERh6t2YFJSK 37 lorem.txt
接下来,为了创建一个不属于原始包装文件夹的示例外部对象 ID,我创建了 foo.txt
包含几行随机 foo bar
文本,并且自己上传到 IPFS。它的对象 ID 是 QmaDDLFL3fM4sQkQfV82LdNqtNnyaeAmgC46Qc7FDQdkq8
ipfs@privex:~$ echo -e "foo bar foo bar foo foo foo\nbar foo foo bar bar foo bar\n" > foo.txt
ipfs@privex:~$ ipfs add foo.txt
added QmaDDLFL3fM4sQkQfV82LdNqtNnyaeAmgC46Qc7FDQdkq8 foo.txt
57 B / 57 B [======================================================================] 100.00%
最后,我们使用ipfs object patch add-link
添加我之前创建的foo.txt
对象(QmaDDLFL3fM4sQkQfV82LdNqtNnyaeAmgC46Qc7FDQdkq8
),在我创建的原始wrapped文件夹的hello/
文件夹内(QmXCfnzXHThHwaTvSSAKeErxK48XkyVoL6ZNEhkpKmZyW3
).
命令的语法是:ipfs object patch add-link [object-to-add-to] [name-of-newly-added-file-or-folder] [object-to-inject]
ipfs@privex:~$ ipfs object patch add-link QmXCfnzXHThHwaTvSSAKeErxK48XkyVoL6ZNEhkpKmZyW3 hello/foo.txt QmaDDLFL3fM4sQkQfV82LdNqtNnyaeAmgC46Qc7FDQdkq8
QmaWoYZnSXnKqzskrBwtmZPE74qKe4AF5YfwaY83nzeCCL
它输出一个新的对象 ID QmaWoYZnSXnKqzskrBwtmZPE74qKe4AF5YfwaY83nzeCCL
,这是新创建的对象的 ID,其中包含来自原始对象的 hello/lorem.txt
和稍后注入的 hello/foo.txt
。
注意:当将整个包装文件夹添加到另一个包装文件夹时,此命令也有效,但是,请注意避免双重嵌套。例如您有 Qxxxx/hello/world
和 Qyyyy/lorem/ipsum
- 如果您将 Qyyyy 添加到指定名称 lorem
的 Qxxxx - 它将被添加为 Qzzzz/lorem/lorem/ipsum
如果我们现在对新对象 ID 执行 ipfs ls
,我们可以看到 hello/
子文件夹同时包含 foo.txt
和 lorem.txt
- 确认 foo.txt 已成功注入副本,无需同时下载原始文件和 foo.txt - 然后在上传前将它们正确组织在文件夹中。
ipfs@privex:~$ ipfs ls QmaWoYZnSXnKqzskrBwtmZPE74qKe4AF5YfwaY83nzeCCL
QmbU3BwdMarL8n6KCzVdYqMh6HEjCv6pLJQZhoVGWZ5bWW - hello/
ipfs@privex:~$ ipfs ls QmaWoYZnSXnKqzskrBwtmZPE74qKe4AF5YfwaY83nzeCCL/hello
QmaDDLFL3fM4sQkQfV82LdNqtNnyaeAmgC46Qc7FDQdkq8 57 foo.txt
Qme85tx5Wnsjc5pZZs1JGogBNUVM2WThC18ERh6t2YFJSK 37 lorem.txt
总结
如第一部分所述,IPFS 对象 ID 是不可变的,因此虽然可以合并 IPFS 上的现有对象,但它仍然会产生一个新的对象 ID。
但是,通过 使用 IPNS 密钥地址 and/or DNSLink,您可以拥有指向任何 IPFS 对象的可变(可编辑)引用,并且可以更新为按需指向新的对象 ID,例如每当您更新现有对象的内容时,或者如果您决定只是希望您的 IPNS key/domain 指向完全不同的内容,您都可以自由地这样做:)
给定一个相当大的文件夹,已经被推送到网络,并在本地删除。如何将文件添加到该文件夹,而不重新下载整个文件夹呢?
您只能使用 ipns 在使用 ipfs get
再次下载后执行此操作,如果它仍然固定在您的本地存储中,应该会很快:
(1) 首先将您的文件夹递归添加(即重新添加)到 ipfs:ipfs add -r /path/to/folder
。最后 stdout 行的第二列包含您刚刚添加的父文件夹的 ipfs 哈希。 (原始文件仍然相同,因此哈希值也将相同。)
(2) 然后发布该散列:ipfs name publish /ipfs/<CURRENT_PARENTFOLDER_HASH>
。这将 return 您的同伴 ID,您可以将 link 共享为 /ipns/<PEER_ID>
;每当文件夹内容(以及父文件夹哈希)发生变化时,重复此步骤 (ipfs name publish
)。 ipns 对象将始终指向您的文件夹的最新版本。
(3) 如果您打算共享很多内容,您可以为共享的每个文件夹创建一个新的密钥对:ipfs key gen --type=rsa --size=2048 new-share-key
…然后使用该密钥(而不是您的默认密钥)发布(和稍后重新发布)那个文件夹:ipfs name publish --key=new-share-key /ipfs/<CURRENT_PARENTFOLDER_HASH>
另请参阅此处的文档:https://docs.ipfs.io/reference/cli/#ipfs-name-publish
使用文件 API 应该很容易。假设您已经将新文件添加到 ipfs 并获得了它的哈希值,请尝试:
ipfs files cp /ipfs/QmExistingLargeFolderHash /folder-to-modify
ipfs files cp /ipfs/QmNewFileHash /folder-to-modify/new-file
这当然不会将文件添加到现有文件夹(因为文件夹和文件是不可变的),它只是创建一个添加了新文件的文件夹的 copy/new 版本。因此,它将有一个新的散列:
ipfs files stat /folder-to-modify
除非必要,否则文件 API 不会固定引用的文件或检索任何子文件夹,因此这可以在网络中的任何节点上完成,而不会产生大量流量。
[编辑] 过了一会儿,我了解到您还可以做一些事情:
而不是
ipfs files cp /ipfs/QmNewFileHash /folder-to-modify/new-file
如果你还没有将文件添加到 ipfs,你可以使用
ipfs files write -te
。- 您可以启用 HTTP API 的写入功能以使用
PUT
请求获取文件夹新版本的哈希值。参见 this blogpost。 - 可以通过fuse挂载ipns写入
…/ipns/local
. - 可能是最好的:您可以使用
ipfs object patch add-link /ipfs/QmExistingLargeFolderHash new-file /ipfs/QmNewFileHash
一步完成
我来晚了回答这个问题,但我发现现有的 2 个答案有点不清楚。
Tl;博士;只有命令和最少的信息
如果您想要全面详细的解释,请向下滚动到以 The 2 keys to mutability
开头的部分。
如果您只需要您应该 运行 的命令和准系统使用信息,以便您了解如何实际调整您的用例的命令,请阅读此 TL;DR;部分。
使用 IPNS / DNSLink 引用可更新的 IPFS 对象
IPNS
创建一个密钥,如果在生产中使用,请备份它,然后使用 ipfs name publish
更改您的密钥当前指向的对象。通过在命令/URL 前加上 /ipns/
而不是 /ipfs/
.
ipfs key gen test
# backup your key if used in production
ipfs key export -o /home/somewhere/safe/test.key test
umount /ipns
ipfs name publish -k test QmWRsWoZjiandZUXLyczXSoWi84hXNHvBQ49BiQx9hPdjs
# Published to k51qzi5uqu5dkqxbxeulacqmz5ekmopr3nsh9zmgve1dji0dccdy86uqyhq1m0: /ipfs/QmWRsWoZjiandZUXLyczXSoWi84hXNHvBQ49BiQx9hPdjs
ipfs ls /ipns/k51qzi5uqu5dkqxbxeulacqmz5ekmopr3nsh9zmgve1dji0dccdy86uqyhq1m0
# Qme85tx5Wnsjc5pZZs1JGogBNUVM2WThC18ERh6t2YFJSK 37 lorem.txt
ipfs name publish -k test QmaDDLFL3fM4sQkQfV82LdNqtNnyaeAmgC46Qc7FDQdkq8
# Published to k51qzi5uqu5dkqxbxeulacqmz5ekmopr3nsh9zmgve1dji0dccdy86uqyhq1m0: /ipfs/QmaDDLFL3fM4sQkQfV82LdNqtNnyaeAmgC46Qc7FDQdkq8
# Since it's not a folder this time, we use 'ipfs cat' to read
# it to the console, since we know the file was plain text.
ipfs cat /ipns/k51qzi5uqu5dkqxbxeulacqmz5ekmopr3nsh9zmgve1dji0dccdy86uqyhq1m0
# foo bar foo bar foo foo foo
# bar foo foo bar bar foo bar
DNS 链接
在您要用作 IPNS 参考的(子)域上方的 _dnslink
上设置 TXT 记录。根据您是将其指向 IPFS 对象还是 IPNS 地址,将值设置为 dnslink=/ipns/<id>
或 dnslink=/ipfs/<id>
,并将 <id>
替换为您要指向的对象 ID / IPNS 地址
Domain: privex.io
(Subdomain) Name: _dnslink.test
Record Type: TXT
Value: dnslink=/ipns/k51qzi5uqu5dkqxbxeulacqmz5ekmopr3nsh9zmgve1dji0dccdy86uqyhq1m0
TTL (expiry): 120 (seconds)
就像普通的 IPNS 一样,您现在应该能够使用 IPFS CLI 工具或 IPFS 网关查询它,使用 /ipns/<your_domain>
而不是 /ipfs/<object_id>
。
如果我们现在 cat /ipns/test.privex.io
我们可以看到它工作正常,指向 foo 栏文本文件(没有包装文件夹)。
ipfs@privex ~ $ ipfs cat /ipns/test.privex.io
foo bar foo bar foo foo foo
bar foo foo bar bar foo bar
将现有的 IPFS 对象 ID 添加到另一个 IPFS 对象(包装文件夹)
使用以下命令,您可以使用各自的对象 ID 将单个 IPFS 文件或整个包装文件夹添加到现有对象,该命令将输出一个新的对象 ID,引用包含这两个文件的新对象原始文件夹数据,以及您要添加的新数据。
命令的语法是:ipfs object patch add-link [object-to-add-to] [name-of-newly-added-file-or-folder] [object-to-inject]
ipfs@privex:~$ ipfs object patch add-link QmXCfnzXHThHwaTvSSAKeErxK48XkyVoL6ZNEhkpKmZyW3 hello/foo.txt QmaDDLFL3fM4sQkQfV82LdNqtNnyaeAmgC46Qc7FDQdkq8
QmaWoYZnSXnKqzskrBwtmZPE74qKe4AF5YfwaY83nzeCCL
可变性的两个关键
1。尽管内容发生变化,但 IPFS 对象 ID 保持不变
不幸的是,IPFS object ID(以 Q 开头的那些)是不可变的,这意味着它们的内容将来不能在没有新 ID 的情况下更改,因为事实上对象 ID 实际上是一个哈希值(通常是 SHA256 的一种形式)。
但是,IPNS 和 DNSLink 都有针对此问题的解决方案。
IPNS 是“Interplantary Name System”,它被强烈集成到 IPFS 中。它允许您生成地址(public 密钥)和私钥,类似于比特币和许多其他加密货币的工作方式。使用您的私钥,您可以指向您的 IPNS
首先,您需要生成一个密钥(注意:每个 IPNS 地址都需要一个密钥)
ipfs@privex:~$ ipfs key gen test
k51qzi5uqu5dkqxbxeulacqmz5ekmopr3nsh9zmgve1dji0dccdy86uqyhq1m0
如果您打算将您的 IPNS 地址用于测试以外的用途,您应该导出私钥并将其副本保存在安全的地方。请注意,私钥是一个二进制文件,因此如果您想将其存储在需要纯文本的地方,您可以将其转换为 base64,如下所示:base64 test.key
ipfs key export -o /home/somewhere/safe/test.key test
接下来我们将向 IPNS 地址发布一个随机 IPFS 文件夹,其中包含一个文件 (lorem.txt),其中包含几行 lorem ipsum 文本。如果您使用 FUSE /ipns
文件夹,您可能需要卸载它才能通过 IPNS 发布:
ipfs@privex:~$ umount /ipns
ipfs@privex:~$ ipfs name publish -k test QmWRsWoZjiandZUXLyczXSoWi84hXNHvBQ49BiQx9hPdjs
Published to k51qzi5uqu5dkqxbxeulacqmz5ekmopr3nsh9zmgve1dji0dccdy86uqyhq1m0: /ipfs/QmWRsWoZjiandZUXLyczXSoWi84hXNHvBQ49BiQx9hPdjs
ipfs@privex:~$ ipfs ls /ipns/k51qzi5uqu5dkqxbxeulacqmz5ekmopr3nsh9zmgve1dji0dccdy86uqyhq1m0
Qme85tx5Wnsjc5pZZs1JGogBNUVM2WThC18ERh6t2YFJSK 37 lorem.txt
虽然这只是一个示例 - 为了证明 IPNS 地址实际上可以用不同的内容更新,在下一个示例中,我将直接向 IPNS 地址发布一个单独的文本文件(而不是包装文件夹)。
# Publish the IPFS object 'QmaDDLFL3fM4sQkQfV82LdNqtNnyaeAmgC46Qc7FDQdkq8'
# to our existing named key 'test'
ipfs@privex:~$ ipfs name publish -k test QmaDDLFL3fM4sQkQfV82LdNqtNnyaeAmgC46Qc7FDQdkq8
# Since it's not a folder this time, 'ipfs ls' won't return anything.
# So instead, we use 'ipfs cat' to read it to the console, since we
# know the file was plain text.
ipfs@privex:~$ ipfs cat /ipns/k51qzi5uqu5dkqxbxeulacqmz5ekmopr3nsh9zmgve1dji0dccdy86uqyhq1m0
foo bar foo bar foo foo foo
bar foo foo bar bar foo bar
DNS 链接
DNSLink 是 IPNS 的一部分,允许通过标准域系统(例如 example.com)获得人类可读的 IPNS 地址。
由于 IPNS 部分相当长,我将保持这一部分简短而有趣。如果您想了解更多有关 DNSLink 的信息,请访问 [dnslink.io](https://dnslink.io].
首先,要么您已经有一个域可以使用,要么您从注册商那里获得了一个域,例如 Namecheap.
转到您的域记录管理面板 - 如果您使用 Cloudflare,那么它们就是您的域管理面板。为 _dnslink.yourdomain.com
添加 TXT 记录,或者如果您想使用子域,_dnslink.mysub.yourdomain.com
(在大多数注册商,您只需输入您管理的域之前的部分,即 _dnslink
或 _dnslink.mysub
).
在值框中,输入 dnslink=
,然后输入 /ipfs/
或 /ipns/
,具体取决于您是要使用 IPFS 对象 ID 还是 IPNS 名称地址,然后输入您的对象 ID / IPNS 名称到最后。
例如,如果您将域指向前面示例中的 IPNS 地址,则应输入:
dnslink=/ipns/k51qzi5uqu5dkqxbxeulacqmz5ekmopr3nsh9zmgve1dji0dccdy86uqyhq1m0
或者,如果您想将其指向包含 lorem.txt
的示例文件夹以及几行 lorem ipsum,它将是
dnslink=/ipfs/QmWRsWoZjiandZUXLyczXSoWi84hXNHvBQ49BiQx9hPdjs
作为示例,这里是我如何设置的摘要 test.privex.io
Domain: privex.io
(Subdomain) Name: _dnslink.test
Record Type: TXT
Value: dnslink=/ipns/k51qzi5uqu5dkqxbxeulacqmz5ekmopr3nsh9zmgve1dji0dccdy86uqyhq1m0
TTL (expiry): 120 (seconds)
(note: most people are fine with "auto" TTL, or the somewhat standard 600 TTL. If you intend to change the DNSLink value regularly, or you're experimenting and likely updating it constantly, you may want a low TTL of 60 or even 30)
设置好后,IPNS地址仍然指向原始的foo bar文本数据,我用ipfs cat
读取域指向的数据:
ipfs@privex:~$ ipfs cat /ipns/test.privex.io
foo bar foo bar foo foo foo
bar foo foo bar bar foo bar
2。将现有的 IPFS 对象添加到您的对象中,而无需 download/organise 正在添加的对象。
首先我们创建 IPFS 对象 - 一个包含 hello/lorem.txt
的包装文件夹 - 它具有对象 ID QmXCfnzXHThHwaTvSSAKeErxK48XkyVoL6ZNEhkpKmZyW3
ipfs@privex:~$ mkdir hello
ipfs@privex:~$ echo -e "lorem ipsum dolor\nlorem ipsum dolor\n" > hello/lorem.txt
ipfs@privex:~$ ipfs add -p -r -w hello
added Qme85tx5Wnsjc5pZZs1JGogBNUVM2WThC18ERh6t2YFJSK hello/lorem.txt
added QmWRsWoZjiandZUXLyczXSoWi84hXNHvBQ49BiQx9hPdjs hello
added QmXCfnzXHThHwaTvSSAKeErxK48XkyVoL6ZNEhkpKmZyW3
37 B / 37 B [=======================================================================] 100.00%
ipfs@privex:~$ ipfs ls QmXCfnzXHThHwaTvSSAKeErxK48XkyVoL6ZNEhkpKmZyW3
QmWRsWoZjiandZUXLyczXSoWi84hXNHvBQ49BiQx9hPdjs - hello/
ipfs@privex:~$ ipfs ls QmXCfnzXHThHwaTvSSAKeErxK48XkyVoL6ZNEhkpKmZyW3/hello
Qme85tx5Wnsjc5pZZs1JGogBNUVM2WThC18ERh6t2YFJSK 37 lorem.txt
接下来,为了创建一个不属于原始包装文件夹的示例外部对象 ID,我创建了 foo.txt
包含几行随机 foo bar
文本,并且自己上传到 IPFS。它的对象 ID 是 QmaDDLFL3fM4sQkQfV82LdNqtNnyaeAmgC46Qc7FDQdkq8
ipfs@privex:~$ echo -e "foo bar foo bar foo foo foo\nbar foo foo bar bar foo bar\n" > foo.txt
ipfs@privex:~$ ipfs add foo.txt
added QmaDDLFL3fM4sQkQfV82LdNqtNnyaeAmgC46Qc7FDQdkq8 foo.txt
57 B / 57 B [======================================================================] 100.00%
最后,我们使用ipfs object patch add-link
添加我之前创建的foo.txt
对象(QmaDDLFL3fM4sQkQfV82LdNqtNnyaeAmgC46Qc7FDQdkq8
),在我创建的原始wrapped文件夹的hello/
文件夹内(QmXCfnzXHThHwaTvSSAKeErxK48XkyVoL6ZNEhkpKmZyW3
).
命令的语法是:ipfs object patch add-link [object-to-add-to] [name-of-newly-added-file-or-folder] [object-to-inject]
ipfs@privex:~$ ipfs object patch add-link QmXCfnzXHThHwaTvSSAKeErxK48XkyVoL6ZNEhkpKmZyW3 hello/foo.txt QmaDDLFL3fM4sQkQfV82LdNqtNnyaeAmgC46Qc7FDQdkq8
QmaWoYZnSXnKqzskrBwtmZPE74qKe4AF5YfwaY83nzeCCL
它输出一个新的对象 ID QmaWoYZnSXnKqzskrBwtmZPE74qKe4AF5YfwaY83nzeCCL
,这是新创建的对象的 ID,其中包含来自原始对象的 hello/lorem.txt
和稍后注入的 hello/foo.txt
。
注意:当将整个包装文件夹添加到另一个包装文件夹时,此命令也有效,但是,请注意避免双重嵌套。例如您有 Qxxxx/hello/world
和 Qyyyy/lorem/ipsum
- 如果您将 Qyyyy 添加到指定名称 lorem
的 Qxxxx - 它将被添加为 Qzzzz/lorem/lorem/ipsum
如果我们现在对新对象 ID 执行 ipfs ls
,我们可以看到 hello/
子文件夹同时包含 foo.txt
和 lorem.txt
- 确认 foo.txt 已成功注入副本,无需同时下载原始文件和 foo.txt - 然后在上传前将它们正确组织在文件夹中。
ipfs@privex:~$ ipfs ls QmaWoYZnSXnKqzskrBwtmZPE74qKe4AF5YfwaY83nzeCCL
QmbU3BwdMarL8n6KCzVdYqMh6HEjCv6pLJQZhoVGWZ5bWW - hello/
ipfs@privex:~$ ipfs ls QmaWoYZnSXnKqzskrBwtmZPE74qKe4AF5YfwaY83nzeCCL/hello
QmaDDLFL3fM4sQkQfV82LdNqtNnyaeAmgC46Qc7FDQdkq8 57 foo.txt
Qme85tx5Wnsjc5pZZs1JGogBNUVM2WThC18ERh6t2YFJSK 37 lorem.txt
总结
如第一部分所述,IPFS 对象 ID 是不可变的,因此虽然可以合并 IPFS 上的现有对象,但它仍然会产生一个新的对象 ID。
但是,通过 使用 IPNS 密钥地址 and/or DNSLink,您可以拥有指向任何 IPFS 对象的可变(可编辑)引用,并且可以更新为按需指向新的对象 ID,例如每当您更新现有对象的内容时,或者如果您决定只是希望您的 IPNS key/domain 指向完全不同的内容,您都可以自由地这样做:)