#internet-computer #sign #canister #transaction #blockchain #evm #evm-compatible

ic-evm-sign

该库允许互联网计算机的canister为EVM兼容区块链签署交易

7个版本

0.1.3 2022年12月21日
0.1.2 2022年12月19日
0.0.3 2022年12月5日

#48 in #canister

每月 23 次下载

Apache-2.0

60KB
1.5K SLoC

概述

该库允许互联网计算机的canister为EVM兼容区块链签署交易。

这是一个两步过程

  1. 使用分布式ECDSA密钥生成在互联网计算机上创建新地址
  2. 使用阈值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

工作原理

新地址

  1. 从canister接收本金
  2. 在IC上创建一个新的ECDSA公钥
  3. 从公钥计算EVM地址
  4. 根据本金将新地址保存到canister状态中

交易签名

  1. 从canister接收原始交易、chain id和本金
  2. 从canister状态中获取本金的公钥
  3. 从原始交易和chain id准备“消息”进行签名
  4. 对“消息”进行签名并获取交易签名
  5. 从“消息”进行签名、签名和公钥计算恢复id
  6. 然后从原始交易、chain id和恢复id获取已签名的交易
  7. 根据本金将交易存储到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)

贡献

开始

  1. 使用git clone下载仓库
  2. 使用cargo test运行单元测试

要运行e2e测试

  1. e2e/tests中使用npm i安装依赖项
  2. 然后运行e2e脚本,使用make e2e-test

依赖项

~7–17MB
~177K SLoC