我正在学习Solidity,并且有一些想法。目前,我很好奇文件/图片是否可以放在区块链上。我考虑采用某种混合方法,其中一些内容位于区块链上,而一些内容则存储在更传统的文件存储中并使用地址引用来获取它。我预见到一个问题是文件上传的gas价格。
我正在学习Solidity,并且有一些想法。目前,我很好奇文件/图片是否可以放在区块链上。我考虑采用某种混合方法,其中一些内容位于区块链上,而一些内容则存储在更传统的文件存储中并使用地址引用来获取它。我预见到一个问题是文件上传的gas价格。
能否在以太坊区块链上存储图像?
完全可以!
但你几乎肯定不应该这样做!
我预见到的一个问题是文件上传的 gas 费用。
这相当于每千字节将近 2 美元。
我不能告诉你这对你的应用程序是否过于昂贵,但你还应该考虑到 Gas 和 Ether 的价格随时间变化而剧烈波动,你应该预期会出现这个数字显著增加的时期。
注意:我试图存储那个长度为+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))
那么,你可以做什么来代替呢?
在区块链上处理文件的更好方法是使用某种文件存储服务,如 AWS-S3、IPFS、Swarm 等。
您可以将文件上传到上述其中一个文件存储服务器并生成哈希密钥(用于访问文件),并将此密钥保留在区块链中。
使用此方法的优点是 -
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,并且您只想与Bob分享它。
Bob将向您发送公钥。您将使用Bob的公钥加密文件,然后将其上传到IPFS网络。
您向Bob发送文件的哈希值。 Bob使用此哈希值获取文件。
Bob使用用于加密文件的公钥的私钥解密文件。
在非对称加密中,公钥由私钥生成,如果您使用公钥锁定某些内容,则唯一可以解锁该内容的密钥是生成给定公钥的私钥。