USDT / BTC 节点在Mac、Linux中的搭建

USDT应用的是比特币的链,同时操作USDT的omni也有操作比特币的功能,所以在这对于这两种虚拟货币就采用了一个节点来操作。虽然隐隐感觉这样有些不妥,但是运行了这么久也一直没有发现异常的地方。所以今天才来记录了一下。(这里没有用本地私链,使用的官方测试链和公链)

下载相对应的omni安装包

http://www.omnilayer.org/download.html

解压到指定目录

tar -xzvf omnicore-0.3.1-osx64.tar.gz /cw_usdt_test/
cd /cw_usdt_test

(路径可以自己随意替换,到时自己能找到就可以)

拷贝依赖库

cp omnicore-0.3.1/lib/* /lib

创建储存区块数据的目录

mkdir tsdata 
cd tsdata

(同样可以自己更改路径)

创建配置文件

vim bitcoin.conf

键入以下内容

server=1
rpcuser=123456
rpcpassword=abcdef
rpcallowip=0.0.0.0
rpcport=8888
txindex=1

保存退出

:wq!

rpcuser、rpcpassword、rpcport、rpcallowip这几个是给连接程序用的。如果你按照我上面的记录设置了文件,那么你的Rpc调用类就应该是这样的

public class Constants {
	public static final String RPC_USER = "123456";
	public static final String RPC_PASSWORD = "abcdef";
	public static final String RPC_ALLOWIP = "http://127.0.0.1";
	public static final String RPC_PORT = "8888";
}
public class RpcClient {
	Logger log = LoggerFactory.getLogger(getClass());

	private static final String URL = Constants.RPC_ALLOWIP + ":" + Constants.RPC_PORT;
	private JsonRpcHttpClient mClient;

	public RpcClient() {
		String cred = Base64.encodeBase64String((Constants.RPC_USER + ":" + Constants.RPC_PASSWORD).getBytes());
		Map headers = new HashMap<>(1);
		headers.put("Authorization", "Basic " + cred);
		try {
			this.mClient = new JsonRpcHttpClient(new URL(URL), headers);
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 
	 * @param method 方法名
	 * @param var    参数
	 * @return 结果
	 */
	public String engine(@NotNull String method, Object... var) {
		return engine(method, String.class, var);
	}

	/**
	 * 
	 * @param method 方法名
	 * @param clazz  返回类型
	 * @param var    参数
	 * @return 结果
	 */
	public  T engine(@NotNull String method, Class clazz, Object... var) {
		try {
			return mClient.invoke(method, var, clazz);
		} catch (Throwable throwable) {
			String message = throwable.getMessage();
			Throwable cause = throwable.getCause();

			log.error("error cause=" + cause);
			log.error("error message=" + throwable);

			try {
				BaseRPCresponse res = JSON.parseObject(message, BaseRPCresponse.class);
				BaseRPCresponse.ErrorBean error = res.getError();
				throw new BaseException(String.valueOf(error.getCode()), error.getMessage());
			} catch (Exception e) {
				e.printStackTrace();
				throw new BaseException("W000", e.getMessage());
			}
		}
	}
}

上面是一个Java连接rpc的类,包括调用方法。

进入目录omnicore-3.0.1/bin

cd omnicore-3.0.1/bin

启动omni

./omnicored -conf=/cw_usdt_test/tsdata/bitcoin.conf -datadir=/cw_usdt_test/tsdata/ -testnet

(我这里启动的是测试链,如果你启动是主链记得把-testnet这个去掉)
这时候可以进入/cw_usdt_test/tsdata/testnet3 查看debug.log
在debug.log里可以看到同步的信息。(不管是公链还是测试链,这里同步都需要几天的时间)

测试RPC

我们再次进入到文件夹

cd /cw_usdt_test/omnicore-0.3.1/bin/

生成地址

./omnicore-cli -conf=/cw_usdt_test/tsdata/bitcoin.conf -datadir=/cw_usdt_test/tsdata/ -testnet getnewaddress

具体的可以运行

./omnicore-cli -conf=/cw_usdt_test/tsdata/bitcoin.conf -datadir=/cw_usdt_test/tsdata/ -testnet help

里面有所有的方法和说明
比如想查看哪个具体方法的参数说明可以这样

./omnicore-cli -conf=/cw_usdt_test/tsdata/bitcoin.conf -datadir=/cw_usdt_test/tsdata/ -testnet help getnewaddress

到这一个USDT、BTC的节点就已经搭建成功了,因为USDT是基于Btc的,所以转账时要求对应的address里必须要有足够多的比特币作为转账手续费,如果没有会提示余额不足。同时也要注意。其中rpc执行转账时调用方法omni_funded_sendall会把地址内所有的比特币都发送出去。omni_send转账才会花费较少的比特币。

对应上面的那段JAVA代码,执行的调用语句是这个样子的

//propertyid是链的ID,主链是31 测试链是1
omniUtil.engine("omni_send", fromaddress, toaddress, propertyid, String.valueOf(amount));

如果你想开发,根据交易哈希获取交易详情要经过两次rpc调用才可以,在这就不详细说了,如果有需要可以评论留下联系方式,咱们一起探讨。

你可能感兴趣的:(区块链)