输入/搜索内容
内置函数
结构体
内置变量与常量
通用约定
交易所
能力矩阵
中心化交易所
去中心化交易所
预测市场
证券与期货
链上与自定义接入

计算哈希摘要、HMAC,以及使用交易所对象配置的私钥签名等,参数与Encode函数相同。在Web3交易所对象上常用于计算keccak256哈希,例如方法选择器、EIP-712摘要。

exchange.IO(k, algo, inputFormat, outputFormat, data)
exchange.IO(k, algo, inputFormat, outputFormat, data, keyFormat, key)

示例

计算方法选择器、HMAC、ABI编码,以及用配置的私钥对哈希签名。

javascript
function main() { // 方法选择器:keccak256("transfer(address,uint256)") 的前 4 字节 var h = exchange.IO("hash", "keccak256", "raw", "hex", "transfer(address,uint256)") Log("selector:", "0x" + h.slice(0, 8)) // 输出:0xa9059cbb // 对十六进制数据求哈希,输出不带 0x Log(exchange.IO("hash", "keccak256", "hex", "hex", "0x1234")) // HMAC-SHA256:最后两个参数为密钥的格式和密钥 Log(exchange.IO("hash", "sha256", "string", "base64", "message", "string", "secret")) // 按 ABI 编码一个 uint256 Log(exchange.IO("hash", "abi.uint256", "string", "hex", "1000")) // 用配置的私钥对 32 字节哈希签名:65 字节 r‖s‖v,v 为 0 或 1 Log(exchange.IO("hash", "sign", "hex", "hex", h)) }
python
def main(): # 方法选择器:keccak256("transfer(address,uint256)") 的前 4 字节 h = exchange.IO("hash", "keccak256", "raw", "hex", "transfer(address,uint256)") Log("selector:", "0x" + h[:8]) # 输出:0xa9059cbb # 对十六进制数据求哈希,输出不带 0x Log(exchange.IO("hash", "keccak256", "hex", "hex", "0x1234")) # HMAC-SHA256:最后两个参数为密钥的格式和密钥 Log(exchange.IO("hash", "sha256", "string", "base64", "message", "string", "secret")) # 按 ABI 编码一个 uint256 Log(exchange.IO("hash", "abi.uint256", "string", "hex", "1000")) # 用配置的私钥对 32 字节哈希签名:65 字节 r‖s‖v,v 为 0 或 1 Log(exchange.IO("hash", "sign", "hex", "hex", h))
rust
fn main() { // 方法选择器:keccak256("transfer(address,uint256)") 的前 4 字节 let hv = exchange.IO(("hash", "keccak256", "raw", "hex", "transfer(address,uint256)")); let Ok(hv) = hv else { return }; let h = hv.as_str().unwrap_or("").to_string(); Log!("selector:", format!("0x{}", &h[..8])); // 输出:0xa9059cbb // 对十六进制数据求哈希,输出不带 0x Log!(exchange.IO(("hash", "keccak256", "hex", "hex", "0x1234"))); // HMAC-SHA256:最后两个参数为密钥的格式和密钥;超过6个参数时用 Vec<Arg> 传参 let args: Vec<Arg> = ["hash", "sha256", "string", "base64", "message", "string", "secret"] .iter().map(|s| Arg::Str(s.to_string())).collect(); Log!(exchange.IO(args)); // 按 ABI 编码一个 uint256 Log!(exchange.IO(("hash", "abi.uint256", "string", "hex", "1000"))); // 用配置的私钥对 32 字节哈希签名:65 字节 r‖s‖v,v 为 0 或 1 Log!(exchange.IO(("hash", "sign", "hex", "hex", h.as_str()))); }

返回值

类型描述

string / object

返回按outputFormat编码的结果;unzip返回以文件名为键的对象。调用失败返回空值,GetLastError()中有错误信息。

参数

名称类型必填描述

k

string

是

固定为hash,用于哈希、签名等计算。

algo

string

是

算法:摘要(如sha256、keccak256,可计算HMAC)、格式转换(raw、string)、签名(sign、signTx)、ABI编码(abi.类型),以及Ed25519、字符集转换、AES和压缩;全部取值见备注。

inputFormat

string

是

data的格式:raw、string(按字符串的字节)、hex(0x前缀可选)、base64、base64.url、base64.rawurl。

outputFormat

string

是

输出格式:hex(不带0x)、base64、base64.url、base64.rawurl、raw、string(输出必须是有效的UTF-8文本)。

data

string

是

要处理的数据,按inputFormat解析。

keyFormat

string

否

key的格式,取值同inputFormat。

key

string

否

密钥:HMAC的密钥、sign使用的私钥(例如keyFormat为hex时传私钥的十六进制)、ed25519和AES的密钥。ed25519、aes.*必须传入。AES的密钥为16、24或32字节,初始向量取密钥的前16字节,不做填充(cbc、ecb要求数据长度为16的整数倍)。

参考

备注

参数个数必须是4个或6个(不含hash)。

sign返回的签名v为0或1,与旧版本一致;需要分别取得r、s、v(v为27或28)或EIP-2098紧凑签名用于合约校验时,使用exchange.IO("sign", ...)。

以太坊(EVM)和波场(TRON)的交易所对象都可以使用。

algo参数的取值:

  • 摘要:md4、md5、sha1、sha224、sha256、sha384(同sha512.384)、sha512、sha512.224、sha512.256、keccak256(同sha3.keccak256)、sha3.keccak512、sha3.224、sha3.256、sha3.384、sha3.512、ripemd160、blake2b.256、blake2b.512、blake2s.128、blake2s.256。传入keyFormat和key时计算HMAC(blake2s为带密钥的MAC)。
  • raw、string:不计算,只做格式转换。
  • sign:用secp256k1私钥对32字节的data签名,返回65字节的r‖s‖v,其中v为0或1;不传key时使用交易所对象配置的私钥。
  • signTx:data为传统(legacy)交易的JSON,字段为Nonce、GasPrice、GasLimit、To、Value、Data、ChainId(字段名不区分大小写,缺少的数值按0处理),可以带Key字段指定私钥;返回签名后的交易。
  • abi.类型:按ABI编码一个值,例如abi.uint256、abi.address。
  • 另外支持ed25519(及ed25519.seed、ed25519.sha512)签名,text.encoder.字符集、text.decoder.字符集字符集转换,aes.encrypt、aes.decrypt(可加.cbc、.ecb、.cfb,默认cbc),zlib、gzip、flate、br、zstd、lz4加.deflate(压缩)或.inflate(解压),以及unzip(返回以文件名为键的对象)。