签署交易
原文: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 个字节) |
连载签约
在签署一个交易之前,必须对它进行序列化,也就是说,获得它的原始二进制表示——作为一个字节序列。这是通过以下步骤实现的:
- 根据交易字段在上表中的出现顺序对其进行排序(
nonce
在前,version
在后)。 - 如果
data
字段为空,则将其丢弃。 - 将
data
有效载荷转换成它的 base64 表示。 - 获取交易的 JSON 表示(UTF-8 字符串),保持字段的顺序。这个 JSON 表示必须包含无缩进和无分隔空格。
- 将生成的 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 算法来签署交易。为了获得签名,可以使用通用软件库,如 PyNaCl 、 tweetnacl-js 或Elrond SDK 的组件,如 elrond-core-js 、 erdpy 、 erdjs 或 erdwalletjs-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"