zoukankan      html  css  js  c++  java
  • 爱链笔记-以太坊连接

    为了达到写的话语可以在互联网上源远流长,我选择把它写到区块链上。Eth又是其中的佼佼者,而且它发布于2014年,到今天已经有很多工具了。

    开始我以为全节点才可以记账,不过那个账本文件太大了,不合适,后来我想到我自己使用的metamask钱包,小小一个插件就把钱包的功能实现了,这给我了希望。于是我就又搜索了一下,发现了可以使用web3连接远程节点实现。

    首先,申请远程节点。在https://infura.io/上注册,然后就可以申请远程节点了。搞定了你就有和以太坊交互的接口了。

    接下来是使用web3来和它交互,但是网上一般是web3.js的教程,而我们使用的是web3.py,所以在这里还是说一说。

    首先用pip安装web3,结果报错了,说什么Importing web3 python module results in assert keccak('') in eth_utils/crypto.py,我看着很懵,上网看还真有和我一样的,解决方法是:

     pip uninstall sha3 or pip uninstall pysha3 or sudo ... //卸载sha3或pysha3,然后重新安装web3

     pip install web3

    就这样顺利的安装上了web3.py。

    然后就是使用web3来和以太坊交互啦,因为网上都是web3.js的,所以这里我就简单的说一下我用到的方法。

    Web3.py连接以太坊使用语句:w3 = Web3(Web3.HTTPProvider('https://mainnet.infura.io/xxxxxxx'))(http连接infura远程节点)

    接下来就是自己账户的地址了,这里我使用私钥来得到账户地址,使用的方法为Account.privateKeyToAccount,在使用前不要忘记from eth_account import Account,这样就可以从一个账户的私钥得到公钥也就是地址了。

    这里我要提一点,就是私钥的存储。开始的时候我不知道会把代码放到github的公有仓库,所以在代码里明晃晃的把私钥放里面,不出一天账户就被盗了,还好没多少,损失了几百。开始以为是黑客工攻击使用重装了后台,还好我说再看看代码,才发现居然放github里面了,我觉得是有人在用程序扫描github看看有没有人把私钥放上面,不然也不会这么快就发现,我觉得大概五分钟吧,真是吃一堑啊。不过私钥是一定要有的,为了这个目的,我们想了想,把私钥放在后台的环境变量里面了,代码如下:

    priv_key = env_dist['BLOCK_KEY'] #爱链的eth账户的私钥

    account = Account.privateKeyToAccount(priv_key) #通过私钥得到公钥也就是账户地址

    接下来就是得到防止重放攻击的数字,使用 nonce = w3.eth.getTransactionCount(account.address) #通过返回指定地址发起的交易数,得到防止重放攻击的数字 得到。

    然后就到了重中之重了,把文字信息附到交易里面,首先要把文字信息转换为16进制编码,使用方法:data=Web3.toHex(str.encode(text+'——'+name))#交易附加的信息,需要将字符串转换为16进制编码,需要前端传递来需要保存的数据

    一切都搞定啦就可以把他们打包了,得到:

    payload = {
          'to':  '0x8Fe2Af03Ed1d362371261AB33C400F24fBB82D8f',
          'value': 0,
          'gas': 200000,           #运算步数的上限
          'gasPrice': Web3.toWei(3,'gwei'),#每一步运算耗费的Eth
          'nonce': nonce,
          'data':data
        }

    然后就可以生成裸交易,将信息上链啦。具体步骤如下:

    signed = account.signTransaction(payload) #签名

    之后tx_hash = w3.eth.sendRawTransaction(signed.rawTransaction)#生成裸交易,得到交易号

    不过得到的交易号还需要16进制转义,具体方法:tx_hash=''.join(['%02x'% b for b in tx_hash])

    这样整个交易就完成啦。

    上链之后还可以查询它的状态,使用receipt = w3.eth.getTransactionReceipt(tx_hash)获得交易收据,

    交易收据是一个AttributeDict对象,因此你可以直接使用.来访问以下属性:

    • transactionHash: 交易哈希
    • transactionIndex: 交易在块内的索引序号
    • blockHash: 交易所在块的哈希
    • blockNumber: 交易所在块的编号
    • cumulativeGasUsed: 交易所在块消耗的gas总量
    • gasUsed: 本次交易消耗的gas用量
    • contractAddress: 对于合约创建交易,该值为新创建的合约地址,否则为null
    • logs: 本次交易生成的日志对象数组

    按照以太坊的出块速度,大约最快需要15秒交易才可能得到确认,因此我们需要 周期性地检查交易收据。

    web3.py的Eth类也提供了waitForTransactionReceipt()方法来等待 交易收据,它在一个单独的 线程里等待收据。例如,下面的代码设置超时时长为60s:

    receipt = w3.eth.waitForTransactionReceipt(tx_hash,60)

    最后,在说说如何确定gasPrice,可以通过https://ethgasstation.info/查询获得,这样以太坊交互最简单的应用就完成啦。

  • 相关阅读:
    Navicat for MySQL破解版安装
    LACP学习笔记
    MUX VLAN
    Beyond Compare用于文件比较还是蛮好的选择,特别是我们程序袁用于比较两个项目的时候,最初使用的是Beyond Compare3一直用着挺好的,几年前更新了版本4,用着用着就提示试用期30天已过期,于是我尝试如下步骤:
    思科交换机如何进行备份与还原?
    vSphere ESXi 6.7 注册码(有效)
    VMware ESXi 6.7密码正确不能登录
    Esxi 6.5 6.7的root密码经过一段时间就不可用的解决方法
    Windows Server 2012 R2 安装密钥
    ubuntu 16 添加多个IP
  • 原文地址:https://www.cnblogs.com/yzc0709/p/9746739.html
Copyright © 2011-2022 走看看