繁体   English   中英

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

[英]Is it possible to store images on the Ethereum blockchain?

我正在加紧学习 Solidity,并有一些想法。 目前我很好奇文件/图像是否可以放在区块链上。 我在想另一种方法是一些混合方法,其中一些东西在区块链上,一些东西在更传统的文件存储中,并使用地址引用来抓取它。 我预见的一个问题是文件上传的汽油价格。

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

绝对可能!

你应该这样做吗? 几乎肯定不是!

我预见的一个问题是文件上传的汽油价格。

  • 数据存储成本为每千字节数据640k气体。
  • 目前的天然气价格约为15 Gwei(或0.000000015 ETH)。
  • 按今天的价格计算,1 ETH约为200美元。

每千字节的成本不到2美元。

我不能告诉你这是否对你的应用来说太昂贵了,但是你也应该考虑到Gas和Ether的价格随着时间的推移而变化很大,你应该期望这个数字会明显更高。

注意:我尝试存储 100kb 图像的 +10,000 长 base64 字符串,但它不接受。 但是当我尝试 1kb 图像时,它起作用了。

是的。 这是执行此操作的可靠代码:-

// 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))

从技术上讲,是的,你可以存储非常小的图像。 但你不应该。

首选替代方案

将图像存储在分布式文件存储(例如,Swarm或IPFS)中,并将图像的哈希值存储在链上,如果图像对于可证明未被篡改非常重要。 如果这不重要,那么也许不要把任何东西放在链上。

有什么技术限制?

主要是块的气体限制。 目前,以太坊主网拥有8Mgas的限制。 每个新的32字节存储使用20k气体。 因此,您无法存储总和超过12.8kb的数据,因为它不适合块。

为什么我不应该将它用于小文件?

区块链不是为这种用法而设计的(这就是存在Swarm和IPFS等其他项目的原因)。 它会使所有内容变得臃肿并减速,而不会为您提供超过其他文件存储系统的任何好处。 通过类比,您通常也不会将文件存储在SQL数据库中。

我完全赞同@Peter Hall将图像存储在以太坊上太昂贵了。


那么,你可以做什么而不是这个呢?

  • 您可以将图像存储在IPFS上。 IPFS为您提供固定长度的哈希值。 现在,您可以将此哈希存储在以太坊上,并且它的成本低于另一种方式。

在链上存储图像是一个有力的NO

将图像存储在数据库中也不是一个好习惯,我假设你只是指S3 / firebase等文件存储解决方案。 将图像存储在中央服务器上是可以的,但这取决于您想要实现的目标,您可以查看IPFS和Swarm等分散存储解决方案。

以太坊太重而且太昂贵,无法存储图像、视频等大块。 因此,需要一些外部存储来存储更大的对象。 这就是星际文件系统(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 使用他用来加密文件的公钥的私钥来解密文件。

在非对称密码术中,公钥由私钥生成,如果您用公钥锁定某物,则唯一可以解锁该事物的密钥是生成给定公钥的私钥。

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

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

使用这种方法的优点是 -

  1. 低成本解决方案
  2. 使用文件存储搜索算法轻松快速地访问文件
  3. 轻的
  4. 从区块链迁移到数据库的灵活性,反之亦然
  5. 如果文件存储系统具有良好的防篡改安全性,那么请放心,如果没有正确的 hash 密钥,这些文件将不会被访问
  6. 轻松将文件存储从一项服务迁移到另一项服务

您可以将图像存储在以太坊区块链上,但由于高质量区块链的“区块空间溢价”,它太贵了。

其他更实惠的去中心化存储解决方案包括

  • 正大
  • Filecoin(Filecoin VM 智能合约可以在其中操作文件)
  • Arweave
  • 斯托杰

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM