比我想像中的内容要多,地址监控写到第四篇了,这应该是最后一篇,因为程序基本上也要上线了!
往期内容:
以太坊实战【地址监控一】
以太坊实战【地址监控二】
以太坊实战【地址监控三】
在做地址监控最开始时用的RPC调用是直接发送http请求的,但到token监控时可能需要用到更多的web3js的功能,想着以后可能还有更多功能需要实现,还是用web3py比较省事,把代码重构了一下。
其实用js可能更方便,我这是因为项目本身用了python既然找到这么方便的库就继续用吧!
主要对象:
处理以太坊地址监控,可观察指定地址的以太币出入数据,主要有设置观察地址、地址变更通知等接口。
已有机制是通过数据库查询地址变更数据的,所以加了这块数据库处理。
命令行程序,从EthAddrWatcherDB取得观察地址,调用EthAddrWatcher监控地址变化,并把变化数据通过EthAddrWatcherDB写入数据库。
如同以前试验过,合约销毁后无法再调用其接口,测试过程中发现有销毁的合约用getCode()无法取到数据,被认为是一个普通用户地址了。不知道还有什么方法可以判断?不过不影响地址监控,因为销毁的合约地址肯定不是要监控的地址。
用etherscan查看的地址都是小写,但私链上测试实际数据地址是有大写,而mist输入地址时会判断大小写,可能一些地址判断需要忽略大小写。
用geth命令行发送两笔交易,地址有大小写区别:
> eth.sendTransaction({from:acc0, to:"0x068a7A0022a0e20d78682F39aA75547A0A260A2A", value:web3.toWei(2)})
"0x1d24fd9d2dbec1e5a6bfc174ab894ad83a5be91827e6c354bc7ab6eed3469265"
> eth.sendTransaction({from:acc0, to:"0x068a7A0022a0e20d78682F39aA75547A0A260A2a", value:web3.toWei(2)})
"0xdc7d585e344869ac282c27825425c64b6341d20ae11d1370dac71cc0e459e248"
实际链上数据,地址是按大小写规则的,而不是传入的大小写格式:
AttributeDict({'blockHash': '0x7acb444a9a08982b33ecb182af5714c66e898be97cd0004f153821340d282af8', 'blockNumber': 11847, 'from': '0x54b865714068f5F03574ACe39a1F3279C4E83E2c', 'gas': 90000, 'gasPrice': 18000000000, 'hash': '0x1d24fd9d2dbec1e5a6bfc174ab894ad83a5be91827e6c354bc7ab6eed3469265', 'input': '0x', 'nonce': 53, 'to': '0x068a7A0022a0e20d78682F39aA75547A0A260A2A', 'transactionIndex': 0, 'value': 2000000000000000000, 'v': '0x41', 'r': '0x794374fc3030ee6690e5140fcff5533cdad19e130b9475674b94b6c91a9ea7b6', 's': '0x25a5f67a8aceb49579178451d1324ce03d1f86196d32ba594cb5ecdec2108a2d'})
AttributeDict({'blockHash': '0x7acb444a9a08982b33ecb182af5714c66e898be97cd0004f153821340d282af8', 'blockNumber': 11847, 'from': '0x54b865714068f5F03574ACe39a1F3279C4E83E2c', 'gas': 90000, 'gasPrice': 18000000000, 'hash': '0xdc7d585e344869ac282c27825425c64b6341d20ae11d1370dac71cc0e459e248', 'input': '0x', 'nonce': 54, 'to': '0x068a7A0022a0e20d78682F39aA75547A0A260A2A', 'transactionIndex': 1, 'value': 2000000000000000000, 'v': '0x42', 'r': '0x6422ca21a3083bb72234033b5bc571ab8256e0863bb92d997bbe3dd942959594', 's': '0x27a42aedbcb26f2b545b2c5dce9468f384dba2310b9898195a101bb7b697cf9'})
这些规则如果看源码应该很容易知道,可惜我还仔细看!
不知道原因,换种方法实现了,先判断input数据
查了一些资料说是fast模式相关,没找到好方法保证一定能取到数据,现在是在取不到数据时等待1秒,只到取到数据才处理。
感谢您阅读 @chaimyu 的帖子,期待您能留言交流!