exchange.IO("hash", ...)
计算哈希摘要、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 | 返回按 |
参数
| 名称 | 类型 | 必填 | 描述 |
k | string | 是 | 固定为 |
algo | string | 是 | 算法:摘要(如 |
inputFormat | string | 是 |
|
outputFormat | string | 是 | 输出格式: |
data | string | 是 | 要处理的数据,按 |
keyFormat | string | 否 |
|
key | string | 否 | 密钥:HMAC的密钥、 |
参考
Web3 exchange.IO exchange.IO("sign") exchange.IO("signTypedData") exchange.IO("encodePacked") Encode
备注
参数个数必须是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(返回以文件名为键的对象)。