当前位置:   article > 正文

【重磅推荐】Python之web3.py或Flask-web3框架开发以太坊之案例总结(比js容易很多......缺点是无法和Metamask集成)

【重磅推荐】Python之web3.py或Flask-web3框架开发以太坊之案例总结(比js容易很多......缺点是无法和Metamask集成)

关于web3.py集成Metamask的问题,web3.py官方也明确指明:只是把测试网络的账号秘钥导入,然后连接Metamask的测试网络进行转账,似乎无法集成Metamask。毕竟Metamask是支持js浏览器的用法,也正常!如果要开发基于Metamask的应用,直接用web3.js即可!

 

注:使用web3.js的时候,Metamask会自动嵌入一段js代码进入网站,所以我们网站可以自动识别是不是Metamask提供者!

 

说明:这里是使用Flask-web3作为案例!

Flask-web3仅对web3.py做了一个封装,用法还是和web3.py一样,只是为了符合flask框架,增加了一个全局对象current_web3,并把区块链服务器配置写入了配置文件中!

Flask-web3内部配置实现之源代码:

一个完整测试成功的案例

(建议使用ganache-cli来测试,而geth,我创建了私有区块链测试,可能是区块同步的问题,geth的console命令行转账测试都没成功,开启挖矿也测试了,没成功.........) 

 

  1. from flask_web3 import FlaskWeb3
  2. import json
  3. # 这些import仅仅用来方便注释type:类型,智能提示作用!
  4. from requests import Timeout
  5. from web3 import Web3
  6. from web3.eth import Eth, Contract
  7. from web3.personal import Personal
  8. class Web3Contract:
  9. def __init__(self):
  10. self.web3 = FlaskWeb3() # type:Web3
  11. self.eth = self.web3.eth # type:Eth
  12. self.personal = self.web3.personal # type:Personal
  13. self.abi_json_file_path = 'app/api/v1/eth/truffle/build/contracts/FirstContract.json'
  14. self.from_addr = self.eth.accounts[0]
  15. self.private_key_for_senders_account = "longmai123456"
  16. self.start()
  17. def start(self):
  18. # 这里很重要,defaultAccount默认为null,设置一个默认交易转账账号(如果transaction没指定from地址,那么这里是必须的)
  19. self.eth.defaultAccount = self.eth.accounts[0]
  20. # 交易转账参数(如果不指定发送者,from为默认账号eth.defaultAccount)
  21. transaction = {
  22. "from": self.from_addr
  23. }
  24. # 读取合约的abi-json文件
  25. contract_interface = self.get_contract_json(self.abi_json_file_path)
  26. # 部署合约地址
  27. contract_address = self.deploy_contract_address(contract_interface, transaction)
  28. # 获取合约实例
  29. store_var_instance = self.get_contract_instance(contract_address, contract_interface)
  30. # 调用合约实例方法
  31. self.invoke_contract_methods(store_var_instance, transaction)
  32. @staticmethod
  33. def get_contract_json(json_file_path):
  34. # 通过with上下文管理器读取json文件,更安全!
  35. with open(json_file_path, 'r', encoding="UTF-8") as f:
  36. source = json.load(f)
  37. return source
  38. def deploy_contract_address(self, contract_interface, transaction):
  39. self.unlockAccount()
  40. # 注:如果没有设置web.eth.defaultAccount默认账号的话,这里合约部署必须在指定transaction中指定from发送地址!
  41. tx_hash = self.eth.contract(
  42. abi=contract_interface['abi'],
  43. bytecode=contract_interface['bytecode']).constructor().transact(transaction=transaction)
  44. tx_receipt = self.wait_for_receipt(tx_hash, 120)
  45. return tx_receipt["contractAddress"]
  46. def get_contract_instance(self, contract_address, contract_interface):
  47. # 获取合约实例!
  48. instance = self.eth.contract(
  49. address=contract_address,
  50. abi=contract_interface['abi'])
  51. return instance
  52. def invoke_contract_methods(self, contract_instance, transaction):
  53. # 这里仅方便pycharm智能语法提示使用!
  54. instance = contract_instance # type:Contract
  55. # 发送交易之前必须解锁账户!
  56. self.unlockAccount()
  57. # 调用合约的setInfo方法,并获取交易的hash值!
  58. tx_hash = instance.functions.setInfo("kirin", 18).transact(transaction=transaction)
  59. # 获取hash值解码的收据凭证(其中包含当前hash的全部信息,如合约地址,交易账号,gas.....)
  60. tx_receipt = self.wait_for_receipt(tx_hash, 120)
  61. # 返回solidity的事件log
  62. event_logs = instance.events.eventInfo().processReceipt(tx_receipt)
  63. name, age = instance.functions.getInfo().call()
  64. print("调用solidity返回的值", name, age)
  65. def wait_for_receipt(self, tx_hash, max_seconds):
  66. try:
  67. tx_receipt = self.eth.waitForTransactionReceipt(tx_hash, max_seconds)
  68. except Timeout:
  69. raise Timeout("合约部署请求超时!!!")
  70. return tx_receipt
  71. def transfer_to(self):
  72. self.unlockAccount()
  73. self.eth.sendTransaction({
  74. "from": self.from_addr,
  75. "to": self.eth.accounts[1],
  76. "value": self.web3.toWei(1, 'ether')
  77. })
  78. print("账户收到金额:", self.eth.getBalance(self.eth.accounts[1]))
  79. def unlockAccount(self):
  80. self.personal.unlockAccount(self.from_addr, self.private_key_for_senders_account, 3600)

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号