<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          用Web3.py、Infura和Graph查詢以太坊數(shù)據(jù)

          共 3994字,需瀏覽 8分鐘

           ·

          2022-04-28 00:37

          本文我們將使用Web3.py這個(gè)Python庫(kù)直接查詢以太坊數(shù)據(jù)。Web3.py是一個(gè)為與Ethereum區(qū)塊鏈交互而建立的Python庫(kù)。有了它,我們可以為去中心化的應(yīng)用程序建立各種核心功能。我們可以直接與智能合約互動(dòng),收集區(qū)塊鏈數(shù)據(jù),并發(fā)送交易。讓我們開(kāi)始安裝Web3.py。

          1. pip install web3

          Web3.py的功能是連接到以太坊網(wǎng)絡(luò)的節(jié)點(diǎn),以檢索數(shù)據(jù)和向網(wǎng)絡(luò)廣播數(shù)據(jù)。節(jié)點(diǎn)存儲(chǔ)區(qū)塊鏈數(shù)據(jù),所以我們可以查詢以太坊區(qū)塊鏈的狀態(tài)來(lái)收集我們需要的數(shù)據(jù)。數(shù)據(jù)檢索對(duì)我們來(lái)說(shuō)是一個(gè)有效的免費(fèi)操作,因?yàn)槲ㄒ坏某杀臼枪?jié)點(diǎn)正在進(jìn)行的存儲(chǔ)和計(jì)算。
          有了這個(gè)庫(kù),我們可以連接到自己的節(jié)點(diǎn)或網(wǎng)絡(luò)上的現(xiàn)有節(jié)點(diǎn)來(lái)建立我們想要的東西。我們可以在自己的機(jī)器上建立一個(gè)本地節(jié)點(diǎn),但這樣做的成本是相當(dāng)高的;截至4/21,一個(gè)完整的節(jié)點(diǎn)大約有7TB的數(shù)據(jù)。與其在我們想要訪問(wèn)數(shù)據(jù)時(shí)操作自己的節(jié)點(diǎn),不如通過(guò)使用像Infura這樣的服務(wù)來(lái)達(dá)到目的。
          Infura是Consensys的產(chǎn)品,我們將使用它作為我們的節(jié)點(diǎn),連接到以太坊區(qū)塊鏈。許多頂級(jí)項(xiàng)目都是Infura的用戶。首先在Infura網(wǎng)站注冊(cè)并創(chuàng)建一個(gè)新項(xiàng)目。在那里你會(huì)發(fā)現(xiàn)一個(gè)項(xiàng)目ID。

          該項(xiàng)目ID將被放在Web3.py的這段代碼中的末尾,它將定義你要連接到的節(jié)點(diǎn)。
          1. from web3 importWeb3


          2. w3 = Web3(Web3.HTTPProvider('https://mainnet.infura.io/v3/YOUR_PROJECT_ID'))

          現(xiàn)在已經(jīng)準(zhǔn)備好了與以太坊網(wǎng)絡(luò)的連接,可以做一些基本的查詢。
          1. # Get information about the latest block

          2. w3.eth.getBlock('latest')


          3. # Get the ETH balance of an address

          4. w3.eth.getBalance('YOUR_ADDRESS_HERE')

          這段代碼很簡(jiǎn)潔,我們可以試著深入挖掘一下。比如模仿Zapper( https://zapper.fi/dashboard)這樣的產(chǎn)品功能,跟蹤我們代幣的美元價(jià)值如何?首先,需要掃描我們的地址,看看持有哪些代幣。為了做到這一點(diǎn),我們將與各個(gè)代幣的智能合約進(jìn)行交互。這些合約的地址看起來(lái)像我們的錢(qián)包地址,只不過(guò)這些是合約地址。在這個(gè)地址上有智能合約代碼。代幣將遵守ERC-20標(biāo)準(zhǔn),使我們更容易與這些合約進(jìn)行交互。一個(gè)ERC-20合約默認(rèn)具有以下功能:
          1. function name() public view returns (string)

          2. function symbol() public view returns (string)

          3. function decimals() public view returns (uint8)

          4. function totalSupply() public view returns (uint256)

          5. function balanceOf(address _owner) public view returns (uint256 balance)

          6. function transfer(address _to, uint256 _value) public returns (bool success)

          7. function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)

          8. function approve(address _spender, uint256 _value) public returns (bool success)

          9. function allowance(address _owner, address _spender) public view returns (uint256 remaining)

          balanceOf是讓我們看到我們查詢的錢(qián)包地址持有多少代幣的函數(shù)。
          1. import json


          2. ABI = json.loads('[{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf",

          3. "outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]')

          我們從定義一個(gè)ABI開(kāi)始。ABI( application binary interface)是我們定義的一種格式,用于與合約交互。它是我們用來(lái)定義數(shù)據(jù)在EVM中應(yīng)該如何編碼/解碼的。拋開(kāi)技術(shù)細(xì)節(jié),重要的是要理解它是我們定義的格式,我們將如何與我們想要的智能合約進(jìn)行交互。
          1. wallet_address = 'YOUR_ADDRESS_HERE'

          2. wallet_address = Web3.toChecksumAddress(wallet_address)


          3. token_contract_address = '0xc011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f'

          4. token_contract_address = Web3.toChecksumAddress(token_contract_address)


          5. # define contract

          6. contract = w3.eth.contract(token_contract_address, abi=ABI)


          7. # call contract and get data from balanceOf for argument wallet_address

          8. raw_balance = contract.functions.balanceOf(wallet_address).call()


          9. # convert the value from Wei to Ether

          10. synthetix_value = Web3.fromWei(raw_balance, 'ether')

          接下來(lái)我們采取一系列步驟,輸入地址并返回我們選擇的錢(qián)包地址所持有的代幣數(shù)量。我們的樣本地址是Synthetix(SNX),你可以輸入任何你喜歡的合約地址。你可以想象一下,你可以建立一個(gè)ERC-20合約地址的主列表,并通過(guò)迭代來(lái)找到特定錢(qián)包所持有的代幣。
          我們使用Web3函數(shù) toChecksumAddress()來(lái)確保我們的地址是校驗(yàn)格式的。我們使用 fromWei()將我們的Wei價(jià)格轉(zhuǎn)換為 ether。1ETH是1E18 Wei。
          最后,我們將使用The Graph來(lái)獲取一些行情數(shù)據(jù)。由于我們希望所有的東西都在鏈上,所以我們需要得到我們想要的代幣在DAI中的價(jià)值,這是一個(gè)與美元相對(duì)掛鉤的穩(wěn)定幣。
          1. from gql import gql, Client

          2. from gql.transport.requests importRequestsHTTPTransport

          3. sample_transport=RequestsHTTPTransport(

          4. url='https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v2',

          5. verify=True,

          6. retries=5,

          7. )

          8. client = Client(

          9. transport=sample_transport

          10. )


          11. # Get the value of SNX/ETH

          12. query = gql('''

          13. query {

          14. pair(id: "0x43ae24960e5534731fc831386c07755a2dc33d47"){

          15. reserve0

          16. reserve1

          17. }

          18. }

          19. ''')

          20. response = client.execute(query)

          21. snx_eth_pair = response['pair']

          22. eth_value = float(snx_eth_pair['reserve1']) / float(snx_eth_pair['reserve0'])


          23. # Get the value of ETH/DAI

          24. query = gql('''

          25. query {

          26. pair(id: "0xa478c2975ab1ea89e8196811f51a7b7ade33eb11"){

          27. reserve0

          28. reserve1

          29. }

          30. }

          31. ''')

          32. response = client.execute(query)

          33. eth_dai_pair = response['pair']

          34. dai_value = float(eth_dai_pair['reserve0']) / float(eth_dai_pair['reserve1'])


          35. snx_dai_value = eth_value * dai_value

          我們對(duì)The Graph進(jìn)行查詢,以獲得SNX的DAI價(jià)值。我們首先得到每一個(gè)SNX的ETH價(jià)值,然后乘以與一個(gè)ETH等值的DAI數(shù)量,得到一個(gè)SNX的DAI價(jià)值。然后,我們可以將最終的DAI值乘以我們錢(qián)包持有的SNX數(shù)量,找到頭寸的總美元價(jià)值。我們不得不做所有這些額外的步驟,因?yàn)樵赨niswap中沒(méi)有一個(gè)活躍的池子來(lái)直接用DAI交換SNX。所以我們從SNX到ETH到DAI。下一步會(huì)講解我們?nèi)绾尾樵儗?shí)時(shí)區(qū)塊鏈數(shù)據(jù),以了解鏈上活動(dòng)的最新情況。

          - 點(diǎn)擊下方閱讀原文加入社區(qū)會(huì)員 -

          瀏覽 126
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  青青草A∨在线视频免费 | 日韩三级片网站在线观看 | 久久五月情 | 日本熟妇50乱偷交尾 | 婷婷日逼网|