开始前,我们先简单了解一下基本的概念,我大致归纳为以下几个点

什么是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的区块链图片上传的更多相关文章

  1. VUE2.0+VUE-Router做一个图片上传预览的组件

    之前发了一篇关于自己看待前端组件化的文章,但是由于学习和实践的业务逻辑差异,所以自己练习的一些demo逻辑比较简单,打算用vue重构现在公司做的项目,所以在一些小的功能页面上使用vue来做的,现在写的 ...

  2. tp5.0整合七牛云图片上传

    转:https://www.cnblogs.com/adobe-lin/p/7699638.html 这里以上传图片为例 上传其他文件也是大同小异 使用composer安装gmars/tp5-qini ...

  3. 2.0 vue2+tinymce实现图片上传与回显

    1.效果 2.配置 2.1 在init中添加图片上传函数 // 图片上传 images_upload_handler: (blobInfo, success, failure) => { // ...

  4. 基于Http原理实现Android的图片上传和表单提交

    版权声明:本文由张坤  原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/794875001483009140 来源:腾云阁  ...

  5. 基于jQuery仿uploadify的HTML5图片上传控件jquery.html5uploader

    (function($){ var methods = { init:function(options){ return this.each(function(){ var $this = $(thi ...

  6. 百度开源富文本编辑器 UEditor配置:图片上传和文件上传独立使用方法

    使用UEditor编辑器自带的插件实现图片上传和文件上传功能,这里通过配置UEditor单独使用其内置的第三方插件swfupload来实现图片和文件的上传,通过对UEditor配置轻松实现图片批量上传 ...

  7. 单独调用Ueditor的图片上传功能

    <!DOCTYPE html> <html> <head> <title></title> <script src="/sc ...

  8. 图片上传前 压缩,base64图片压缩 Exif.js处理ios拍照倒置等问题

    曾写过在前端把图片按比例压缩不失真上传服务器的前端和后台,可惜没有及时做总结保留代码,只记得js利用了base64位压缩和Exif.js进行图片处理,还有其中让我头疼的ios拍照上传后会倒置等诸多问题 ...

  9. Thinkphp框架图片上传实例

     https://www.cnblogs.com/wupeiky/p/5802191.html    [原文转载自:https://www.cnblogs.com/guoyachao/p/628286 ...

  10. 基于html5的多图片上传,预览

    基于html5的多图片上传 本文是建立在张鑫旭大神的多文图片传的基础之上. 首先先放出来大神多图片上传的博客地址:http://www.zhangxinxu.com/wordpress/2011/09 ...

随机推荐

  1. LlamaIndex 安装与配置(不含OpenAI)

    pip install llama-index 这是一个包含以下组件的启动包: llama-index-core llama-index-legacy (暂时包含) llama-index-llms- ...

  2. [Python急救站]人脸识别技术练习

    这段时间做了一个用于初学者学习人脸识别系统的程序,在上代码时,先给说说事前准备: 首先我们需要一个OpenCV的一个haarcascade_frontalface_default.xml文件,只要去G ...

  3. Unity热更学习笔记--AB包的依赖 0.98

    AB包的依赖 接上一小结. 在这里我们新建一个红色材质球,赋值给Cube预制体.此时不对材质球进行AB包分类,再次进行打包.运行脚本,发现红色cube成功的从AB包中加载出来.尽管我们没有将cube所 ...

  4. 一键自动化博客发布工具,用过的人都说好(oschina篇)

    oschina和segmentfault一样,界面非常的清爽. 界面上除了必须的标题,内容之外,还有文章专辑和推广专区这几个选项. 一起来看看在blog-auto-publishing-tools中, ...

  5. 欧几里得算法求最大公因数gcd原理证明

    要证明欧几里得算法原理,首先需要证明下面两个定理(其中a,b都是整数): 1 如果c可以整除a,同时c也可以整除b,那么c就可以整除au + bv(u,v是任意的整数). 这个定理的证明很简单,$\f ...

  6. WEB服务与NGINX(23)- nginx的四层负载均衡功能

    目录 1. nginx实现四层的负载均衡 1.1 nginx四层负载配置参数 1.2 负载均衡示例-mariadb 1. nginx实现四层的负载均衡 nginx从1.9.0版本开始支持TCP模式的负 ...

  7. nodejs搭建chatgpt服务

    5分钟快速搭建基于nodejs的chatgpt服务 写在前面 首先大家都知道,在国内是无法成功调用openapi的接口,甚至openai的官网都很难打开.所以如果想使用chatgpt的几乎是不可能,不 ...

  8. python教程6.3-time模块datetime模块

     由于time是基于Unix Timestamp,所以其所能表述的日期范围被限定在 1970 – 2038 之间.因此2038年后就不能用time了,建议使用datetime. time模块 有下面几 ...

  9. vue3中404路由匹配规则

    { path: '/:pathMatch(.)', component: () => import('@/views/error/404.vue') },

  10. 远程控制软件 Teamviewer、Splashtop、向日葵哪个好用

    ​ 编辑切换为居中 添加图片注释,不超过 140 字(可选) 好用的远程控制软件,我一般只推荐这三个经典品牌: Teamviewer.Splashtop.向日葵. Teamviewer 来自德国,妥妥 ...