Python與Web3.py庫:構建去中心化應用的未來

Python與Web3.py庫:構建去中心化應用的未來

在區塊鏈的世界里,“去中心化”是最核心的理念之一,它賦予了用戶更多的控制權和自由,消除了傳統中心化系統中的單點故障和信任問題。而在這場技術革命中,Web3.0無疑是最受矚目的趨勢之一。Web3.0的關鍵目標是使互聯網變得更加去中心化、更加智能,并且更加尊重用戶隱私和數據安全。

如果你是開發者或者對區塊鏈感興趣的技術愛好者,你一定會對如何利用代碼來構建去中心化應用(DApp)充滿興趣。今天,我將帶你一起探索如何通過Python和Web3.py庫來構建一個簡單的去中心化應用——它將讓你一窺區塊鏈開發的魅力,理解去中心化應用(DApp)的基本構成和工作原理。

什么是Web3.py?

Web3.py是一個Python庫,它讓我們能夠與以太坊區塊鏈進行交互。通過Web3.py,我們可以與智能合約互動,發送交易,查詢鏈上數據,甚至參與去中心化金融(DeFi)應用的開發。它為Python開發者提供了一個強大的工具,使得構建和與以太坊網絡進行交互變得更加簡單。

Web3.py的主要功能包括:

  • 發送交易
  • 部署和與智能合約交互
  • 讀取和寫入區塊鏈數據
  • 管理賬戶、密鑰等

今天,我們將通過一個簡單的示例來學習如何使用Web3.py構建一個去中心化應用(DApp)。

Web3.0應用的構建流程

構建去中心化應用(DApp)通常涉及以下幾個步驟:

  1. 與以太坊區塊鏈建立連接:通過Web3.py連接到以太坊網絡(可以是本地的Ganache鏈、測試網絡或主網)。
  2. 部署智能合約:在區塊鏈上部署智能合約,智能合約是DApp的核心,它定義了應用的邏輯。
  3. 與智能合約交互:通過Web3.py與智能合約進行交互,執行合約中的函數。
  4. 前端展示與用戶交互:通常,DApp會有一個前端界面,通過Web3.js(前端JavaScript庫)或其他前端技術,用戶可以在瀏覽器中進行交互。

讓我們從第一個步驟開始,看看如何使用Web3.py連接到以太坊區塊鏈。

安裝Web3.py

首先,我們需要安裝Web3.py庫。如果你還沒有安裝,可以通過以下命令來安裝:

pip install web3

安裝完成后,我們就可以開始編寫Python代碼了。

連接到以太坊區塊鏈

要與以太坊網絡進行交互,我們首先需要連接到一個以太坊節點。這里有兩種常見的方式:

  1. 本地節點:你可以使用Ganache等工具在本地運行一個以太坊節點。
  2. 遠程節點:你可以連接到像Infura、Alchemy等提供遠程節點服務的服務商。

這里,我們使用Infura提供的節點作為例子。首先,你需要在Infura官網上注冊并創建一個項目,獲取到一個API密鑰。

以下是連接到Infura節點的代碼示例:

from web3 import Web3# 連接到Infura的Rinkeby測試網絡
infura_url = "https://rinkeby.infura.io/v3/YOUR_INFURA_PROJECT_ID"
web3 = Web3(Web3.HTTPProvider(infura_url))# 檢查是否成功連接
if web3.isConnected():print("成功連接到以太坊網絡!")
else:print("連接失敗!")

在代碼中,將YOUR_INFURA_PROJECT_ID替換為你在Infura上獲得的項目ID。運行此代碼,如果成功連接,你將看到“成功連接到以太坊網絡!”的消息。

部署一個簡單的智能合約

有了Web3.py的連接,我們就可以部署智能合約了。這里,我們創建一個非常簡單的智能合約,它包含一個可以存儲和檢索數字的功能。

智能合約代碼(Solidity)

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;contract SimpleStorage {uint256 public storedData;// 設置數據function set(uint256 x) public {storedData = x;}// 獲取數據function get() public view returns (uint256) {return storedData;}
}

將上述代碼保存為SimpleStorage.sol。這個合約定義了一個storedData變量,它可以被設置和讀取。

編譯智能合約

要部署智能合約,我們首先需要編譯它。你可以使用Solidity編譯器(solc)來完成這項任務,或者通過Remix等工具在線編譯。

我們將通過Python和Web3.py來進行合約部署。以下是將合約編譯并部署到以太坊測試網絡的代碼示例:

from web3 import Web3
from solcx import compile_source# 連接到Infura的Rinkeby測試網絡
infura_url = "https://rinkeby.infura.io/v3/YOUR_INFURA_PROJECT_ID"
web3 = Web3(Web3.HTTPProvider(infura_url))# 編譯Solidity智能合約
contract_source_code = '''
pragma solidity ^0.8.0;contract SimpleStorage {uint256 public storedData;function set(uint256 x) public {storedData = x;}function get() public view returns (uint256) {return storedData;}
}
'''
compiled_sol = compile_source(contract_source_code)
contract_id, contract_interface = compiled_sol.popitem()# 獲取合約的ABI和字節碼
abi = contract_interface['abi']
bytecode = contract_interface['bin']# 設置賬戶和私鑰(需要使用自己的賬戶和私鑰)
my_address = 'YOUR_WALLET_ADDRESS'
private_key = 'YOUR_PRIVATE_KEY'# 創建合約對象
SimpleStorage = web3.eth.contract(abi=abi, bytecode=bytecode)# 構造交易字典
nonce = web3.eth.getTransactionCount(my_address)
transaction = SimpleStorage.constructor().buildTransaction({'chainId': 4,  # Rinkeby網絡ID'gas': 2000000,'gasPrice': web3.toWei('20', 'gwei'),'from': my_address,'nonce': nonce,
})# 簽署交易
signed_txn = web3.eth.account.sign_transaction(transaction, private_key)# 發送交易
txn_hash = web3.eth.sendRawTransaction(signed_txn.rawTransaction)# 獲取交易哈希
print(f"部署交易哈希: {txn_hash.hex()}")

這段代碼通過Python將智能合約部署到Rinkeby測試網絡。請注意:

  • my_addressprivate_key中替換為你自己的以太坊錢包地址和私鑰。
  • 你可以在Rinkeby上申請免費的測試ETH來支付部署智能合約所需的Gas費用。

與智能合約交互

一旦智能合約成功部署,你就可以與它進行交互了。比如,我們可以通過以下代碼調用合約中的setget方法來設置和讀取數據。

設置數據

# 創建合約實例
contract_address = 'YOUR_CONTRACT_ADDRESS'
simple_storage = web3.eth.contract(address=contract_address, abi=abi)# 調用set方法設置數據
txn = simple_storage.functions.set(42).buildTransaction({'chainId': 4,'gas': 200000,'gasPrice': web3.toWei('20', 'gwei'),'from': my_address,'nonce': web3.eth.getTransactionCount(my_address),
})signed_txn = web3.eth.account.sign_transaction(txn, private_key)
txn_hash = web3.eth.sendRawTransaction(signed_txn.rawTransaction)print(f"交易哈希: {txn_hash.hex()}")

獲取數據

# 調用get方法獲取數據
stored_value = simple_storage.functions.get().call()
print(f"存儲的數據是: {stored_value}")

總結

通過Python和Web3.py,我們成功地與以太坊區塊鏈進行了交互,部署并與智能合約進行了簡單的交互。構建去中心化應用(DApp)并不需要復雜的前端代碼,Python為我們提供了強大的后端支持,使得開發者能夠輕松地與區塊鏈進行交互。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/72312.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/72312.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/72312.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

對“預訓練”的理解

預訓練有什么用 傳統的機器學習是偏數學的,對數據的量不做過多要求,而深度學習的項目通常是有大量的數據可供使用。 在平常的任務或者項目中,我們可能并沒有大量數據,只有少量數據,在這時我們就可以通過“借用”有大…

VMware Ubuntu 共享目錄

在VMware中掛載Ubuntu共享目錄需要以下步驟,分為設置共享文件夾和在Ubuntu中掛載兩部分: 一、VMware 設置共享文件夾 關閉Ubuntu虛擬機 在配置前,建議先關閉虛擬機(若已運行需關閉,部分VMware版本支持熱添加&#xff0…

AF3 crop_chains函數解讀

AlphaFold3 feature_processing_multimer模塊的crop_chains函數的功能是對多條鏈的蛋白質結構預測任務中的MSA(多序列比對)特征和模板特征進行裁剪(cropping)。裁剪的目的是為了控制輸入模型的MSA序列數量和模板數量,以適應模型的輸入限制或優化計算效率。 源代碼: def…

Java基礎-數組,集合創建方式

Java 中 new 關鍵字的作用 在 Java 中,new 關鍵字用于 在堆內存中分配空間 并創建對象。 數組 和 集合 在 Java 中都是對象,因此必須使用 new 來創建實例。Java 和 C 之間的主要區別在于 內存管理 和 對象的創建方式。 Java 與 C 中數組 & 集合的創…

LeeCode題庫第三十九題

39.組合總和 項目場景: 給你一個 無重復元素 的整數數組 candidates 和一個目標整數 target ,找出 candidates 中可以使數字和為目標數 target 的 所有 不同組合 ,并以列表形式返回。你可以按 任意順序 返回這些組合。 candidates 中的 同…

大模型應用案例 | 大模型+金融運維,擎創攜手某證券創新運維能力新范式

一、當大模型遇上金融運維:一場讓告警處理“脫胎換骨”的變革 2022年底,ChatGPT的橫空出世讓AI技術徹底出圈;短短兩年后,大模型已悄然潛入金融行業的“心臟地帶”——運維系統。面對指數級暴增的告警信息、碎片化的處理流程&#…

【MongoDB】在Windows11下安裝與使用

官網下載鏈接:Download MongoDB Community Server 官方參考文檔:https://www.mongodb.com/zh-cn/docs/manual/tutorial/install-mongodb-on-windows/#std-label-install-mdb-community-windows 選擇custom類型,其他默認 注意,此選…

阿里云輕量級服務器通過寶塔安裝PgVector要點

設置環境變量: export PG_HOME/www/server/pgsql export LD_LIBRARY_PATH$LD_LIBRARY_PATH:/www/server/pgsql/lib export PG_CONFIG/www/server/pgsql/bin/pg_config export PGDATA/www/server/pgsql/data PATH$PATH:$HOME/.local/bin:$HOME/bin:$PG_HOME/bin ali…

OpenSSL 基礎使用流程

理解 OpenSSL 的基礎使用流程是學習如何進行安全通信的關鍵,特別是在實現 SSL/TLS 連接時。以下是 OpenSSL 基礎使用流程的一個簡要總結,并附上一個簡單的示例代碼,幫助你理解如何通過 OpenSSL 建立一個基本的安全通信連接。 OpenSSL 基礎使…

什么是最終一致性,它對后端系統的意義是什么

最終一致性(Eventual Consistency)是分布式系統中的一種一致性模型。與傳統的強一致性模型不同,最終一致性并不要求系統在任何時刻都保持一致,而是保證在足夠的時間后,所有節點的數據最終會達到一致的狀態。換句話說,系統允許短時間內出現數據的不一致性,但最終會通過某…

SQL命令詳解之增刪改數據

目錄 簡介 1 添加數據 1.1 基礎語法 1.2 SQL 練習 2 修改數據 2.1 基礎語法 2.2 SQL 練習 ?3 刪除數據 3.1 基礎語法 3.2 SQL 練習 總結 簡介 在數據庫操作中,增、刪、改是最基礎的操作,它們通常對應著SQL中的INSERT、DELETE和UPDATE命令。…

std::allocator_traits 能做但 std::allocator 不能的事情

🌟 std::allocator_traits 能做但 std::allocator 不能的事情 1?? 適配自定義分配器 假設你要實現一個內存池 MyAllocator,而 STL 容器默認使用的是 std::allocator。 如果你希望 STL 容器可以使用你的 MyAllocator,你 不能直接用 std::a…

QT——c++界面編程庫

非界面編程 QT編譯的時候,依賴于 .pro 配置文件: SOURCES: 所有需要參與編譯的 .cpp 源文件 HEADERS:所有需要參與編譯的.h 頭文件 QT:所有需要參與編譯的 QT函數庫 .pro文件一旦修改,注意需要鍵盤按 ctrls 才能加載最新的配置文…

基于專利合作地址匹配的數據構建區域協同矩陣

文章目錄 地區地址提取完成的處理代碼 在專利合作申請表中,有多家公司合作申請。在專利權人地址中, 有多個公司的地址信息。故想利用這里多個地址。想用這里的地址來代表區域之間的專利合作情況代表區域之間的協同、協作情況。 下圖是專利合作表的一部分…

汽車小助手智能體

汽車小助手:智能驅動汽車服務新體驗 鏈接:文心智能體平臺AgentBuilder | 想象即現實 文心智能體平臺AgentBuilder,是百度推出的基于文心大模型的智能體平臺,支持廣大開發者根據自身行業領域、應用場景,選取不同類型的…

各種傳參形式

一、QueryString 前端請求:http://localhost:8080/test/user/find?id26&namezhangsan 后端接收: 1.參數接收: RequestMapping("/find") public void find(String id,String name){... }2.對象接收: RequestMa…

【vue-echarts】——03.配置項---tooltip

文章目錄 一、tooltip提示框組件二、顯示結果一、tooltip提示框組件 提示框組件,用于配置鼠標滑過或點擊圖表時的顯示框 代碼如下 Demo3View.vue <template><div class="about">

VSCode輕松調試運行.Net 8.0 Web API項目

1.背景 我一直都是用VS來開發.NetCore項目的&#xff0c;用的比較順手&#xff0c;也習慣了。看其他技術文章有介紹VS Code更輕量&#xff0c;更方便。所以我專門花時間來使用VS Code&#xff0c;看看它是如何調試代碼、如何運行.Net 8.0 WebAPI項目。這篇文章是一個記錄的過程…

P8720 [藍橋杯 2020 省 B2] 平面切分--set、pair

P8720 [藍橋杯 2020 省 B2] 平面切分--set、pair 題目 分析一、pair1.1pair與vector的區別1.2 兩者使用場景兩者組合使用 二、set2.1核心特點2.2set的基本操作2.3 set vs unordered_set示例&#xff1a;統計唯一單詞數代碼 題目 分析 大佬寫的很明白&#xff0c;看這兒 我講講…

游戲引擎學習第128天

開始 然而&#xff0c;我們仍然有一些工作要做&#xff0c;渲染部分并沒有完全完成。雖然現在已經能夠運行游戲&#xff0c;而且幀率已經可以接受&#xff0c;但仍然有一些東西需要進一步完善。正在使用調試構建編譯版本&#xff0c;雖然調試版本的性能不如優化版本&#xff0…