国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

python 之 web3 與智能合約的交互、編譯等使用

這篇具有很好參考價(jià)值的文章主要介紹了python 之 web3 與智能合約的交互、編譯等使用。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一、背景

web3.py是一個(gè)用于與以太坊交互的 Python 庫(kù)。
它常見(jiàn)于去中心化應(yīng)用程序 (dapps)中,幫助發(fā)送交易、與智能合約交互、讀取塊數(shù)據(jù)以及各種其他用例。
最初的 API 源自Web3.js Javascript API,但后來(lái)不斷發(fā)展以滿足 Python 開(kāi)發(fā)人員的需求和物質(zhì)享受。

本人在合約審計(jì)于模糊測(cè)試中需要驗(yàn)證一些基礎(chǔ)信息,學(xué)習(xí)了一下

pip install web3

web3開(kāi)發(fā)文檔 https://web3py.readthedocs.io/en/stable/

二、基礎(chǔ)應(yīng)用
  • 連接到以太坊測(cè)試節(jié)點(diǎn)
    from web3 import Web3
    from web3 import EthereumTesterProvider # 以太網(wǎng)測(cè)試程序提供程序
    
    創(chuàng)建區(qū)塊鏈鏈接器 鏈接到測(cè)試節(jié)點(diǎn)
    w3 = Web3(EthereumTesterProvider())
    建立web3鏈接
    w3.is_connected()
    
  • 使用HTTPProvider和web3連接eth節(jié)點(diǎn)
    provider_url = 'https://mainnet.infura.io/v3/3c3793ddeca**********299afb1c2dc6458'
    w3 = Web3(Web3.HTTPProvider(provider_url))
    w3.is_connected()
    
  • 獲取最新的塊信息
    latest_block = w3.eth.get_block('latest')
    
  • 驗(yàn)證智能合約地址是否有效
    is_addr = w3.is_address('0x314ECf414b0987EAf8A3504915******91d24')
    
  • 獲取錢(qián)包余額有多少eth
    wallet = w3.to_checksum_address('0x314ECf414b0987EAf8A3504915d*****1d24')
    print(w3.eth.get_balance(wallet))
    
  • 將wei轉(zhuǎn)化成eth (wei 是eth最小單位)
    wei = w3.from_wei(111111111111111111111, 'ether')
    print(wei)
    
三、區(qū)塊鏈合約交互
  • ABI 包含輸入函數(shù)名稱(chēng)變量
    ABI 對(duì)于每個(gè)智能合約都是唯一的,除非代碼完全一樣 abi = '[]'
    
    abi = '[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]'
    contract_address = '0xda141e275f46F9Df74b29AA3eCf7fF77Bc6781AB'
    
  • 調(diào)用合同函數(shù)或訪問(wèn)合同變量文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-510512.html

    例如: contract_instance.functions.someFunction().call()
    
    contract_instance = w3.eth.contract(address=contract_address, abi=abi)
    result = contract_instance.functions.totalSupply().call()
    result = contract_instance.functions.symbol().call()
    print(result)
    
四、智能合約的編譯
from solcx import compile_source, compile_standard

# 指定安裝某個(gè)版本編譯器
# install_solc(version='latest')

# 編譯合約代碼 輸出abi、bin 字節(jié)碼
compile_solidity = compile_source(
    '''
    // SPDX-License-Identifier: GPL-3.0
    pragma solidity ^0.8.18;
    contract HelloWorld {
        string public message;
        constructor(){
            message = 'HelloWorld!';
        }
        function setMessage(string memory _message) public{
            message = _message;
        }
        function sayMessage() public view returns (string memory) {
            return message;
        }
    }
    ''',
    output_values=['abi', 'bin']
)

# 檢索合約接口 compile_solidity.popitem()
contract_id, contract_interface = compile_solidity.popitem()
# print(contract_id)                # 合約name
# print(contract_interface)         # 合約abi、bin
# print(contract_interface['abi'])  # 合約abi
python 與eth智能合約進(jìn)行交互
# 創(chuàng)建連接到以太坊測(cè)試器的Web3實(shí)例
w3 = Web3(Web3.EthereumTesterProvider())
# w3 = Web3(Web3.WebsocketProvider)

# 設(shè)置默認(rèn)賬戶為測(cè)試器中的第一個(gè)賬戶
# w3.eth.accounts 是以太坊測(cè)試器中已創(chuàng)建的賬戶列表。通過(guò) w3.eth.default_account = w3.eth.accounts[0],將默認(rèn)賬戶設(shè)置為測(cè)試器中的第一個(gè)賬戶。
# 這意味著當(dāng)您發(fā)送交易或調(diào)用合約函數(shù)時(shí),如果沒(méi)有顯式指定賬戶,將默認(rèn)使用 w3.eth.accounts[0] 作為交易的發(fā)送者

w3.eth.default_account = w3.eth.accounts[0]

# 合約的ABI和字節(jié)碼
abi = contract_interface['abi']
bytecode = contract_interface['bin']

# 創(chuàng)建合約實(shí)例
helloworld = w3.eth.contract(abi=abi, bytecode=bytecode)

# 發(fā)送合約構(gòu)造函數(shù)的交易
transaction_hash = helloworld.constructor().transact()
# print(transaction_hash)

# 等待交易收據(jù)
transaction_receipt = w3.eth.wait_for_transaction_receipt(transaction_hash=transaction_hash)
# print(transaction_receipt)
'''
blockHash: 交易所在區(qū)塊的哈希值。
blockNumber: 交易所在區(qū)塊的編號(hào)。
contractAddress: 如果交易創(chuàng)建了一個(gè)新的合約,該參數(shù)表示新合約的地址。如果交易不是創(chuàng)建合約的交易,則為一個(gè)空字符串。
cumulativeGasUsed: 該交易之前所有交易的累計(jì)消耗的燃?xì)饬俊?effectiveGasPrice: 交易的有效燃?xì)鈨r(jià)格。
from: 發(fā)送者(發(fā)送交易的賬戶地址)。
gasUsed: 該交易消耗的燃?xì)饬俊?logs: 交易產(chǎn)生的日志事件。
state_root: 交易執(zhí)行后的狀態(tài)樹(shù)根哈希。
status: 交易的執(zhí)行狀態(tài),1表示成功,0表示失敗。
to: 交易的接收者地址。如果是創(chuàng)建合約的交易,則為一個(gè)空字符串。
transactionHash: 交易的哈希值。
transactionIndex: 交易在所在區(qū)塊的索引位置
# type: 交易類(lèi)型1表示普通交易,2表示合約創(chuàng)建交易
'''
# # 獲取合約對(duì)象
# helloworldContract = w3.eth.contract(address=transaction_receipt.contractAddress, abi=abi)
# print(helloworldContract) # 獲取合約對(duì)象
# # 調(diào)用合約中函數(shù)sayMessage
# print(helloworldContract.functions.sayMessage().call())
# # 調(diào)用合約中函數(shù)setMessage,修改一個(gè)值,下面獲取并沒(méi)有變化,需要我們重新部署,發(fā)起交易
# print(helloworldContract.functions.setMessage('BEY').call())
# # 發(fā)現(xiàn)并沒(méi)有變化
# print(helloworldContract.functions.sayMessage().call())
# # 重新調(diào)用合約構(gòu)造函數(shù)的交易
# bye_hash = helloworldContract.functions.setMessage('BEY').transact()
# print(bye_hash)
# # 等待交易收據(jù)
# bye_receipt = w3.eth.wait_for_transaction_receipt(transaction_hash=bye_hash)
# print(bye_receipt)
# # 重新構(gòu)造以后才會(huì)修改為bye
# print(helloworldContract.functions.sayMessage().call())
# # print(is_addr)
python 編譯智能合約
compiled_solidity = compile_standard({
    "language": "Solidity",
    "sources": {
        "SimpleNumber.sol": {
            # "content": contract_file
        }
    },
    "setting": {
        "outputSelection": {
            "*": {"*": ["abi", "metadata", "evm.bytecode", "evm.sourceMap"]}
        }
    }
},
    solc_version='0.8.12'
)

print(compiled_solidity)

# compiled_solidity: 編譯后的Solidity結(jié)合的結(jié)果
# language: Solidity合約的編程語(yǔ)言,這里是"Solidity"
# sources: Solidity源代碼文件的字典,這里只有一個(gè)源代碼文件"SimpleNumber.sol"
# setting: 編輯設(shè)置的字典,包選擇輸出
# outputSelection: 輸入選的字典,選包包括ABI、元數(shù)據(jù)、EVM字節(jié)碼和EVM源映像
# solc_version: Solidity編譯器的版本,這里是"0.8.12"
使用python 部署智能合約
provider_url = 'https://goerli.infura.io/v3/3c3793ddeca5********fb1c2dc6458'
w3 = Web3(Web3.HTTPProvider(provider_url))
w3.is_connected()

abi = compiled_solidity['contracts']['SimpleNumber.sol']['SimpleNumber']['abi']
bytecode = compiled_solidity['contracts']['SimpleNumber.sol']['SimpleNumber']['evm']['bytecode']['object']

SimpleNumber = w3.eth.contract(abi=abi, bytecode=bytecode)
transaction = SimpleNumber.constructor().build_transaction(
    {
        "gasPrice": w3.eth.gas_price,
        "chainId": 3,
        "from": "wallet 錢(qián)包地址 來(lái)自metamask賬戶",
        "nonce": w3.eth.get_block_transaction_count("wallet 錢(qián)包地址 來(lái)自metamask賬戶")

    }
)
metamask 添加網(wǎng)絡(luò) eth 測(cè)試網(wǎng)絡(luò)
sign_transaction = w3.eth.account.sign_transaction(transaction, private_key='私鑰')
print(sign_transaction)
transaction_hash = w3.eth.send_raw_transaction(sign_transaction.rawTransaction)
print(transaction_hash)
transaction_receipt2 = w3.eth.wait_for_transaction_receipt(transaction_hash)
print(transaction_receipt2)
在python 中與部署的智能合約交互
contract_instance = w3.eth.contract(address=transaction_receipt2.contractAddress, abi=abi)

contract_instance.functions.getStoreNumber().call()
contract_instance.functions.updateStoreNumber(200).call()

update_number_transaction = contract_instance.functions.updateStoreNumber(200).call().build_transaction(
    {
        "gasPrice": w3.eth.gas_price,
        "chainId": 3,
        "from": "wallet 錢(qián)包地址 來(lái)自metamask賬戶",
        "nonce": w3.eth.get_block_transaction_count("wallet 錢(qián)包地址 來(lái)自metamask賬戶") + 1 # 每次加1 不能重復(fù)使用 nonce
    }
)

sign_transaction3 = w3.eth.account.sign_transaction(update_number_transaction, private_key='私鑰')
print(sign_transaction3)
transaction_hash3 = w3.eth.send_raw_transaction(sign_transaction3.rawTransaction)
print(transaction_hash3)
transaction_receipt3 = w3.eth.wait_for_transaction_receipt(transaction_hash3)
print(transaction_receipt3)
# 此時(shí)進(jìn)行變化
contract_instance.functions.getStoreNumber().call()

# print(latest_block)
# print(w3.is_connected())
# print(Web3)
# print(EthereumTesterProvider)

到了這里,關(guān)于python 之 web3 與智能合約的交互、編譯等使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 使用nodejs和web3js實(shí)現(xiàn)鏈接metamask錢(qián)包并實(shí)現(xiàn)合約交互

    在以太坊區(qū)塊鏈上,metamask錢(qián)包是一個(gè)非常常用的錢(qián)包,用以管理以太幣和其他以太坊資產(chǎn)。同時(shí),它也是一個(gè)重要的以太坊智能合約交互工具。在本文中,我們將介紹如何使用nodejs和web3js實(shí)現(xiàn)鏈接metamask錢(qián)包并實(shí)現(xiàn)合約交互。 在開(kāi)始之前,首先需要安裝NodeJS和Web3JS。 NodeJS是

    2024年02月04日
    瀏覽(32)
  • 區(qū)塊鏈合約交互 web3

    遵循ERC20規(guī)則, 錢(qián)包里可以有很多種類(lèi)型的token:USDT,DFI,DFA 1.合約交互之前需要先判斷是否仍允許purchasePool合約從賬戶(錢(qián)包里的賬戶) 中提取的ERC20dfaContract 這本合約里(DFA)的金額 await this.contract.ERC20dfaContract.methods.allowance(this.address,this.addressMap.AcceleratePool).call(); ERC20df

    2024年02月07日
    瀏覽(28)
  • 手把手部署區(qū)塊鏈智能合約及python的web3接口調(diào)用

    手把手部署區(qū)塊鏈智能合約及python的web3接口調(diào)用

    說(shuō)句實(shí)話,在做區(qū)塊鏈、智能合約、搭私鏈、pythonWeb3接口調(diào)用這些東西的時(shí)候,心里崩潰了不止四五十回,如果可以選別的方向,博主勸你趕緊換,人生已經(jīng)很不容易了,別給自己找罪受。。。。。 創(chuàng)世塊是什么請(qǐng)自行搜索,網(wǎng)絡(luò)上很多示例的創(chuàng)世塊博主都試過(guò),在實(shí)際使

    2024年02月04日
    瀏覽(27)
  • Java Web3J :使用web3j監(jiān)聽(tīng)、查詢、訂閱智能合約的事件

    前面有文章寫(xiě)如何使用Docker-compose方式部署blockscout瀏覽器+charts圖表,區(qū)塊鏈瀏覽器已經(jīng)部署成功了,同時(shí)我們?cè)阪溕显黾恿酥卫硗镀绷鞒?,如何?shí)時(shí)的把治理事件快速同步到瀏覽器呢?這時(shí)就想到了Web3J來(lái)監(jiān)聽(tīng)智能合約的事件,來(lái)達(dá)到同步事件的效果

    2024年02月09日
    瀏覽(33)
  • Java Web3J :使用web3j調(diào)用自己的智能合約的方法(教程)

    代碼世界有很多令人大呼小叫的技巧!有的代碼像魔術(shù)師一樣巧妙地隱藏了自己,有的像魔法師一樣讓你眼花繚亂,還有的像瑜伽大師一樣靈活自如。它們讓我們驚嘆不已,讓我們覺(jué)得自己仿佛置身于編碼的魔幻世界??靵?lái)分享你見(jiàn)過(guò)哪些令你膛目結(jié)舌的代碼技巧吧! web3j是

    2024年02月04日
    瀏覽(27)
  • web3:智能合約瀏覽器版本的 IDE - remix 使用教程

    如果你是一位web3行業(yè)的從業(yè)者,那么智能合約一定是要接觸的,這里我們就智能合約瀏覽器版本的 IDE-remix來(lái)介紹一下,及簡(jiǎn)單的使用操作 Remix 是一個(gè)開(kāi)源的 Solidity 智能合約開(kāi)發(fā)環(huán)境,是一款瀏覽器版本的 IDE,提供基本的編譯、部署至本地或測(cè)試網(wǎng)絡(luò)、執(zhí)行合約等功能。S

    2024年02月06日
    瀏覽(34)
  • web3: 智能合約

    2024年01月09日
    瀏覽(21)
  • java使用web3j,部署智能合約在測(cè)試鏈上,并調(diào)用(萬(wàn)字詳細(xì)教程)

    java使用web3j,部署智能合約在測(cè)試鏈上,并調(diào)用(萬(wàn)字詳細(xì)教程)

    最近在學(xué)區(qū)塊鏈相關(guān),想做點(diǎn)自己感興趣的。網(wǎng)上關(guān)于這塊部分的坑也比較多,最近也是問(wèn)了很多行業(yè)從事者才慢慢填坑,因此記錄下來(lái)分享一下。 錢(qián)包 :metemask、 solidity編譯器 :remix 、 java ide :idea。 智能合約編寫(xiě)的我選擇在remix上方便,而且部署的時(shí)候不需要自定義gasP

    2024年01月16日
    瀏覽(25)
  • Java Web3J :使用web3j調(diào)用自己的智能合約,返回一個(gè)內(nèi)部有數(shù)組的對(duì)象結(jié)構(gòu)時(shí)出現(xiàn)NPE問(wèn)題

    之前有寫(xiě)過(guò)一篇文章Java Web3J :使用web3j調(diào)用自己的智能合約的方法(教程),當(dāng)時(shí)只是簡(jiǎn)單的方法調(diào)用,也不涉及到什么復(fù)雜的數(shù)據(jù)類(lèi)型,入?yún)⑹莑ong類(lèi)型,出參是String類(lèi)型。 遇到這個(gè)問(wèn)題是因?yàn)橛幸粋€(gè)方法,需要通過(guò)提案的治理id,查詢鏈上提案數(shù)據(jù),這個(gè)就需要接收提案

    2024年01月19日
    瀏覽(24)
  • 【區(qū)塊鏈】走進(jìn)web3的世界-合約交互中的異常/邊界處理

    【區(qū)塊鏈】走進(jìn)web3的世界-合約交互中的異常/邊界處理

    在以太坊智能合約中,異常處理是一個(gè)非常重要的問(wèn)題,因?yàn)槿魏我粋€(gè)函數(shù)調(diào)用都有可能導(dǎo)致異常。常見(jiàn)的異常包括函數(shù)調(diào)用失敗、無(wú)效參數(shù)、內(nèi)部錯(cuò)誤等。 ????????在?Solidity?中,可以使用?require、assert?和?revert?等來(lái)處理異常。這些可以用于檢查輸入?yún)?/p>

    2024年02月09日
    瀏覽(27)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包