#message #sign #ethereum #parser #serialization #verification #eip-4361

siwe

Rust对EIP-4361的实现:使用以太坊登录

14个版本

0.6.1 2024年2月29日
0.6.0 2023年6月28日
0.5.2 2023年6月5日
0.5.0 2022年10月6日
0.0.0 2021年11月24日

#1318 in 魔法豆

Download history 1465/week @ 2024-04-08 1851/week @ 2024-04-15 2304/week @ 2024-04-22 1951/week @ 2024-04-29 1966/week @ 2024-05-06 1798/week @ 2024-05-13 2228/week @ 2024-05-20 1595/week @ 2024-05-27 3171/week @ 2024-06-03 2478/week @ 2024-06-10 3699/week @ 2024-06-17 2729/week @ 2024-06-24 2798/week @ 2024-07-01 3118/week @ 2024-07-08 3750/week @ 2024-07-15 2970/week @ 2024-07-22

12,748 每月下载量
用于 15 个crate(5个直接使用)

MIT/Apache

49KB
889

使用以太坊登录

此crate提供了一个纯Rust实现的EIP-4361:使用以太坊登录。

安装

SIWE可以通过将其包含在项目的cargo.toml文件中轻松安装到任何Rust项目中

siwe = "0.6"

可用特性

  • serde用于序列化/反序列化支持;
  • ethers用于支持符合EIP-1271的合约钱包;以及
  • typed-builder用于更友好的验证选项构建。

用法

SIWE公开了一个实现EIP-4361的Message结构体。

解析SIWE消息

解析是通过MessageFromStr实现完成的。

let message: Message = string_message.parse()?;

验证和认证SIWE消息

验证和认证是通过EIP-191进行的,使用Messageaddress字段作为预期的签名者。这返回签名者的以太坊公钥

let signer: Vec<u8> = message.verify_eip191(&signature)?;

也可以在当前或特定时间验证时间限制(到期和开始时间)

if message.valid_now() { ... };

// equivalent to
if message.valid_at(&OffsetDateTime::now_utc()) { ... };

可以使用verify在单个调用中执行时间限制和认证的联合验证

message.verify(&signature).await?;

SIWE消息的序列化

Message实例也可以通过MessageDisplay实现序列化为它们的EIP-4361字符串表示形式

println!("{}", &message);

不仅支持EIP-191个人签名预哈希签名输入格式(如果您的以太坊钱包不支持EIP-191直接签名)

let eip191_bytes: Vec<u8> = message.eip191_bytes()?;

直接作为EIP-191个人签名哈希化签名输入(通过.eip191_string输出生成)

let eip191_hash: [u8; 32] = message.eip191_hash()?;

示例

解析和验证Message非常简单

use hex::FromHex;
use siwe::{Message, TimeStamp, VerificationOpts};
use std::str::FromStr;
use time::{format_description::well_known::Rfc3339, OffsetDateTime};

#[tokio::main]
async fn main() {
    let msg = r#"localhost:4361 wants you to sign in with your Ethereum account:
0x6Da01670d8fc844e736095918bbE11fE8D564163

SIWE Notepad Example

URI: https://127.0.0.1:4361
Version: 1
Chain ID: 1
Nonce: kEWepMt9knR6lWJ6A
Issued At: 2021-12-07T18:28:18.807Z"#;
    let message: Message = msg.parse().unwrap();
    let signature = <[u8; 65]>::from_hex(r#"6228b3ecd7bf2df018183aeab6b6f1db1e9f4e3cbe24560404112e25363540eb679934908143224d746bbb5e1aa65ab435684081f4dbb74a0fec57f98f40f5051c"#).unwrap();

    let verification_opts = VerificationOpts {
        domain: Some("localhost:4361".parse().unwrap()),
        nonce: Some("kEWepMt9knR6lWJ6A".into()),
        timestamp: Some(OffsetDateTime::parse("2021-12-08T00:00:00Z", &Rfc3339).unwrap()),
        ..Default::default()
    };

    if let Err(e) = message.verify(&signature, &verification_opts).await {
        // message cannot be correctly authenticated at this time
    }

    // do application-specific things
}

免责声明

我们用于以太坊登录的Rust库尚未经过正式的安全审计。我们欢迎对其实用性、架构和安全性的持续反馈。

另请参阅

依赖项

~6–21MB
~326K SLoC