eos-java
转账示例:alice 转给 bob 1 个 eos。整个过程主要分为 4 个步骤:
abi 接口序列化
本地构建交易
本地签名
发送交易
EOS Force 与 EOSIO 构建交易的主要区别在于交易手续费,即在第 2 步构建交易时,需要加入字段 fee, 比如:"fee": "0.0100 EOS"。转账的手续费为 0.01 EOS,其他投票,领取分红等手续费有所不同,具体参见 eosforce 手续费列表。
为了避免交易在本地执行但实际并未没有广播出去,从而导致查询等操作出现异常,nodeos_url 尽量写外面同步节点的 url,不要用本地节点。
1. abi 接口序列化
API:
nodeos_url/v1/chain/abi_json_to_bin
示例:
$ curl https://w1.eosforce.cn/v1/chain/abi_json_to_bin -X POST -d '{"code":"eosio", "action":"transfer", "args":{"from":"alice", "to":"bob", "quantity": "1.0000 EOS", "memo": ""}}'
返回结果:
{"binargs":" 0000000000a09b3b00000000004f0feb102700000000000004454f530000000000"}
2. 本地构建转账交易
构建如下结构的 json:
{
"expiration": "2018-07-11T07:46:13",
"ref_block_num": 551145,
"ref_block_prefix": 4162828550,
"net_usage_words": 0,
"max_cpu_usage_ms": 0,
"delay_sec": 0,
"context_free_actions": [],
"actions": [
{
"account": "eosio",
"name": "transfer",
"authorization": [
{
"actor": "alice",
"permission": "active"
}
],
"data": "0000000000a09b3b00000000004f0feb102700000000000004454f530000000000"
}
],
"transaction_extensions": [],
"fee": "0.0100 EOS"
}
注意:一定要添加 fee 字段。
expiration, ref_block_num, ref_block_prefix, chainId 需要从接口: nodeos_url/v1/chain/get_info 接口获取。
3. 本地交易签名
通过公钥和 chainId 对第 2 步构造的 json 数据签名。
待签原文字节码数据:
签名前:
[-67,97,-82,58,3,30,-114,-14,-7,126,-29,-80,-26,39,118,-42,-45,13,72,51,-56,-9,-63,100,92,101,123,20,-111,81,0,75,-59,-75,69,91,-23,104,6,-71,31,-8,0,0,0,0,1,0,0,0,0,0,-22,48,85,0,0,0,87,45,60,-51,-51,1,0,0,0,0,0,-96,-101,59,0,0,0,0,-88,-19,50,50,33,0,0,0,0,0,-96,-101,59,0,0,0,0,0,79,15,-21,16,39,0,0,0,0,0,0,4,69,79,83,0,0,0,0,0,0,100,0,0,0,0,0,0,0,4,69,79,83,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
签名后:
SIG_K1_KBEtNKsk7GpRDyB7udNacTwvJiyuvb19ouBX9to95HoFkbdfdAstAxpM7VKdCDwY4Lqg7ywk5ja3RbtKGztw1dEkKC1n8k
4. 发送交易
API:
nodeos_url/v1/chain/push_transaction
{
"signatures": [
"SIG_K1_KBEtNKsk7GpRDyB7udNacTwvJiyuvb19ouBX9to95HoFkbdfdAstAxpM7VKdCDwY4Lqg7ywk5ja3RbtKGztw1dEkKC1n8k"
],
"compression": "none",
"packed_context_free_data": "",
"packed_trx": "c5b5455be96806b91ff800000000010000000000ea3055000000572d3ccdcd010000000000a09b3b00000000a8ed3232210000000000a09b3b00000000004f0feb102700000000000004454f53000000000000640000000000000004454f5300000000"
}
返回结果中有包含字段transaction_id字段即为成功
{
"_children": {
"transaction_id": {
"_value": "4318727153813ecfae9c7477664a39bfacf034a07edb26ee4f234b65ad6cfe29"
},
"processed": {
"_children": {
"id": {
"_value": "4318727153813ecfae9c7477664a39bfacf034a07edb26ee4f234b65ad6cfe29"
},
"receipt": {
"_children": {
"status": {
"_value": "executed"
},
"cpu_usage_us": {
"_value": 1249
},
"net_usage_words": {
"_value": 18
}
},
"_nodeFactory": {
"_cfgBigDecimalExact": false
}
},
"elapsed": {
"_value": 1249
},
"net_usage": {
"_value": 144
},
"scheduled": {
"_value": false
},
"action_traces": {
"_children": [
{
"_children": {
"receipt": {
"_children": {
"receiver": {
"_value": "eosio"
},
"act_digest": {
"_value": "ee870581670fb3342a4c93391687976ee245f97611a305fb6be40e5c960df107"
},
"global_sequence": {
"_value": 647610
},
"recv_sequence": {
"_value": 647007
},
"auth_sequence": {
"_children": [
{
"_children": [
{
"_value": "alice"
},
{
"_value": 42
}
],
"_nodeFactory": {
"_cfgBigDecimalExact": false
}
}
],
"_nodeFactory": {
"_cfgBigDecimalExact": false
}
},
"code_sequence": {
"_value": 1
},
"abi_sequence": {
"_value": 1
}
},
"_nodeFactory": {
"_cfgBigDecimalExact": false
}
},
"act": {
"_children": {
"account": {
"_value": "eosio"
},
"name": {
"_value": "transfer"
},
"authorization": {
"_children": [
{
"_children": {
"actor": {
"_value": "alice"
},
"permission": {
"_value": "active"
}
},
"_nodeFactory": {
"_cfgBigDecimalExact": false
}
}
],
"_nodeFactory": {
"_cfgBigDecimalExact": false
}
},
"data": {
"_children": {
"from": {
"_value": "alice"
},
"to": {
"_value": "bob"
},
"quantity": {
"_value": "1.0000 EOS"
},
"memo": {
"_value": ""
}
},
"_nodeFactory": {
"_cfgBigDecimalExact": false
}
},
"hex_data": {
"_value": "0000000000a09b3b00000000004f0feb102700000000000004454f530000000000"
}
},
"_nodeFactory": {
"_cfgBigDecimalExact": false
}
},
"elapsed": {
"_value": 268
},
"cpu_usage": {
"_value": 0
},
"console": {
"_value": ""
},
"total_cpu_usage": {
"_value": 0
},
"trx_id": {
"_value": "4318727153813ecfae9c7477664a39bfacf034a07edb26ee4f234b65ad6cfe29"
},
"inline_traces": {
"_children": [],
"_nodeFactory": {
"_cfgBigDecimalExact": false
}
}
},
"_nodeFactory": {
"_cfgBigDecimalExact": false
}
}
],
"_nodeFactory": {
"_cfgBigDecimalExact": false
}
},
"except": {}
},
"_nodeFactory": {
"_cfgBigDecimalExact": false
}
}
},
"_nodeFactory": {
"_cfgBigDecimalExact": false
}
}