跳转至

签署交易

原文:https://docs.elrond.com/developers/signing-transactions/signing-transactions

如何序列化和签名交易负载

在将交易提交给Elrond网络之前,必须用发送者的私钥对交易进行签名。使用 Ed25519 算法进行签名。

一般结构

一个未签名的交易具有以下字段:

类型 需要 描述
nonce 数字 帐户序列号
value 线 是(可以是"0") 要传输的值,以原子单位表示:EGLD乘以denomination
receiver 线 接收者的地址(bech32 格式)
sender 线 发件人的地址(bech32 格式)
gasPrice 数字 交易范围内使用的天然气价格
gasLimit 数字 为交易分配的气体单位的最大数量
data 线 关于交易的任意信息, base64 编码
chainID 线 链标识符。
version 数字 交易的版本(如1)。

已签名的交易具有附加的 signature 字段:

类型 描述
签名 线 数字签名由 128 个十六进制字符组成(因此原始表示为 64 个字节)

连载签约

在签署一个交易之前,必须对它进行序列化,也就是说,获得它的原始二进制表示——作为一个字节序列。这是通过以下步骤实现的:

  1. 根据交易字段在上表中的出现顺序对其进行排序(nonce在前,version在后)。
  2. 如果data字段为空,则将其丢弃。
  3. data有效载荷转换成它的 base64 表示。
  4. 获取交易的 JSON 表示(UTF-8 字符串),保持字段的顺序。这个 JSON 表示必须包含无缩进无分隔空格
  5. 将生成的 JSON (UTF-8)字符串编码为一个字节序列。

例如,给定交易:

nonce = 7
value = "10000000000000000000"  # 10 EGLD
receiver = "erd1cux02zersde0l7hhklzhywcxk4u9n4py5tdxyx7vrvhnza2r4gmq4vw35r"
sender = "erd1l453hd0gt5gzdp7czpuall8ggt2dcv5zwmfdf3sd3lguxseux2fsmsgldz"
gasPrice = 1000000000
gasLimit = 70000
data = "for the book"
chainID = "1"
version = 1 

通过应用步骤 1-3(在这个例子中省略了步骤 4),可以获得:

{"nonce":7,"value":"10000000000000000000","receiver":"erd1cux02zersde0l7hhklzhywcxk4u9n4py5tdxyx7vrvhnza2r4gmq4vw35r","sender":"erd1l453hd0gt5gzdp7czpuall8ggt2dcv5zwmfdf3sd3lguxseux2fsmsgldz","gasPrice":1000000000,"gasLimit":70000,"data":"Zm9yIHRoZSBib29r","chainID":"1","version":1} 

如果交易有空的无数据字段:

nonce = 8
value = "10000000000000000000"  # 10 ERD
receiver = "erd1cux02zersde0l7hhklzhywcxk4u9n4py5tdxyx7vrvhnza2r4gmq4vw35r"
sender = "erd1l453hd0gt5gzdp7czpuall8ggt2dcv5zwmfdf3sd3lguxseux2fsmsgldz"
gasPrice = 1000000000
gasLimit = 50000
data = ""
chainID = "1"
version = 1 

那么它的序列化形式(本例中省略了步骤 5)如下:

{"nonce":8,"value":"10000000000000000000","receiver":"erd1cux02zersde0l7hhklzhywcxk4u9n4py5tdxyx7vrvhnza2r4gmq4vw35r","sender":"erd1l453hd0gt5gzdp7czpuall8ggt2dcv5zwmfdf3sd3lguxseux2fsmsgldz","gasPrice":1000000000,"gasLimit":50000,"chainID":"1","version":1} 

ed 25519 签名

Elrond使用 Ed25519 算法来签署交易。为了获得签名,可以使用通用软件库,如 PyNaCltweetnacl-js 或Elrond SDK 的组件,如 elrond-core-jserdpyerdjserdwalletjs-cli

由 64 个字节组成的原始签名随后必须被十六进制编码并放置在交易对象中。

准备播出

一旦signature字段也被设置,该交易就准备好被广播。按照上面的例子,它们的现成广播形式如下:

# With data field
nonce = 7
value = "10000000000000000000"  # 10 EGLD
receiver = "erd1cux02zersde0l7hhklzhywcxk4u9n4py5tdxyx7vrvhnza2r4gmq4vw35r"
sender = "erd1l453hd0gt5gzdp7czpuall8ggt2dcv5zwmfdf3sd3lguxseux2fsmsgldz"
gasPrice = 1000000000
gasLimit = 70000
data = "Zm9yIHRoZSBib29r"
chainID = "1"
version = 1
signature = "1702bb7696f992525fb77597956dd74059b5b01e88c813066ad1f6053c6afca97d6eaf7039b2a21cccc7d73b3e5959be4f4c16f862438c7d61a30c91e3d16c01" 
# Without data field
nonce = 8
value = "10000000000000000000"  # 10 EGLD
receiver = "erd1cux02zersde0l7hhklzhywcxk4u9n4py5tdxyx7vrvhnza2r4gmq4vw35r"
sender = "erd1l453hd0gt5gzdp7czpuall8ggt2dcv5zwmfdf3sd3lguxseux2fsmsgldz"
gasPrice = 1000000000
gasLimit = 50000
data = ""
chainID = "1"
version = 1
signature = "4a6d8186eae110894e7417af82c9bf9592696c0600faf110972e0e5310d8485efc656b867a2336acec2b4c1e5f76c9cc70ba1803c6a46455ed7f1e2989a90105" 


回到顶部