一个关于分享资源的不成熟想法

Personal EssaysWebipfs资源分享
30-01-2025 - 15:59
fylcr

fylcr

1351

30-01-2025 - 15:59

引入

    2023年,我在zhelper search上查书,了解到了ipfs技术。当时并没有觉得有什么,便不再理它。

    时隔一年后(2024年),我在下galgame的时候知道了梓零的网站。当时下得非常开心,但是没一两月E5炸了,梓零倒了。于是我在想有什么办法能成本低地分享大文件,并且还不容易挂。这时我突然想起了ipfs协议,并浅浅地学习了一下。

开端

    ipfs协议是一个非常新的东西(2012年面世),但是它却非常地NB(原谅我词穷了)。我认为ipfs协议NB之处有四点:

  1. 资源比较稳定(只要不过于冷门,一般不会丟失)

  2. 理论上永远不会被墙

  3. 免费上传,免费下载

    看到这里,可能资源大佬觉得与种子差不多,但是ipfs协议与种子有一个最大的区别,就是:

无需做种,资源是否冷门只决定资源存在时长,不决定下载速度

发展

    那么怎么用ipfs协议呢?论坛已有大佬给出教程。我这里再补一个网关和测速的:

网关:https://cdn.img2ipfs.com/ipfs/[CID]

网关测速:https://ipfs.github.io/public-gateway-checker

    虽说ipfs协议比较稳定,但是速度也只稳定在80-100kB/s,这也是很多大佬放弃ipfs协议的原因。难道ipfs协议真的只是空有的...NB吗?

高潮

    ipfs协议之所以低速,是因为ipfs不支持多线程下载。如果大佬们浅浅了解ipfs/web3的话,便会知道ipfs从技术上就不支持多线程下载。

    那么ipfs真的没救了吗?

    托马斯·维德曾言“前进,前进!不择手段地前进!”如果ipfs不支持多线程的话,那么我们便强行让它支持就可以了。

    我们使用BinaryCutting-Tool切分文件为n个1MB左右的文件,之后写一个index.html,可以多线程地下载这n个文件,之后再合并成原文件下载。这样就解决了多线程的问题。

    下面附上demo的index.html(用文心一言生的,不过我觉得不行。这也是我发这个话题的原因——请大佬修改出一个更好的代码)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Parallel Download</title>
</head>
<body>
    <h1>Parallel Download Example</h1>
    <button id="downloadButton">Start Download</button>
    <div id="status"></div>

    <script>
        const TOTAL_PARTS = n; // Replace n with the actual number of parts
        const BASE_URL = 'https://example.com/';
        const OUTPUT_FILE_NAME = 'file.name';

        document.getElementById('downloadButton').addEventListener('click', async () => {
            const statusDiv = document.getElementById('status');
            statusDiv.textContent = 'Downloading...';

            const partPromises = [];
            for (let i = 1; i <= TOTAL_PARTS; i++) {
                partPromises.push(downloadPart(i));
            }

            try {
                const parts = await Promise.all(partPromises);
                const blob = new Blob(parts);
                const url = URL.createObjectURL(blob);

                const a = document.createElement('a');
                a.style.display = 'none';
                a.href = url;
                a.download = OUTPUT_FILE_NAME;
                document.body.appendChild(a);
                a.click();

                window.URL.revokeObjectURL(url);
                statusDiv.textContent = 'Download complete!';
            } catch (error) {
                statusDiv.textContent = `Error: ${error.message}`;
            }
        });

        async function downloadPart(partNumber) {
            const response = await fetch(`${BASE_URL}${partNumber}.bin`);
            if (!response.ok) {
                throw new Error(`Failed to download part ${partNumber}: ${response.statusText}`);
            }
            return response.arrayBuffer();
        }

        // If you want to use Web Workers for better performance,
        // you can implement a worker script and manage the download tasks there.
        // However, for simplicity, we'll stick with the main thread here.
    </script>
</body>
</html>

结尾

    2024年,对于许多资源大佬而言,是一个不算好的年。E5崩了,onedrive开始割韮菜,各大网盘也开始整活,加强了API防护与资源审查,国内做种环境变差的同时还有某雷吸血。各位大佬在改后缀名、不断压缩与hash混淆中与各大网盘斗智斗勇,而各位"贫民"在与网盘限速、找解压密码和工具中过得水深火热

    我希望,2025年是一个各位大佬不被封号和不再炸链的一年,是一个各位"贫民"轻松下gal的一年,是一个让所有人都能玩gal的一年。这是我引入ipfs技术的原因。虽然目前方案并不成熟,但是我相信在各位大佬的帮助下,我们一定可以建造更美好的未来。

    最后,祝大家新年快乐!同时谢谢过去一年因无私分享而付出努力的大佬们!

Topic status:Normal
762
fylcr

fylcr

1351

=> fylcr
Replied To @ fylcr

总结:我这里有一份代码,想请懂前端的大佬看一下,给些建议。

30-01-2025 - 15:59

鲲

4834

=> fylcr
Replied To @ fylcr

刚刚在 Telegram 群讨论了一下这个问题,有几个朋友一致觉得太慢了

https://t.me/kungalgame/778170

30-01-2025 - 16:10

Comments
KUN
fylcr Commented to
慢这个问题是我了解的(本人下过3.5G的资源),这个话题研究的不是从ipfs上下一个几个G的东西,而是在研究从ipfs上同时下几个大约1MB(ipfs会把一个大文件拆成大小约1MB的文件存到全球各地),之后再把这一堆子1MB的文件合为一个文件是否可行。举一个实例:m3u8就是类似的东西(正是m3u8给了我这个思路)。最后就一句话:ipfs下得慢≠我的方䅁不行,ipfs一次能下好几个东西=可行(还请大佬转述一下,因为我没tg号(没海外手机号→没法办visa卡))
KUN
鲲 Commented to fylcr
其实是因为不仅下载慢而且上传更慢
Ashiroid
=> fylcr
Replied To @ fylcr

对于一个百度网盘免费用户,感觉80KB-100KB的下载速度也不是不行?

但既然搞文件分享的大佬们说这样太慢了,不适合分享,我没有异议。不过,我认为重点在于作为一个P2P协议,IPFS安全性如何?就像类似torrent这种基于文件hash的协议基本上是明文的,会不会受国内缺乏公网ip的影响,或者被运营商/网络代理(机场)通过流量探测判断协议类型封禁两点?倘若这种去中心化的协议若能实现,自然没问题。

不过既然说了这是一个“理论上永远不会被墙”的协议,以上问题或许有些对策了吧。总之,感谢分享。

https://ipfs.tech/
https://en.wikipedia.org/wiki/InterPlanetary_File_System

30-01-2025 - 16:59

Comments
KUN
fylcr Commented to Ashiroid
你的担忧应该是ipfs会不会像p2p杀手类似的技术给ban掉。这个问题我是比较难回答的,因为ipfs与p2p有差别的,但说不好这个差别会不会被识别到。我能解释的只有一句话:与其说ipfs像p2p吧,不如说ipfs更像比特币(指Filecoin,并且ipfs跟以太坊有很大关联)+p2p+git+...如果你真地想问个所以然的话,你可以去[登链社区](https://learnblockchain.cn)。不过ipfs协议还是很抽象的,如果你以后不专攻web3的话,我还是建议你只是把ipfs当成一个网盘
鲲

4834

=> fylcr
Replied To @ fylcr

image.png

image.png

31-01-2025 - 06:30

Comments
KUN
fylcr Commented to
这位大佬估计指的是ipfs存储网盘,这个确实是只剩下了国外的在服务,并且上传极慢。但是ipfs是可以自己搭网关的(指ipfs desktop)。如果是自搭网关的话,上传速度是十分可观的(今年一月份我在上传2.7G的东西时跑到了10M/s左右的速度)。这里还有人做的测试数据(https://zhuanlan.zhihu.com/p/518262755?utm_id=0)当然,这里还用热心大佬做的图床(https://app.img2ipfs.org/)(这个图床的服务器性能不太好,上传大文件不行,但是几M的图片还是可以的,并且上传速度也差不多在500k-1M/s(这是我才试的,附上链接https://i0.img2ipfs.com/ipfs/QmRry1AhEB6jY7Sxbm8yzUTAfGTc1EePjhKz2RFpymbWnz?filename=b_bg01.png))(但是ipfs下载真的太慢了,不过目前我了解的是ipfs可以同时下载好几个文件(可以并行下载),所以才有了分片下载的设想(只可惜没有demo)。如果真想下大文件的话,建议用ipfs本地网关先pin上几个小时再下载)
KUN
Ashiroid Commented to fylcr
Emmm,把CID挂到galgame区?(虽然wikipedia只说了brave和opera支持ipfs协议)
按照拆分文件的思路的话,因为同时存在很多小文件,以这种方式分享的资源难以通过单独的一个链接下载,既然服务器没有多余算力整合资源,那么一个更加可行的方式是下载一个列表,然后通过可信?的客户端下载
这部分内容也许可以另开一个教程,毕竟大部分都还仅存于理论中(可不要一不小心就把小站变成技术论坛了)
kohaku