首页 > 其他分享 >基于Web3.0的区块链图片上传

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

时间:2024-06-17 17:53:55浏览次数:15  
标签:txn IPFS Web3.0 上传 contract w3 file 区块 合约

开始前,我们先简单了解一下基本的概念,我大致归纳为以下几个点
什么是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和字节码用于与合约交互,部署合约则涉及到创建交易、签署交易并将交易发送到以太坊网络。部署成功后,可以通过交易回执获取合约地址,并使用这个地址与合约进行交互。

标签:txn,IPFS,Web3.0,上传,contract,w3,file,区块,合约
From: https://www.cnblogs.com/Ajue/p/18252860

相关文章

  • 什么是Web3.0,和区块链又有什么关系?
    又是一个莫名其妙的词语的新起-。-我大致归纳为以下几个点什么是web3.0Web3.0(Web3)是下一代互联网的发展方向,旨在创建一个更加去中心化、用户控制和数据保护的网络环境。与之前的Web1.0(静态网页)和Web2.0(动态、交互式网页和社交媒体)不同,Web3.0的核心理念和技术包括以下几个方......
  • SSH配置、跨主机上传下载、Wrapper访问控制实验操作步骤
    目录终端OpenSSH服务器SSH(SecureShell)协议OpenSSH服务监听选项SSH配置修改端口号用户登录控制指定用户登录1.2.严格模式最大会话数量公钥验证使用公钥认证让客户端登录系统域名解析跨主机下载、上传文件下载指定端口下载上传指定端口上传 ​编辑sftp功......
  • React中AntDesign upload组件 自定义请求将多个上传请求合并成一个并
    接口文档核心代码constImportPictureUpload=()=>{const[fileList,setFileList]=useState([])constonBeforeUpload=(file:any,fileList:any)=>{setFileList(fileList)returnfalse;}useEffect(()=>{if(......
  • Net上传Nuget包以及把多个.nupkg文件打包成一个文件
    1、打包Nuget包第一种方式:●使用NuGetCLI工具将整个项目打包为NuGet包●打开命令行终端●导航到包含项目文件的项目目录例如:cdC:\MyProject●使用以下命令将项目打包为NuGet包:例如:nugetpack[项目文件路径]请将[项目文件路径]替换为实际的项目文件路径。例如,如果你的项......
  • Net上传Nuget包以及把多个
    Net上传Nuget包以及把多个.nupkg文件打包成一个文件1、打包Nuget包第一种方式:使用NuGetCLI工具将整个项目打包为NuGet包打开命令行终端导航到包含项目文件的项目目录例如:cdC:\MyProject使用以下命令将项目打包为NuGet包:例如:nugetpack[项目文件路径] 请将[项目文件路......
  • 智能合约与身份验证:区块链技术的创新应用
    一、引言区块链,一个近年来备受瞩目的技术名词,已经从最初的数字货币领域扩展到了众多行业。那么,究竟什么是区块链?它为何如此重要?本文将深入剖析区块链技术的原理、应用及未来发展。二、区块链的基本概念区块链,从本质上讲,是一个去中心化的分布式数据库。它由一系列按照时间顺......
  • springboot + uniapp 头像上传功能及样式模版
    springboot+uniapp头像上传和预览功能及样式模版该头像上传使用uni.chooseImage方法从本地相册选择图片或使用相机拍照。再通过uni.uploadFile将本地资源上传到服务器。具体使用方法请参考uniapp官网API。以下是前端效果图:上传之后效果点击头像预览效果......
  • 2024年区块链与AI投融资动态:各领域全面崛起
    京东Java实习生招聘,有转正机会!腾讯CSIG技术产品商务(已oc)面经初入职场雷点tips-1有大佬帮忙看看简历吗,25暑期实习一直过不了简历快手测开二面面经拒了荣耀offer,感觉自己很丑陋快手测开二面面经快手秋招测开面经快手测开技术一面面经快手测开技术一面面经快手......
  • 批量异步上传aws图片脚本(python)
    背景工作中需要上传一些测试图片,于是网上找找资料(官方说明),前置步骤如下。python需要3.8以上,安装最新的boto3库:pipinstallboto3有一个S3权限的aws账户,得到访问密钥ACCESS_KEY与SECRET_KEY,以及上传图片的存储桶位置安装异步编程asyncio,aiohttp库,方便本地异步上传图片代码......
  • 【上传云】第一步:本地读取文件夹下的文件内容到数据库中
    背景:本地有一些文件,需要上传到云端这里先介绍第一步:将本地文件夹下的所有文件路径跟文件名都读取到数据库中,为下一步的上传做铺垫所需:并不需要上传所有格式的文件,故在此步骤里做过滤操作FileFilterzipFilter=pathname->!pathname.getName().endsWith("zxx");传文......