内容上链
我们想要的效果是每一个交易下面的备注都可以写上我们需要的内容。下图是我们已经可以实现的效果
- 交易txid:0x2ad5b2365179e95e78a48441cf3f7f3a93993dc525cb67de40d8888488a090a3
- 区块浏览器地址:https://www.yitaifang.com/txs/0x2ad5b2365179e95e78a48441cf3f7f3a93993dc525cb67de40d8888488a090a3
交易基础概念
交易推动当前状态到下一状态的转变。在以太坊中有三种交易:
- EOA 之间传输值的交易(例如,改变发送方和接收方余额大小)。
- 发送消息来调用合约的交易(例如,通过发送消息调用来触发 setter 方法,以设置合约中的值)。
- 用于部署合约的交易(由此创建了合约账户)。
(从技术角度来讲,前两种交易是一样的…它们都是通过消息调用来改变账户状态的交易,只不过一个是 EOA 账户,一个是合约账户。此处将交易分为三种是为了方便读者的理解。)
交易由以下部分组成:
nonce
此账户发出的交易序号数(校对注:可以粗略理解为“这是该账户的第几笔交易”)。
gasPrice
执行此交易、进行计算时为每单位 gas 所支付的费用(以 Wei 计量)。
gasLimit
执行此交易时可以使用的最大 gas 数量。
to
- 如果此交易用于传送以太币,此处为接收以太币的 EOA 地址。
- 如果此交易用于向合约发送消息(例如,调用智能合约中的方法),此处为合约的地址。
- 如果此交易用于创建合约,此处值为空。
value
- 如果此交易用于收发以太币,此处为发往接收账户以 Wei 计量的代币数量。
- 如果此交易用于发送对合约的消息调用,此处为向接收此消息智能合约所给付的 Wei 数量。
- 如果此交易用于创建合约,此处为合约初始化时账户存放的以 Wei 计量的以太币数量。
v, r, s
在交易的密码学签名中用到的值,可以用于确定交易的发送方。
data (16进制文本)
发送消息调用时附带的输入数据(例如,假设你想要执行智能合约中的 setter 方法,数据区就应该包括 setter 方法的标识符,以及你想要设定的参数值)。
内容信息上链基本思路
- 发起一笔以太坊交易
- 使用json-rpc,或者web3j
- 在参数data 内容中做备注,内容上链信息做16进制转换
通过json rpc 发起交易
eth_sendTransaction 创建一个新的消息调用交易,如果数据字段中包含代码,则创建一个合约。
参数Object
- 交易对象,结果如下:
- from: DATA, 20字节 - 发送交易的源地址
- to: DATA, 20字节 - 交易的目标地址,当创建新合约时可选
- gas: QUANTITY - 交易执行可用gas量,可选整数,默认值90000,未用gas将返还。
- gasPrice: QUANTITY - gas价格,可选,默认值:待定(To-Be-Determined)
- value: QUANTITY - 交易发送的金额,可选整数
- data: DATA - 合约的编译带啊或被调用方法的签名及编码参数 (16进制文本)
- nonce: QUANTITY - nonce,可选。可以使用同一个nonce来实现挂起的交易的重写
params: [{
"from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155",
"to": "0xd46e8dd67c5d32be8058bb8eb970870f07244567",
"gas": "0x76c0", // 30400
"gasPrice": "0x9184e72a000", // 10000000000000
"value": "0x9184e72a", // 2441406250
"data": "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"
}]
通过web3j 交易接口
Transaction transaction= Transaction.createTransaction 创建一个交易事件方法
交易执行接口sendTransaction(Token token, String from, String to, String money, String remarks)
* @param token 代币的具体信息
* @param from 转出账户地址
* @param to 转入账户地址
* @param money 交易金额
* @param remarks 备注信息用于文字相关数据上链
* @return txid 区块链交易id
remarks 内容处理,上链操作
- base64 解码,中文传过来的内容使用base64编码,使用时需要解码,放着传输过程数据丢失 解析错误
Base64.Decoder decoder = Base64.getDecoder(); String base64 = new String(decoder.decode(remarks), "UTF-8"); String hex = str2HexStr(base64);
2. 将解码后的内容进行16进制转换
/**
* 字符串转换成为16进制
* @param str
* @return
*/
private static String str2HexStr(String str) {
if (str == null || str.length() < 0) {
return "";
}
char[] chars = "0123456789ABCDEF".toCharArray();
StringBuilder sb = new StringBuilder("");
byte[] bs = str.getBytes();
int bit;
for (int i = 0; i < bs.length; i++) {
bit = (bs[i] & 0x0f0) >> 4;
sb.append(chars[bit]);
bit = bs[i] & 0x0f;
sb.append(chars[bit]);
}
return sb.toString().trim();
}
-
send 交易到以太坊
EthSendTransaction ethSendTransaction=web3.ethSendTransaction(transaction) .sendAsync().get()
-
获取交易txid
String txid = ethSendTransaction.getTransactionHash();