爱链笔记-以太坊连接

为了达到写的话语可以在互联网上源远流长,我选择把它写到区块链上。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/查询获得,这样以太坊交互最简单的应用就完成啦。

 

posted @ 2018-10-06 10:25  yzccoding  阅读(329)  评论(0编辑  收藏  举报