EOS创建账号说明

步骤:

1、解锁钱包,RPC API:v1/wallet/unlock

2、创建秘钥对,RPC API:v1/wallet/create_key

3、获取区块链信息,RPC API:v1/chain/get_info,通过这一步得到两个数据:head_block_num、chain_id

4、根据head_block_num获取区块数据,RPC API:v1/chain/get_block,通过这一步,主要得到三个数据:

timestamp、block_num、ref_block_prefix

以上是数据准备节点,接下来是重点。

5、调用接口abi_json_to_bin编码

涉及到一个json字符串:

{
  "code": "%s",
  "action": "%s",
  "args": {
    "creator": "%s",
    "name": "%s",
    "owner": {
      "threshold": 1,
      "keys": [
        {
          "key": "%s",
          "weight": 1
        }
      ],
      "accounts": [],   
      "waits": []      
    },
    "active": {
      "threshold": 1,
      "keys": [
        {
          "key": "%s",
          "weight": 1
        }
      ],
      "accounts": [],    
      "waits": []        
    }
  }
}

格式化代码是:

fmt.Sprintf(utils.ABI_JSON_TO_BIN,code,action,creator,name,owner_key,active_key)

其中,code:eosio,action:newaccount,这两个是固定的。

creator:创建者账号,eos新建账号必须用已经存在的账号

name:要创建的账号名称

owner_key:公钥

active_key:公钥

通过第5步,可以得到一个json字符串,找到字符串中的字段binargs的值,第六步我们将会用到这个值

6、签名交易

涉及到的json字符串为:

[
  {
    "ref_block_num": %d,
    "ref_block_prefix": %d,
    "expiration": "%s",
    "actions": [
      {
        "account": "%s",
        "name": "%s",
        "authorization": [
          {
            "actor": "%s",
            "permission": "active"
          }
        ],
        "data": "%s"
      }
    ],
    "signatures": []
  },
  [
    "%s"
  ],
  "%s"
]

格式化代码如下:

fmt.Sprintf(utils.SIGN_TRANSACTION,ref_block_num,ref_block_prefix,newTime,account,name,actor,data,public_key,chain_id)

其中utils.SIGN_TRANSACTION是上面的json字符串,ref_block_num、ref_block_prefix、newTime是第四步得到的,其中newTime要比获取到的多加十几秒,主要用于交易时效,eos交易打包较快,多加10秒足以,我这边加的是35秒

account:eosio,固定的

name:newaccount,固定的

actor:要创建的账户名称

data:是第5步得到的binargs

publick_key:是创建者的公钥

chain_id:是第三步得到的

通过这一步,会得到一个json字符串,找到字符串的字段signatures的值,下一步将会用到

7、推送交易

涉及到的json字符串为:

{
  "compression": "none",
  "transaction": {
    "expiration": "%s",
    "ref_block_num": %d,
    "ref_block_prefix": %d,
    "actions": [
      {
        "account": "eosio",
        "name": "newaccount",
        "authorization": [
          {
            "actor": "%s",
            "permission": "active"
          }
        ],
        "data": "%s"
      }
    ]
  },
  "signatures":%s
}

格式化数据代码:

fmt.Sprintf(utils.PUSH_TRANSACTION,newTime,ref_block_num,ref_block_prefix,actor,data,signatures)

其中utils.PUSH_TRANSACTION是上面的json字符串,ref_block_num、ref_block_prefix、newTime是第四步得到的,其中newTime要比获取到的多加十几秒,主要用于交易时效,eos交易打包较快,多加10秒足以,我这边加的是35秒

actor:是要创建的账户名称

data:是第5步得到的binargs

signatures:是第6步得到的signatures

如果这一步没有报错,就完成了创建账号。

交易和创建账号类似,其实创建账号就是一个交易。


交易说明

设计到的json字符串:

const TRANSFER_ABI_JSON_TO_BIN = `
{
  "code": "%s",
  "action": "transfer",
  "args": {
    "from": "%s",
    "to": "%s",
    "quantity": "%s",
    "memo": "%s",
  }
}
`

const TRANSFER_SIGN_TRANSACTION = `
[
  {
    "ref_block_num": %d,
    "ref_block_prefix": %d,
    "expiration": "%s",
    "actions": [
      {
        "account": "%s",
        "name": "transfer",
        "authorization": [
          {
            "actor": "%s",
            "permission": "active"
          }
        ],
        "data": "%s"
      }
    ],
    "signatures": []
  },
  [
    "%s"
  ],
  "%s"
]
`

const TRANSFER_PUSH_TRANSACTION = `
{
  "compression": "none",
  "transaction": {
    "expiration": "%s",
    "ref_block_num": %d,
    "ref_block_prefix": %d,
    "context_free_actions": [],
    "actions": [
        {
            "account": "%s",
            "name": "transfer",
            "authorization": [
                {
                    "actor": "%s",
                    "permission": "active"
                }
            ],
            "data": "%s"
        }
    ],
    "transaction_extensions": []
  },
  "signatures": %s
}
`

相关格式化代码如下:

abiJsonToBin:fmt.Sprintf(utils.TRANSFER_ABI_JSON_TO_BIN,code,from,to,quantity,memo)

signTransaction:

fmt.Sprintf(utils.TRANSFER_SIGN_TRANSACTION,ref_block_num,ref_block_prefix,newTime,code,actor,data,public_key,chain_id)

pushTranaction:

fmt.Sprintf(utils.TRANSFER_PUSH_TRANSACTION,newTime,ref_block_num,ref_block_prefix,code,actor,data,signatures)