能否在以太坊区块链上存储图片?

10

我正在学习Solidity,并且有一些想法。目前,我很好奇文件/图片是否可以放在区块链上。我考虑采用某种混合方法,其中一些内容位于区块链上,而一些内容则存储在更传统的文件存储中并使用地址引用来获取它。我预见到一个问题是文件上传的gas价格。


同一主题已在此其他帖子中讨论过"Storing and Retrieving Data in Ethereum Blockchain"。他们建议使用分布式技术IPFS + Swarm。 - user11125583
我在想这可能有什么用途?也许是用户图片。除此之外呢...? - who-aditya-nawandar
8个回答

13

能否在以太坊区块链上存储图像?

完全可以!

但你几乎肯定不应该这样做!

我预见到的一个问题是文件上传的 gas 费用。

  • 数据存储的成本为每千字节 640k gas。
  • 当前的 gas 价格大约为 15 Gwei(或 0.000000015 ETH)。
  • 以今天的价格,1 ETH 大约是 200 美元。

这相当于每千字节将近 2 美元。

我不能告诉你这对你的应用程序是否过于昂贵,但你还应该考虑到 Gas 和 Ether 的价格随时间变化而剧烈波动,你应该预期会出现这个数字显著增加的时期。


3

注意:我试图存储那个长度为+10,000的、100kb大小的图片的base64字符串,但它没有被接受。但是当我尝试1kb的图片时,它成功了。

是的。这是实现它的Solidity代码:

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract ImgStorage {
    uint i=0;
    mapping(uint => string[]) public base64_images;
    function push(string memory  base64_img) public {
        base64_images[i].push(base64_img);
        i++;        
    }
    function returnImage(uint n) public view returns(string[] memory){
        return base64_images[n];
    }
}

代码执行结果图像: 在此输入图片描述

您可以在线将图像转换为base64字符串,反之亦然。 以下是将图像转换为base64字符串的NodeJS代码:

const imageToBase64 = require('image-to-base64');
const fs=require('fs')
imageToBase64("img/1kb.png") 
    .then(data => {fs.writeFile('1kb_png.md',data, (err)=>{console.log(err)})})
    .catch(err =>console.log(err))

2
我完全同意@Peter Hall的观点,将图像存储在以太坊上成本太高。

那么,你可以做什么来代替呢?

  • 您可以将图像存储在IPFS上。IPFS为您提供了一个固定长度的哈希值。现在,您可以将此哈希值存储在以太坊上,这样的成本比其他方式更低。

1
从技术上讲,是的,你可以存储非常小的图像。但你不应该这样做。
首选方案
将图像存储在分布式文件存储中(例如Swarm或IPFS),并在链上存储图像的哈希值,如果图像的真实性很重要。如果这不重要,那么可能不需要将任何内容放在链上。
有什么技术限制?
主要是区块的燃气限制。目前,以太坊主网有8Mgas的区块限制。每新增32字节的存储使用20k gas。因此,你不能存储数据总和超过12.8kb,因为它无法适应区块。
为什么我不能用它来存储小文件?
区块链没有为这种用途而设计(这就是为什么其他项目如Swarm和IPFS存在的原因)。它会使一切变得臃肿和缓慢,而且与其他文件存储系统相比,没有提供任何优势。类比地说,你通常也不会在SQL数据库中存储文件。

1
您可以在以太坊区块链上存储图像,但由于高质量区块链的“区块空间溢价”,这样做太昂贵了。
其他更实惠的分散存储解决方案包括:
  • Chia
  • Filecoin(其中Filecoin VM智能合约可以操作文件)
  • Arweave
  • Storj

0
将图像存储在链上是一个强烈的“NO”!
在数据库中存储图像也不是一个好的做法,我假设你只是指像S3/firebase这样的文件存储解决方案。将图像存储在中央服务器上是可以的,但这取决于您想要实现什么目标,还有像IPFS和Swarm这样的去中心化存储解决方案可供参考。

0

在区块链上处理文件的更好方法是使用某种文件存储服务,如 AWS-S3、IPFS、Swarm 等

您可以将文件上传到上述其中一个文件存储服务器并生成哈希密钥(用于访问文件),并将此密钥保留在区块链中。

使用此方法的优点是 -

  1. 低成本解决方案
  2. 使用文件存储搜索算法轻松快速地访问文件
  3. 轻量级
  4. 具备从区块链到数据库或反之互相迁移的灵活性
  5. 如果文件存储系统具有良好的防篡改安全性,则这些文件不会在没有正确哈希密钥的情况下被访问
  6. 易于执行从一项服务到另一项服务的文件存储迁移

0

Ethereum太重且昂贵,无法存储像图片、视频等大块数据。因此,需要一些外部存储来存储更大的对象。这就是星际文件系统(IPFS)的作用。以太坊Dapp可以容纳少量数据,而对于保存更多或更大的内容,例如图片、文字、PDF文件等,我们使用IPFS。

IPFS是一个开源协议和网络,旨在创建一种点对点的存储和共享数据的方法。它类似于Bit Torrent。

如果您想将PDF、Word或图像文件上传到IPFS。

1- 将PDF、Word或图像文件放入您的工作目录中。

2- 您通知IPFS添加此文件,生成文件的哈希值。请注意,IPFS哈希始终以“Qm…”开头。

3- 您的文件现在可在IPFS网络上使用。

现在您已经上传了文件并想与Bob分享该文件。您向Bob发送文件的哈希值,Bob使用哈希值并调用IPFS获取文件。文件现在已在Bob的端下载。问题在于,任何能够访问哈希值的人也将能够访问该文件。

通过非对称加密在IPFS上共享数据

假设您已将文件上传到IPFS,并且您只想与Bob分享它。

  • Bob将向您发送公钥。您将使用Bob的公钥加密文件,然后将其上传到IPFS网络。

  • 您向Bob发送文件的哈希值。 Bob使用此哈希值获取文件。

  • Bob使用用于加密文件的公钥的私钥解密文件。

在非对称加密中,公钥由私钥生成,如果您使用公钥锁定某些内容,则唯一可以解锁该内容的密钥是生成给定公钥的私钥。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接