一旦您使用先前讨论的方法之一将钱包实例化为解锁状态,您就可以使用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)?;
Signers
添加到交易构建器 输入中的每个已签名资源都需要具有指向有效见证的见证索引。更改输入中的见证索引将更改交易 ID。这意味着我们需要在最终签署交易之前设置所有见证索引。以前,用户需要确保见证人索引和见证人顺序是正确的。为了自动化这个过程,SDK 将跟踪交易构建器中的签名者,并自动解决最终交易。这是通过存储签名者直到最终交易构建完成来完成的。
以下是如何创建交易构建器并向其添加签名者的完整示例。
注意:当您向交易构建器添加
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())?;
如果您有一个已构建的交易,并且想要添加签名,您可以使用sign_with
方法。
tx.sign_with(&wallet, provider.chain_id()).await?;