7个版本
0.1.3 | 2022年12月21日 |
---|---|
0.1.2 | 2022年12月19日 |
0.0.3 | 2022年12月5日 |
#48 in #canister
每月 23 次下载
60KB
1.5K SLoC
概述
该库允许互联网计算机的canister为EVM兼容区块链签署交易。
这是一个两步过程
- 使用分布式ECDSA密钥生成在互联网计算机上创建新地址
- 使用阈值ECDSA签名使用这些地址作为canister本身或代表canister用户签署交易
在ic-evm-sign-starter有一个示例项目。
特性
- 创建EVM地址
- 签署EVM交易
- 管理交易nonce
- 支持不同的chain id
- 处理各种交易类型
支持的交易类型:Legacy, EIP1559, EIP2930
入门指南
入门项目
您可以使用ic-evm-sign-starter快速入门。
现有项目
1. 安装库
在项目中运行 cargo add ic-evm-sign
2. 创建新EVM地址
从canister创建一个新的EVM兼容地址
use ic_evm_sign;
#[update]
async fn create_address() -> Result<String, String> {
let principal_id = ic_cdk::caller();
let response = ic_evm::create_address(principal_id).await
.map_err(|e| format!("Failed to create address {}", e))
.unwrap();
Ok(response.address)
}
使用以下方法进行本地测试
dfx canister call ${canister_name} create_address
3. 签署EVM交易
从canister签署EVM兼容交易
use ic_evm_sign;
#[update]
async fn sign_tx(hex_raw_tx: Vec<u8>) -> Result<String, String> {
let chain_id = 1;
let principal_id = ic_cdk::caller();
let response = ic_evm_sign::sign_transaction(hex_raw_tx, chain_id, principal_id).await
.map_err(|e| format!("Failed to sign transaction {}", e))
.unwrap();
Ok(response.sign_tx)
}
使用以下方法进行本地测试
dfx canister call ${canister_name} sign_tx '(vec {${hex_raw_tx}}: vec nat8)'
示例
dfx canister call ${canister_name} sign_tx '(vec {236; 128; 133; 5; 66; 135; 40; 189; 130; 117; 48; 148; 112; 153; 121; 112; 197; 24; 18; 220; 58; 1; 12; 125; 1; 181; 14; 13; 23; 220; 121; 200; 136; 13; 224; 182; 179; 167; 100; 0; 0; 0; 128; 128; 128}: vec nat8)'
对于交易十六进制
0xec808505428728bd8275309470997970c51812dc3a010c7d01b50e0d17dc79c8880de0b6b3a764000000808080
工作原理
新地址
- 从canister接收本金
- 在IC上创建一个新的ECDSA公钥
- 从公钥计算EVM地址
- 根据本金将新地址保存到canister状态中
交易签名
- 从canister接收原始交易、chain id和本金
- 从canister状态中获取本金的公钥
- 从原始交易和chain id准备“消息”进行签名
- 对“消息”进行签名并获取交易签名
- 从“消息”进行签名、签名和公钥计算恢复id
- 然后从原始交易、chain id和恢复id获取已签名的交易
- 根据本金将交易存储到canister状态中
如何操作 & 指南
不同的EVM
使用不同的与EVM兼容的区块链,通过chain_id
在
ic_evm_sign::sign_transaction(hex_raw_tx, chain_id, principal_id)
查找chain ids地址:[https://chainlist.org](https://chainlist.org)
交易类型
您可以通过传递相应的十六进制值,通过在hex_raw_tx
中传递十六进制来签署不同的交易类型
ic_evm_sign::sign_transaction(hex_raw_tx, chain_id, principal_id)
查找交易类型地址:[https://github.com/ethereum/execution-specs/blob/master/lists/signature-types/README.md](https://github.com/ethereum/execution-specs)
贡献
开始
- 使用
git clone
下载仓库 - 使用
cargo test
运行单元测试
要运行e2e测试
- 在
e2e/tests
中使用npm i
安装依赖项 - 然后运行e2e脚本,使用
make e2e-test
依赖项
~7–17MB
~177K SLoC