Прежде чем мы начнем, давайте кратко разберемся с основными понятиями. Я могу грубо свести их к следующим пунктам: Что такое Web3.0 и какое отношение он имеет к блокчейну?(Не пригодится ли статья из прошлого раза?)
Требования: Разработать систему загрузки изображений Web 3.0 на базе Python. Эта система позволит пользователям загружать изображения и хранить их в децентрализованной сети, записывая при этом информацию о транзакциях в блокчейн. Первоначально это было написано ради развлечения, но я подумал о том, чтобы записать его в операцию файла аутентификации пользователя, которая интегрирует полный набор управления, чтобы «в конечном итоге стать окончательным решением для служб загрузки изображений». На практике я обнаружил, что это не очень практично, поэтому отказался. Однако я всегда был одержим фотографиями.
Установите необходимые библиотеки Python:
pip install flask web3 ipfshttpclient
IPFS(InterPlanetary File System)Это одноранговый протокол хранения файлов.。мы можемиспользоватьipfshttpclient
Ку Лай и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']
использоватьweb3.py
Библиотека ВоляIPFS CID записывается в блокчейн. Мы будем использовать Ethereum в качестве примера блокчейна.
Вот простой пример смарт-контракта для хранения CID IPFS:
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
# Подключиться к узлу Ethereum
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()
Используйте Flask для создания веб-интерфейса для загрузки изображений.
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. Доступ к локальному шлюзу: ipfs://QmVJGX3FJPZsAgGMtJZoTt14XBj8QKhPwaaP4UfCcvYaN2 、ipfs://QmRF9mejyfq89vAJ5yfsBbmVY3RUcLqfSsVTAmAbS8U2xD Внешний сетевой шлюз:https://ipfs.crossbell.io/ipfs/QmVJGX3FJPZsAgGMtJZoTt14XBj8QKhPwaaP4UfCcvYaN2 、https://ipfs.crossbell.io/ipfs/QmRF9mejyfq89vAJ5yfsBbmVY3RUcLqfSsVTAmAbS8U2xD
Для написания смарт-контракта мы будем использовать Solidity.,использоватьsolc
Компилятор компилирует контракт,ииспользоватьweb3.py
Библиотекаразвертывать Контракты в сети Ethereum。
первый,Создайте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];
}
}
хотетькомпилироватьSolidityсмарт-контракт,мы можемиспользоватьsolc
компилятор。Вы можете установить его с помощью следующей командыSolidityкомпилятор:
npm install -g solc
Затем скомпилируйте смарт-контракт с помощью следующей команды:
solc --abi --bin IPFSStorage.sol -o build/
этот Волясгенерировать двадокумент:IPFSStorage.abi
(договорнойABI)иIPFSStorage.bin
(договорнойбайт-код)。
использоватьweb3.py
Библиотекаразвертыватьдоговор。Убедитесь, что у вас работает узел Ethereum.(нравитьсяиспользоватьGanacheместныйразвиватьсреда)。
первый,Установитьweb3.py
:
pip install web3
Затем напишите и запустите следующий скрипт Python для развертывания контракта:
from web3 import Web3
# Подключиться к узлу Ethereum(использовать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 и байт-код, сгенерированный смарт-контрактом для взаимодействия с контрактом.,развертыватьдоговорзатем включает в себя создание транзакции、Подписать транзакциюи Воля Транзакция отправлена в сеть Ethereum。развертыватьпосле успеха,Адрес контракта можно получить через квитанцию о транзакции.,И используйте этот адрес для взаимодействия с контрактом.