基于Web3.0的区块链图片上传

web3 · 浏览次数 : 0

小编点评

本文将简要介绍Web3.0、区块链以及如何使用Python和Web3.py库开发一个基于Web 3.0的图片上传系统。 一、Web3.0与区块链的关系 Web3.0是指下一代互联网技术,它允许用户在去中心化的网络上进行交互,实现更高级别的应用场景,如去中心化金融、去中心化应用等。区块链是Web3.0的核心技术之一,它是一种分布式数据库,通过加密算法确保数据的安全性和完整性。 二、需求分析 本文旨在开发一个基于Python的Web 3.0图片上传系统,要求如下: 1. 用户能够上传图片到去中心化的网络上。 2. 图片将被存储在区块链上,以确保数据的不可篡改性和可追溯性。 3. 系统应具备用户认证功能,以确保只有授权用户才能上传图片。 三、环境设置 为了实现上述需求,我们需要安装Python和相关库,如Flask和web3.py。此外,还需要配置IPFS节点以便与区块链交互。 四、详细步骤 1. 安装Python库:使用pip安装Flask、web3和ipfshttpclient2库。 2. IPFS集成:使用ipfshttpclient库将图片上传到IPFS,并获取图片的CID。 3. 区块链集成:使用web3.py库将IPFS CID记录在区块链上。 4. Web接口:使用Flask创建一个Web接口,允许用户上传图片。 五、智能合约 为了将IPFS CID存储在区块链上,我们将使用Solidity编写智能合约。智能合约将定义一个映射,将账户地址与CID列表关联起来。存储CID的函数将允许用户向合约中添加CID,而获取CID的函数将允许用户从合约中检索所有CID。 六、部署智能合约 使用web3.py库部署智能合约涉及以下步骤: 1. 编写智能合约代码:创建一个Solidity文件(如IPFSStorage.sol),并编写智能合约代码。 2. 编译智能合约:使用solc编译器编译智能合约。 3. 部署智能合约:使用web3.py库部署合约,包括创建交易、签署交易以及发送交易到以太坊网络。 七、总结 本文介绍了Web3.0和区块链的基本概念,并展示了如何使用Python和Web3.py库开发一个基于Web 3.0的图片上传系统。系统将允许用户上传图片,并将图片存储在去中心化的网络上,同时记录交易信息在区块链上。

正文

开始前,我们先简单了解一下基本的概念,我大致归纳为以下几个点
什么是Web3.0,和区块链又有什么关系?(上回的文章不就派上用场了)

需求:开发一个基于Python的Web 3.0图片上传系统。这个系统将允许用户上传图片,并将图片存储在去中心化的网络上,同时记录交易信息在区块链上。
本就是写着玩的,想过要写成用户认证文件操作集成全套管理的,让他‘终将成为图片上传服务的最终解决方案’
实际下来却发现不是很实际,就作罢了,奈何我一直以来对图片这么执着

步骤概述

  1. 环境设置:使用Python开发,安装必要的Python库。
  2. IPFS集成:将图片上传到IPFS,获取图片的CID(Content Identifier)。
  3. 区块链集成:将IPFS CID记录在区块链上。
  4. Web接口:使用Flask创建一个Web接口,允许用户上传图片。

详细步骤

1. 环境设置

安装所需的Python库:

pip install flask web3 ipfshttpclient

2. IPFS集成

IPFS(InterPlanetary File System)是一种点对点的文件存储协议。我们可以使用ipfshttpclient库来与IPFS网络交互。

首先,确保你已经安装并运行了IPFS节点。如果还没有安装IPFS,可以在IPFS官网找到安装指南。

以下是上传图片到IPFS的代码示例:

import ipfshttpclient

def upload_to_ipfs(file_path):
    client = ipfshttpclient.connect('/ip4/127.0.0.1/tcp/5001')
    res = client.add(file_path)
    return res['Hash']

3. 区块链集成

使用web3.py库将IPFS CID记录到区块链上。我们将以太坊(Ethereum)作为示例区块链。

以下是一个简单的智能合约示例,用于存储IPFS CID:

pragma solidity ^0.8.0;

contract IPFSStorage {
    mapping(address => string[]) public userCIDs;

    function storeCID(string memory cid) public {
        userCIDs[msg.sender].push(cid);
    }

    function getCIDs() public view returns (string[] memory) {
        return userCIDs[msg.sender];
    }
}

编译并部署该合约后,使用以下Python代码与智能合约交互:

from web3 import Web3

# 连接到以太坊节点
w3 = Web3(Web3.HTTPProvider('http://localhost:8545'))

# 合约地址和ABI(在部署合约后获取)
contract_address = 'YOUR_CONTRACT_ADDRESS'
contract_abi = 'YOUR_CONTRACT_ABI'

contract = w3.eth.contract(address=contract_address, abi=contract_abi)

def store_cid_on_blockchain(cid, account, private_key):
    txn = contract.functions.storeCID(cid).buildTransaction({
        'from': account,
        'nonce': w3.eth.getTransactionCount(account),
        'gas': 2000000,
        'gasPrice': w3.toWei('50', 'gwei')
    })

    signed_txn = w3.eth.account.sign_transaction(txn, private_key=private_key)
    txn_hash = w3.eth.sendRawTransaction(signed_txn.rawTransaction)
    return txn_hash.hex()

4. Web接口

使用Flask创建一个Web接口来上传图片。

from flask import Flask, request, jsonify
import os

app = Flask(__name__)

@app.route('/upload', methods=['POST'])
def upload_file():
    if 'file' not in request.files:
        return jsonify({'error': 'No file part'})
    file = request.files['file']
    if file.filename == '':
        return jsonify({'error': 'No selected file'})

    if file:
        file_path = os.path.join('/path/to/save/uploads', file.filename)
        file.save(file_path)

        # 上传到IPFS
        cid = upload_to_ipfs(file_path)

        # 存储到区块链
        account = 'YOUR_ETHEREUM_ACCOUNT'
        private_key = 'YOUR_PRIVATE_KEY'
        txn_hash = store_cid_on_blockchain(cid, account, private_key)

        return jsonify({'cid': cid, 'transaction_hash': txn_hash})

if __name__ == '__main__':
    app.run(debug=True)

上传成功后会返回一个HASH的值,这个就是图片在ipfs上的ID。
本地网关访问:ipfs://QmVJGX3FJPZsAgGMtJZoTt14XBj8QKhPwaaP4UfCcvYaN2 、ipfs://QmRF9mejyfq89vAJ5yfsBbmVY3RUcLqfSsVTAmAbS8U2xD
外网网关:https://ipfs.crossbell.io/ipfs/QmVJGX3FJPZsAgGMtJZoTt14XBj8QKhPwaaP4UfCcvYaN2https://ipfs.crossbell.io/ipfs/QmRF9mejyfq89vAJ5yfsBbmVY3RUcLqfSsVTAmAbS8U2xD

智能合约

我们将使用Solidity编写智能合约,用solc编译器编译合约,并使用web3.py库部署合约到以太坊网络。

1. 编写智能合约代码

首先,创建一个Solidity文件(如IPFSStorage.sol),并编写你的智能合约代码:

// IPFSStorage.sol
pragma solidity ^0.8.0;

contract IPFSStorage {
    mapping(address => string[]) public userCIDs;

    function storeCID(string memory cid) public {
        userCIDs[msg.sender].push(cid);
    }

    function getCIDs() public view returns (string[] memory) {
        return userCIDs[msg.sender];
    }
}

2. 编译智能合约

要编译Solidity智能合约,我们可以使用solc编译器。你可以通过以下命令安装Solidity编译器:

npm install -g solc

然后,使用以下命令编译智能合约:

solc --abi --bin IPFSStorage.sol -o build/

这将生成两个文件:IPFSStorage.abi(合约的ABI)和IPFSStorage.bin(合约的字节码)。

3. 部署智能合约

使用web3.py库部署合约。确保你已经运行了一个以太坊节点(如使用Ganache本地开发环境)。

首先,安装web3.py

pip install web3

然后,编写并运行以下Python脚本来部署合约:

from web3 import Web3

# 连接到以太坊节点(使用Ganache本地节点为例)
w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:7545'))

# 读取合约的ABI和字节码
with open('build/IPFSStorage.abi', 'r') as abi_file:
    contract_abi = abi_file.read()

with open('build/IPFSStorage.bin', 'r') as bin_file:
    contract_bytecode = bin_file.read()

# 设置部署账号和私钥(使用Ganache提供的账号)
deployer_account = '0xYourAccountAddress'
private_key = 'YourPrivateKey'

# 创建合约对象
IPFSStorage = w3.eth.contract(abi=contract_abi, bytecode=contract_bytecode)

# 构建交易
transaction = IPFSStorage.constructor().buildTransaction({
    'from': deployer_account,
    'nonce': w3.eth.getTransactionCount(deployer_account),
    'gas': 2000000,
    'gasPrice': w3.toWei('50', 'gwei')
})

# 签署交易
signed_txn = w3.eth.account.sign_transaction(transaction, private_key=private_key)

# 发送交易并获取交易哈希
txn_hash = w3.eth.sendRawTransaction(signed_txn.rawTransaction)
print(f'Transaction hash: {txn_hash.hex()}')

# 等待交易确认
txn_receipt = w3.eth.waitForTransactionReceipt(txn_hash)
print(f'Contract deployed at address: {txn_receipt.contractAddress}')

总结

编译智能合约生成的ABI和字节码用于与合约交互,部署合约则涉及到创建交易、签署交易并将交易发送到以太坊网络。部署成功后,可以通过交易回执获取合约地址,并使用这个地址与合约进行交互。

与基于Web3.0的区块链图片上传相似的内容:

基于Web3.0的区块链图片上传

开始前,我们先简单了解一下基本的概念,我大致归纳为以下几个点 什么是Web3.0,和区块链又有什么关系?(上回的文章不就派上用场了) 需求:开发一个基于Python的Web 3.0图片上传系统。这个系统将允许用户上传图片,并将图片存储在去中心化的网络上,同时记录交易信息在区块链上。 本就是写着玩的,

这个vue3的后台管理系统虽然简洁但不简单

今天介绍一个新的Vue后台管理框架,相比其他后台功能丰富管理系统,这个后台管理系统可以用干净简洁来形容——Nova-admin Nova-admin Nova-admin 是一个基于Vue3、Vite5等最新技术的后台管理平台。用简单的方式实现完整功能,并尽可能的考虑代码规范,易读易理解无过度封装,

基于NOSTR协议的“公有制”版本的Twitter,去中心化社交软件Damus用后感,一个极端走向另一个极端

最近,一个幽灵,Web3的幽灵,在网络游荡,它叫Damus,这玩意诠释了什么叫做病毒式营销,滑稽的是,一个Web3产品却在Web2的产品链上疯狂传销,各方大佬纷纷为其背书,到底发生了什么?Damus的葫芦里,卖的是什么药? 注册和简单实用 很少有什么产品在用户注册环节会有什么噱头,但Damus确实出

Web3开发者技术选型:前端视角(next.js)

引言 在现代Web开发的世界中,Web3技术的兴起为前端开发者开辟了新的可能性。Web3技术主要指的是建立在区块链基础上的分布式网络,使用户能够通过智能合约和去中心化应用(DApps)直接交互,而无需传统的中介机构。为了有效地开发Web3应用,前端开发者需要掌握一些关键的技术和工具,其中Next.j

基于 .net core 8.0 的 swagger 文档优化分享-根据命名空间分组显示

之前也分享过 Swashbuckle.AspNetCore 的使用,不过版本比较老了,本次演示用的示例版本为 .net core 8.0,从安装使用开始,到根据命名空间分组显示,十分的有用

跟我一起学习和开发动态表单系统-前端用vue、elementui实现方法(3)

基于 Vue、Element UI 和 Spring Boot + MyBatis 的动态表单系统前端实现解析 在现代企业信息系统中,动态表单是一种非常常见的功能。它可以根据业务需求灵活地调整表单结构,以满足不同的数据收集和展示需求。在本文中,我们将探讨一种基于 Vue、Element UI 和 S

基于Bootstrap Blazor开源的.NET通用后台权限管理系统

前言 今天大姚给大家分享一个基于Bootstrap Blazor开源的.NET通用后台权限管理系统,后台管理页面兼容所有主流浏览器,完全响应式布局(支持电脑、平板、手机等所有主流设备),可切换至 Blazor 多 Tabs 模式,权限控制细化到网页内任意元素(按钮、表格、文本框等等):Bootstr

基于Chrome扩展的浏览器可信事件与网页离线PDF导出

基于Chrome扩展的浏览器可信事件与网页离线PDF导出 Chrome扩展是一种可以在浏览器中添加新功能和修改浏览器行为的软件程序,我们可以基于Manifest规范的API实现对于浏览器和Web页面在一定程度上的修改,例如广告拦截、代理控制等。Chrome DevTools Protocol则是Ch

基于cifar数据集合成含开集、闭集噪声的数据集

前言 噪声标签学习下的一个任务是:训练集上存在开集噪声和闭集噪声;然后在测试集上对闭集样本进行分类。 训练集中被加入的开集样本,会被均匀得打上闭集样本的标签充当开集噪声;而闭集噪声的设置与一般的噪声标签学习一致,分为对称噪声:随机将闭集样本的标签替换为其他类别;和非对称噪声:将闭集样本的标签替换为特

基于 JuiceFS 构建高校 AI 存储方案:高并发、系统稳定、运维简单

中山大学的 iSEE 实验室(Intelligence Science and System) Lab)在进行深度学习任务时,需要处理大量小文件读取。在高并发读写场景下,原先使用的 NFS 性能较低,常在高峰期导致数据节点卡死。此外,NFS 系统的单点故障问题也导致一旦数据节点宕机,该机器上的数据将