⌘K

Icon Link签名

一旦您使用先前讨论的方法之一将钱包实例化为解锁状态,您就可以使用wallet.sign来签署消息。以下是如何签署和恢复消息的完整示例。

let mut rng = StdRng::seed_from_u64(2322u64);
let mut secret_seed = [0u8; 32];
rng.fill_bytes(&mut secret_seed);
 
let secret = secret_seed.as_slice().try_into()?;
 
// Create a wallet using the private key created above.
let wallet = WalletUnlocked::new_from_private_key(secret, None);
 
let message = Message::new("my message".as_bytes());
let signature = wallet.sign(message).await?;
 
// Check if signature is what we expect it to be
assert_eq!(signature, Signature::from_str("0x8eeb238db1adea4152644f1cd827b552dfa9ab3f4939718bb45ca476d167c6512a656f4d4c7356bfb9561b14448c230c6e7e4bd781df5ee9e5999faa6495163d")?);
 
// Recover address that signed the message
let recovered_address = signature.recover(&message)?;
 
assert_eq!(wallet.address().hash(), recovered_address.hash());
 
// Verify signature
signature.verify(&recovered_address, &message)?;

Icon LinkSigners添加到交易构建器

输入中的每个已签名资源都需要具有指向有效见证的见证索引。更改输入中的见证索引将更改交易 ID。这意味着我们需要在最终签署交易之前设置所有见证索引。以前,用户需要确保见证人索引和见证人顺序是正确的。为了自动化这个过程,SDK 将跟踪交易构建器中的签名者,并自动解决最终交易。这是通过存储签名者直到最终交易构建完成来完成的。

以下是如何创建交易构建器并向其添加签名者的完整示例。

Icon InfoCircle

注意:当您向交易构建器添加Signer时,签名者将存储在其中,并且直到您调用build()才会解析交易!

let secret = SecretKey::from_str(
    "5f70feeff1f229e4a95e1056e8b4d80d0b24b565674860cc213bdb07127ce1b1",
)?;
let wallet = WalletUnlocked::new_from_private_key(secret, None);
 
// Set up a transaction
let mut tb = {
    let input_coin = Input::ResourceSigned {
        resource: CoinType::Coin(Coin {
            amount: 10000000,
            owner: wallet.address().clone(),
            ..Default::default()
        }),
    };
 
    let output_coin = Output::coin(
        Address::from_str(
            "0xc7862855b418ba8f58878db434b21053a61a2025209889cc115989e8040ff077",
        )?,
        1,
        Default::default(),
    );
 
    ScriptTransactionBuilder::prepare_transfer(
        vec![input_coin],
        vec![output_coin],
        Default::default(),
    )
};
 
// Add `Signer` to the transaction builder
tb.add_signer(wallet.clone())?;

Icon Link对已构建的交易进行签名

如果您有一个已构建的交易,并且想要添加签名,您可以使用sign_with方法。

tx.sign_with(&wallet, provider.chain_id()).await?;