主页 > imtoken安卓ico > Java用IPFS和以太坊连接ipfs storage_stores数据

Java用IPFS和以太坊连接ipfs storage_stores数据

imtoken安卓ico 2023-02-24 06:32:41

如何在 IPFS 上存储 JSON 文件并使用 Oraclize 访问智能合约中的数据?

以太坊是一个成熟的区块链,使开发人员能够创建智能合约,即在区块链上执行的程序,可由交易触发。 人们经常将区块链称为数据库,但是使用区块链作为数据存储是非常昂贵的。

以当前价格(530 美元,4gwei)在以太坊上存储 250GB 将花费你 106,000,000 美元。 一般来说,我们可以忍受高成本,因为我们:

以太坊区块链上不会保留那么多数据。

区块链的审查制度、透明度和稳健性是值得的。

如果您是以太坊的新手,请查看此介绍。

去中心化存储

IPFS(Interplanetary File System)对区块链存储有一定的保障以太坊加密java,即去中心化和防篡改,但并不比传统的磁盘空间成本高。 运行具有 EBS 250GB 存储的 EC2 t2.micro 实例将花费您大约 15 美元/月。 IPFS 的一个独特之处在于它处理文件的方式。 它不使用基于位置的寻址(例如域名、IP 地址、文件路径等),而是使用基于内容的寻址。 一旦将文件(或目录)添加到 IPFS 存储库中,就可以通过其加密哈希来引用它。

$ ipfs 添加文章.json

添加了 Qmd4PvCKbFbbB8krxajCSeHdLXQamdt7yFxFxzTbedwiYM article.json

$ ipfs 猫 Qmd4PvCKbFbbB8krxajCSeHdLXQamdt7yFxFxzTbedwiYM

{

"title": "这是一个很棒的标题",

“内容”:“第 1 段\r\n\r\n第 2 段”

}

$卷曲

{

"title": "这是一个很棒的标题",

“内容”:“第 1 段\r\n\r\n第 2 段”

}

然后以太坊加密java,您可以使用 IPFS 客户端或任何公共网关访问这些文件。 您还可以创建非公共网关,使它们默认可写(只读),并实施授权方案以编程访问 IPFS 网络。

重要的是要了解 IPFS 不是其他节点将存储您的内容的服务。 如果您的内容不受欢迎,如果其他节点没有固定的哈希值(他们不想租用磁盘空间),垃圾收集器会将其从其他节点中删除。 只要网络上至少有一个节点真正关心您的文件并有兴趣存储它们,网络上的其他节点就可以轻松获取这些文件。 即使您的文件从网络上消失了,以后也可以重新添加,除非其内容发生变化,否则其地址(散列)将是相同的。

IPFS 和以太坊智能合约

即使以太坊协议不提供任何连接到 IPFS 的原生方式,我们也可以回退到像 Oraclize 这样的离线解决方案来解决这个问题。 Oraclize 允许提供具有各种数据的智能合约。 可用数据源之一是 URL。 我们可以使用公共网关读取 IPFS 上的 JSON 文件。 依靠单个网关会很薄。 我们将使用的另一个数据源是 IPFS。 通过使用 JSON 解析器(它是查询的一部分)读取 Oraclize 智能合约,我们可以提取 JSON 文档中的特定字段。

oraclize_query("IPFS", "json(Qmd4PvCKbFbbB8krxajCSeHdLXQamdt7yFxFxzTbedwiYM).title"));

如果 Oraclize 可以在 20 秒内获取文件,您可以期望得到一个异步请求。 如果您使用连接良好的节点上传文件,则无需担心超时。 我们的 EC2(法兰克福,欧盟)实例连接到大约 750 个对等点。 通过公共网关获取文件或在本地运行守护进程几乎是即时的。 响应是异步的,oraclize_query 调用返回查询 id (bytes32)。 您可以使用它作为来自 Oraclize 的数据的标识符。

函数 __callback(bytes32 _queryId, string _data) public {

require(msg.sender == oraclize_cbAddress());

过程数据(数据);

}

出于安全原因,我们要确保只允许 Oraclize 调用 __callback 函数。

性能和实施

最初,我担心性能。 它能否像集中式服务发送响应一样快地获取托管在 IPFS 上的 JSON 文件? 我对结果感到惊喜。

$ 工作-d10s

运行 10s 测试 @

2 个线程和 10 个连接

线程统计 Avg Stdev Max +/- Stdev

延迟 59.18ms 24.36ms 307.93ms 94.73%

请求/秒 86.34 15.48 101.00 85.57%

10.05 秒内 1695 个请求,读取 1.38MB

请求/秒:168.72

传输/秒:140.70KB

当我们查看博客时,作者在智能合约上调用 addPost 时只需输入 IPFS 哈希。 我们使用 IPFS 和 Oraclize 从文件中读取标头,以使用以太坊事件存储它。 我们不需要为其他智能合约保留标头,因此对于我们的用例,使用事件就足够了。 这可能不是最具开创性的例子,但它是如何优化低交易费用的一个很好的例子。

编译指示可靠性 0.4.24;

导入“openzeppelin-solidity/contracts/ownership/Ownable.sol”;

导入“./lib/usingOraclize.sol”;

导入“./lib/strings.sol”;

合同博客正在使用 Oraclize,Ownable {

将字符串用于 *;

映射(地址=>字符串[])public hashesByAuthor;

映射(bytes32 => 字符串)public hashByQueryId;

映射(bytes32 => 地址)public authorByHash;

事件 PostAdded(地址索引作者,字符串哈希,uint 时间戳,字符串标题);

事件 PostSubmitted(地址索引作者,字符串哈希,bytes32 queryId);

uint 私有 gasLimit;

构造函数(uint _gasPrice,uint _gasLimit)公共{

setCustomOraclizeGasPrice(_gasPrice);

setCustomOraclizeGasLimit(_gasLimit);

}

函数 getPrice(string_source) 公共视图返回 (uint) {

返回 oraclize_getPrice(_source);

}

函数 setCustomOraclizeGasPrice(uint _gasPrice) public onlyOwner {

oraclize_setCustomGasPrice(_gasPrice);

}

函数 setCustomOraclizeGasLimit(uint _gasLimit) public onlyOwner {

gasLimit = _gasLimit;

}

函数 withdraw() public onlyOwner {

所有者。 转移(地址(本)。余额);

}

函数 __callback(bytes32 _queryId, string _title) public {

require(msg.sender == oraclize_cbAddress());

要求(字节(hashByQueryId [_queryId])。长度!= 0);

字符串内存哈希 = hashByQueryId[_queryId];

地址 author = authorByHash[keccak256(bytes(hash))];

hashesByAuthor[作者].push(散列);

发射 PostAdded(作者,散列,现在,_title);

}

function addPost(string_hash) public payable returns (bool) {

require(authorByHash[keccak256(bytes(_hash))] == address(0), "这篇文章已经存在");

require(msg.value >= oraclize_getPrice("IPFS"), "手续费太低了");

bytes32 queryId = oraclize_query("IPFS", "json(".toSlice().concat(_hash.toSlice()).toSlice().concat(").title".toSlice()), gasLimit);

authorByHash[keccak256(bytes(_hash))] = msg.sender;

hashByQueryId[queryId] = _hash;

发出 PostSubmitted(msg.sender, _hash, queryId);

返回真;

}

函数 getPriceOfAddingPost() 公共视图返回 (uint) {

返回 oraclize_getPrice("IPFS");

}

}

前端使用 Web3 读取事件并为给定作者构建所有博客文章的列表。

降价项目的内容也存储在 IPFS 上。 它允许对添加新博客文章收取固定费用。 我们使用一系列公共 IPFS,从我们自己的开始。 这是有道理的,尤其是当您从同一节点上传文件时。 如果您决定以写入模式运行网关,您还可以以编程方式固定文件(默认情况下它是只读的)。 我们还允许用户指定他们自己的网关。 如果用户安装了 IPFS Companion,他可以在自己的节点上运行它。

BlogEvents.getPastEvents("PostAdded", { fromBlock: 0, filter: { author } }).then(events => {

this.setState({ addedPosts: events.map(e => e.returnValues) });

});

//...

getPost(gatewayIndex = 0) {

this.fetchPostFromIpfs(网关[gatewayIndex])

.catch(() => this.retry(gatewayIndex))

}

综上所述

我们从以太坊智能合约请求 IPFS 数据的小实验让我们深入了解了 IPFS 性能,并为进一步实施更多生产用例奠定了基础。

性能问题唯一值得关注的地方可能是 IPNS。 IPNS 是 IPFS 的命名系统,允许可变 URL。 散列对应于对等 ID 而不是文件或目录内容散列。 0.4.14 版中引入的新 IPNS 解析器和发布器缓解了一些问题。 确保您拥有最新版本并使用 -enable-namesys-pubsub 选项运行守护程序,以便从几乎即时的 IPNS 更新中获益。

在 Amazon Linux 2 上连续运行 IPFS 节点,没有任何重大问题。

================================================ == =====================

分享一些以太坊、EOS、比特币等区块链相关的交互式在线编程实战教程:

Java以太坊开发教程,主要为java和android程序员讲解区块链以太坊开发的web3j详解。

Python Ethereum,主要供python工程师使用web3.py详细开发区块链以太坊。

PHP Ethereum主要介绍使用PHP进行智能合约开发交互、账户创建、交易、转账、代币开发、过滤器和交易等。

以太坊入门教程,主要介绍智能合约和dapp应用开发,适合入门。

以太坊开发进阶教程,主要介绍使用node.js、mongodb、blockchain、ipfs实现去中心化电商DApp实战,适合进阶。

C#以太坊主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器与交易等。

EOS教程,本课程帮助您快速上手开发EOS区块链去中心化应用,涵盖EOS工具链、账户钱包、发行代币、智能合约开发部署、使用代码与智能合约交互等核心知识点,以及最终利用所有知识点完成一个笔记DApp的开发。

Java比特币开发教程,本课程面向初学者,内容涵盖比特币的核心概念,如区块链存储、去中心化共识机制、密钥和脚本、交易和UTXO等。在代码中集成比特币支持功能,如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。

php比特币开发教程,本课程面向初学者,内容涵盖了比特币的核心概念,如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时还详细讲解了如何使用Php集成比特币在代码中的支持功能,如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习教程。

tendermint区块链开发详解。 本课程适合想要使用tendermint进行区块链开发的工程师。 课程内容包含了tendermint应用开发模型中的核心概念,如ABCI接口、Merkle树、多版本状态库等,包含了丰富的代币发行等实用代码,是go语言工程师快速上手的最佳选择开始区块链开发。