一直对交易所的钱包很好奇,我在交易所买了有ETH,但是充值地址显示金额是0,后面想了想也是,我即时买卖,资产中的充值地址不可能与我的余额关联起来,大概想了想,交易所应该是这个流程
1,买卖只是记账,不涉及实际区块金额
2,充值是充值到一个地址,一旦充值到账,交易所会将这笔钱转到自己的冷钱包或热钱包
3,提现后是从交易所的热钱包打出
试了一下web3.py对接以太坊的钱包,过程也算比较简单
1,启动geth服务
启动时一定要加上personal api,不然在对用户操作时会报找不到personal的方法
--rpcapi="db,eth,net,web3,personal,web3"
2,读取区块数据
查看指定区块的数据,transactions字段即全部的交易hash
>>> web3.eth.getBlock(1000000)
AttributeDict({u'nonce': u'0xcd4c55b941cf9015', u'transactionsRoot': u'0x65ba887fcb0826f616d01f736c1d2d677bcabde2f7fc25aa91cfbc0b3bad5cb3', u'hash': u'0x8e38b4dbf6b11fcc3b9dee84fb7986e29ca0a02cecd8977c161ff7333329681e', u'uncles': [], u'sha3Uncles': u'0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347', u'timestamp': 1455404053, u'receiptsRoot': u'0x20e3534540caf16378e6e86a2bf1236d9f876d3218fbc03958e6db1c634b2333', u'number': 1000000, u'difficulty': 12549332509227, u'size': 768, u'miner': u'0x2a65aca4d5fc5b5c859090a6c34d164135398226', u'mixHash': u'0x92c4129a0ae2361b452a9edeece55c12eceeab866316195e3d87fc1b005b6645', u'parentHash': u'0xb4fbadf8ea452b139718e2700dc1135cfc81145031c84b7ab27cd710394f7b38', u'extraData': u'0xd783010303844765746887676f312e352e31856c696e7578', u'gasLimit': 3141592, u'stateRoot': u'0x0e066f3c2297a5cb300593052617d1bca5946f0caa0635fdb1b85ac7e5236f34', u'transactions': [u'0xea1093d492a1dcb1bef708f771a99a96ff05dcab81ca76c31940300177fcf49f', u'0xe9e91f1ee4b56c0df2e9f06c2b8c27c6076195a88a7b8537ba8313d80e6f124e'], u'totalDifficulty': 7135202464334937706, u'gasUsed': 50244, u'logsBloom': u'0x00000000000000000000000000000000000800000000000000000000000800000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000'})
根据指定的hash查找事务详情,from-原始地址 to-目标地址 value-金额 (单位Wei)
>>> web3.eth.getTransaction('0xea1093d492a1dcb1bef708f771a99a96ff05dcab81ca76c31940300177fcf49f')
AttributeDict({u'nonce': 21, u'from': u'0x39fA8c5f2793459D6622857E7D9FbB4BD91766d3', u'blockHash': u'0x8e38b4dbf6b11fcc3b9dee84fb7986e29ca0a02cecd8977c161ff7333329681e', u'gas': 129244, u'value': 100000000000000000000L, u'blockNumber': 1000000, u'to': u'0xc083e9947Cf02b8FfC7D3090AE9AEA72DF98FD47', u's': u'0x30b7835ba481955b20193a703ebc5fdffeab081d63117199040cdf5a91c68765', u'r': u'0xa254fe085f721c2abe00a2cd244110bfc0df5f4f25461c85d8ab75ebac11eb10', u'gasPrice': 80525500000, u'v': u'0x1c', u'input': u'0x', u'transactionIndex': 0, u'hash': u'0xea1093d492a1dcb1bef708f771a99a96ff05dcab81ca76c31940300177fcf49f'})
这里我们就知道有没有交易所地址产生交易了。
3,到账确认
一般区块是需要到达指定的确认数才给入账的,这里我不是太明白,是不是有可能收到的块是无效块,被其他分支冲掉,不过如果按照6个确认数来,应该问题不大,将2中的hash保存,超过6个块后还能查到,应该就可以确认了,发起转到热钱包的事务,然后给用户入账。
遗留问题:
在调用web3.eth.getTransaction时,发现部分交易的to是空的,不知道是不是合约地址,改日再研究一下。
PS:有个问题理解的不对,一开始认为我们充币到交易所的充币地址后,交易所就将该币转移到冷钱包或热钱包了,后来实际观察了一下2个交易所,都没有动这个数量,我猜应该是金额太小,为了解决区块转账成本,要等一个地址达到一定的额度才会提走,有做交易所的朋友可以指正一下。