对USDT的数据操作的简单实现

对稳定币的数据进行细粒度的操作,需要对其三条链进行数据同步,并使用RPC或(直接访问其数据库)获取信息。

ETH的信息访问

ERC-20 是一个 以太坊 区块链 上的 智能合约的一种协议标准。USDT也是可选使用ERC20协议将交易写入ETH中。

对ETH的完整信息访问,需要安装GETH同步ETH的数据(过大,不建议尝试)。

都使用GETH创建本地轻节点,或者创建私有链进行测试。

1.安装GETH

geth 的安装教程请参见 Building Ethereum.

2.启动本地节点

启动并开始同步区块(fast模式),开启HTTP RPC访问

1
geth --datadir .\eth_data\ --http --http.port 1234 --http.corsdomain '*' --cache=1024 --syncmode "fast" 

3.GETH的API文档

4.GETH的RPC API文档

5.基于Python的RPC访问区块链信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import requests
import json


def func(method: str, params: list):
url = "http://localhost:1234"
headers = {'content-type': 'application/json'}
payload = {
"method": method,
"params": params,
"jsonrpc": "2.0",
"id": 0,
}
response = requests.post(
url, data=json.dumps(payload), headers=headers).json()
print("response:", json.dumps(response))


if __name__ == "__main__":
func("eth_getBlockByNumber", ["0x1", False])

result:

1
2
response: {"jsonrpc": "2.0", "id": 0, "result": {"difficulty": "0x3ff800000", "extraData": "0x476574682f76312e302e302f6c696e75782f676f312e342e32", "gasLimit": "0x1388", "gasUsed": "0x0", "hash": "0x88e96d4537bea4d9c05d12549907b32561d3bf31f45aae734cdc119f13406cb6", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "miner": "0x05a56e2d52c817161883f50c441c3228cfe54d9f", "mixHash": "0x969b900de27b6ac6a67742365dd65f55a0526c41fd18e1b16f1a1215c2e66f59", "nonce": "0x539bd4979fef1ec4", "number": "0x1", "parentHash": "0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3", "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", "size": "0x219", "stateRoot": "0xd67e4d450343046425ae4271474353857ab860dbc0a1dde64b41b5cd3a532bf3", "timestamp": "0x55ba4224", "totalDifficulty": "0x7ff800000", "transactions": [], "transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "uncles": []}}

再配合nosql,如:MongoDB可以提炼,存储区块链数据。

BTC的信息访问

Omni 是一个创建和交易自定义数字资产和货币的平台。它是建立在最流行、最受审计、最安全的区块链——比特币之上的软件层。

雷同,USDT也可以使用Omni协议将交易写入BTC链中。

为了获取BTC中USDT的数据,我们需要借助OmniCore同步BTC中USDT的数据,使用RPC或(直接访问数据库)操作数据。

1.安装OmniCore,启动节点

基于docker-compose

1
2
3
4
5
6
7
8
9
10
11
12
version: '3'

services:
omnicored:
image: mpugach/omnicored
volumes:
- ./omnicore:/root/.bitcoin
ports:
- "127.0.0.1:18332:18332"

command: "-server -regtest -txindex -rpcuser=username -rpcpassword=password -rpcallowip=0.0.0.0/0 -rpcbind=0.0.0.0 -rpcport=18332 -printtoconsole"

其中-testnet的意思是使用Bitcoin测试网。

网络的配置文件bitcoin.conf,默认放置在/root/.bitcoin/

1
2
3
4
5
6
7
txindex=1 
listen=1
server=1
rpcuser=username
rpcpassword=password
rpcport=18332
rpcallowip=0.0.0.0/0
1
2
3
4
5
6
7
8
配置文件说明文档
txindex=1 #代表事务初始索引
listen=1 #监听模式,默认启动
server=1 #代表开启RPC访问
rpcuser=username #RPC用户名
rpcpassword=password #RPC密码
rpcport=8888 #RPC端口
rpcallowip=127.0.0.1 #允许RPC访问ip

2.USDT常用API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
新建账户地址
./omnicore-cli getnewaddress hjlAddress #(hjlAddress 账户名称)
一个账户名可以对应多个地址
./omnicore-cli getaddressesbyaccount hjlAddress

获取钱包比特币数量
./omnicore-cli getinfo

获取USDT数量
./omnicore-cli "omni_getbalance" "14Nzwd3SU4eWgiPW68RuvsgsazYEgBXjKQ" 31

发送代币-转账
./omnicore-cli "omni_send" "14Nzwd3SU4eWgiPW68s" "1KzU8ATU6bzbC7MDaQw8od2f" 31 "1000"
return: 7ccbf34be07e0de14c63bef01807b3095d4faf05288
(USDT的转账实际上是代号为31的OmniCore令牌转账。Omnicore提供了多套api实现令牌转账功能,
v0.3.1版本之前,可以使用omni_send和omni_sendall。这种方式必须保证发送地址上不仅需要有令牌余额,
还需要有一定数量的比特币用于支付手续费。
从v0.3.1版本开始,Omnicore提供了两个新的api omni_funded_sendomni_funded_sendall,
这种方式的好处在于可以指定手续费的支付方,所有的令牌交易都可以使用统一的地址进行支付比特币手续费,
而不需要发送者自身拥有比特币。但这里并未设定手续费的具体数量,
系统将根据在配置文件中的关于手续费的配置文件进行动态设定。)

获取单笔交易详情(钱包中创建的用户才可以转账,)
./omnicore-cli "omni_gettransaction" 7ccbf34be07e0de14c63bef01807b3095d4faf05288

查询本地事务列表(充值,转账记录)
./omnicore-cli "omni_listtransactions" '*' 10

3.Omni的RPC API

omni的JSON-RPC API与bitcoin的完全相同,使用的时候只是相当于将bitcoin的命令集进行了扩展。
具体的可以查询JOSN-RPC APIhttps://github.com/OmniLayer/omnicore/blob/master/src/omnicore/doc/rpc-api.md

4.基于Python的RPC访问区块链信息

可以使用原有的bitcoin的JSON-RPC
API包进行开发。例如,使用python-bitcoinrpc.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from bitcoinrpc.authproxy import AuthServiceProxy, JSONRPCException

if __name__ == '__main__':
# rpc_user and rpc_password are set in the bitcoin.conf file
rpc_connection = AuthServiceProxy("http://%s:%s@kid1999.top:8886" % ('user', 'pass'))
best_block_hash = rpc_connection.getbestblockhash()
print(rpc_connection.getblock(best_block_hash))

# batch support : print timestamps of blocks 0 to 99 in 2 RPC round-trips:
commands = [["getblockhash", height] for height in range(100)]
block_hashes = rpc_connection.batch_(commands)
blocks = rpc_connection.batch_([["getblock", h] for h in block_hashes])
block_times = [block["time"] for block in blocks]
print(block_times)

参考:

Ethereum JSON-RPC Specification

https://www.jianshu.com/p/3445ff08229a

http://cw.hubwiz.com/card/c/geth-rpc-api/1/4/6/

https://segmentfault.com/a/1190000017943286