Загрузка изображений блокчейна на основе Web3.0
Загрузка изображений блокчейна на основе Web3.0

Прежде чем мы начнем, давайте кратко разберемся с основными понятиями. Я могу грубо свести их к следующим пунктам: Что такое Web3.0 и какое отношение он имеет к блокчейну?(Не пригодится ли статья из прошлого раза?)

Требования: Разработать систему загрузки изображений Web 3.0 на базе Python. Эта система позволит пользователям загружать изображения и хранить их в децентрализованной сети, записывая при этом информацию о транзакциях в блокчейн. Первоначально это было написано ради развлечения, но я подумал о том, чтобы записать его в операцию файла аутентификации пользователя, которая интегрирует полный набор управления, чтобы «в конечном итоге стать окончательным решением для служб загрузки изображений». На практике я обнаружил, что это не очень практично, поэтому отказался. Однако я всегда был одержим фотографиями.

Обзор шагов

  1. Настройки среды:использоватьPythonразвивать,Установите необходимые библиотеки Python.
  2. Интеграция IPFS:Воля Загрузка изображения в IPFS, получите CID изображения (Содержимое Identifier)。
  3. Интеграция блокчейна:ВоляIPFS CID записывается в блокчейне.
  4. Веб-интерфейс:использоватьFlaskСоздайте Веб-интерфейс,Разрешить пользователям загружать изображения.

Подробные шаги

1. Настройки среды

Установите необходимые библиотеки Python:

Язык кода:javascript
копировать
pip install flask web3 ipfshttpclient
2. Интеграция IPFS

IPFS(InterPlanetary File System)Это одноранговый протокол хранения файлов.。мы можемиспользоватьipfshttpclientКу Лай иIPFSсетевое взаимодействие。

первый,Убедитесь, что у вас установлен и работает узел IPFS. Если вы еще не установили IPFS,Можно найти вОфициальный сайт ИПФСНайдите руководство по установке。

Ниже приведен пример кода для загрузки изображений в IPFS:

Язык кода:javascript
копировать
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 в качестве примера блокчейна.

Вот простой пример смарт-контракта для хранения CID IPFS:

Язык кода:javascript
копировать
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 для взаимодействия со смарт-контрактом:

Язык кода:javascript
копировать
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()
4. Веб-интерфейс

Используйте Flask для создания веб-интерфейса для загрузки изображений.

Язык кода:javascript
копировать
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/QmVJGX3FJPZsAgGMtJZoTt14XBj8QKhPwaaP4UfCcvYaN2https://ipfs.crossbell.io/ipfs/QmRF9mejyfq89vAJ5yfsBbmVY3RUcLqfSsVTAmAbS8U2xD

смарт-контракт

Для написания смарт-контракта мы будем использовать Solidity.,использоватьsolcКомпилятор компилирует контракт,ииспользоватьweb3.pyБиблиотекаразвертывать Контракты в сети Ethereum。

1. Напишите код смарт-контракта.

первый,СоздайтеSolidityдокумент(нравитьсяIPFSStorage.sol),и напишите свой код смарт-контракта:

Язык кода:javascript
копировать
// 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компилятор:

Язык кода:javascript
копировать
npm install -g solc

Затем скомпилируйте смарт-контракт с помощью следующей команды:

Язык кода:javascript
копировать
solc --abi --bin IPFSStorage.sol -o build/

этот Волясгенерировать двадокумент:IPFSStorage.abi(договорнойABI)иIPFSStorage.bin(договорнойбайт-код)。

3. развертыватьсмарт-контракт

использоватьweb3.pyБиблиотекаразвертыватьдоговор。Убедитесь, что у вас работает узел Ethereum.(нравитьсяиспользоватьGanacheместныйразвиватьсреда)。

первый,Установитьweb3.py

Язык кода:javascript
копировать
pip install web3

Затем напишите и запустите следующий скрипт Python для развертывания контракта:

Язык кода:javascript
копировать
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。развертыватьпосле успеха,Адрес контракта можно получить через квитанцию ​​о транзакции.,И используйте этот адрес для взаимодействия с контрактом.

boy illustration
Углубленный анализ переполнения памяти CUDA: OutOfMemoryError: CUDA не хватает памяти. Попыталась выделить 3,21 Ги Б (GPU 0; всего 8,00 Ги Б).
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Прочитайте нейросетевую модель Трансформера в одной статье
boy illustration
.ART Теплые зимние предложения уже открыты
boy illustration
Сравнительная таблица описания кодов ошибок Amap
boy illustration
Уведомление о последних правилах Points Mall в декабре 2022 года.
boy illustration
Даже новички могут быстро приступить к работе с легким сервером приложений.
boy illustration
Взгляд на RSAC 2024|Защита конфиденциальности в эпоху больших моделей
boy illustration
Вы используете ИИ каждый день и до сих пор не знаете, как ИИ дает обратную связь? Одна статья для понимания реализации в коде Python общих функций потерь генеративных моделей + анализ принципов расчета.
boy illustration
Используйте (внутренний) почтовый ящик для образовательных учреждений, чтобы использовать Microsoft Family Bucket (1T дискового пространства на одном диске и версию Office 365 для образовательных учреждений)
boy illustration
Руководство по началу работы с оперативным проектом (7) Практическое сочетание оперативного письма — оперативного письма на основе интеллектуальной системы вопросов и ответов службы поддержки клиентов
boy illustration
[docker] Версия сервера «Чтение 3» — создайте свою собственную программу чтения веб-текста
boy illustration
Обзор Cloud-init и этапы создания в рамках PVE
boy illustration
Корпоративные пользователи используют пакет регистрационных ресурсов для регистрации ICP для веб-сайта и активации оплаты WeChat H5 (с кодом платежного узла версии API V3)
boy illustration
Подробное объяснение таких показателей производительности с высоким уровнем параллелизма, как QPS, TPS, RT и пропускная способность.
boy illustration
Удачи в конкурсе Python Essay Challenge, станьте первым, кто испытает новую функцию сообщества [Запускать блоки кода онлайн] и выиграйте множество изысканных подарков!
boy illustration
[Техническая посадка травы] Кровавая рвота и отделка позволяют вам необычным образом ощипывать гусиные перья! Не распространяйте информацию! ! !
boy illustration
[Официальное ограниченное по времени мероприятие] Сейчас ноябрь, напишите и получите приз
boy illustration
Прочтите это в одной статье: Учебник для няни по созданию сервера Huanshou Parlu на базе CVM-сервера.
boy illustration
Cloud Native | Что такое CRD (настраиваемые определения ресурсов) в K8s?
boy illustration
Как использовать Cloudflare CDN для настройки узла (CF самостоятельно выбирает IP) Гонконг, Китай/Азия узел/сводка и рекомендации внутреннего высокоскоростного IP-сегмента
boy illustration
Дополнительные правила вознаграждения амбассадоров акции в марте 2023 г.
boy illustration
Можно ли открыть частный сервер Phantom Beast Palu одним щелчком мыши? Супер простой урок для начинающих! (Прилагается метод обновления сервера)
boy illustration
[Играйте с Phantom Beast Palu] Обновите игровой сервер Phantom Beast Pallu одним щелчком мыши
boy illustration
Maotouhu делится: последний доступный внутри страны адрес склада исходного образа Docker 2024 года (обновлено 1 декабря)
boy illustration
Кодирование Base64 в MultipartFile
boy illustration
5 точек расширения SpringBoot, супер практично!
boy illustration
Глубокое понимание сопоставления индексов Elasticsearch.
boy illustration
15 рекомендуемых платформ разработки с нулевым кодом корпоративного уровня. Всегда найдется та, которая вам понравится.
boy illustration
Аннотация EasyExcel позволяет экспортировать с сохранением двух десятичных знаков.