三种签名
在以太坊及其他区块链系统中,签名是确保交易和数据安全性、完整性和真实性的关键机制。不同的签名 API(如 signTransaction、signTypedData 和 signBlobData)被设计用于不同的用例和数据类型。以下是这些 API 的详细解释及其解决的问题:
1. signTransaction
目的
signTransaction API 用于签名交易数据。它通常用于用户在以太坊网络上发送交易时,确保交易数据的完整性和真实性。
解决的问题
- 交易验证:通过对交易数据进行签名,确保只有交易发起人才能生成有效的交易。
- 防篡改:签名后的交易数据无法被篡改,否则签名将失效。
- 身份验证:通过签名可以验证交易发起人的身份,防止未经授权的交易。
示例
const transaction = {
to: '0xRecipientAddress',
value: '1000000000000000000', // 1 ETH
gas: 21000,
gasPrice: '20000000000', // 20 Gwei
nonce: 0,
};
const signedTransaction = signTransaction(transaction, privateKey);
2. signTypedData
目的
signTypedData API 用于签名结构化数据(Typed Data)。这在以太坊中通常用于签名复杂的消息或数据结构,以确保数据的完整性和真实性。EIP-712 是一个常见的规范,用于定义结构化数据的签名格式。
解决的问题
- 数据完整性:确保结构化数据在传输过程中未被篡改。
- 复杂数据签名:允许签名复杂的数据结构,而不仅仅是简单的字符串或交易。
- 防止重放攻击:通过包含域(domain)和类型信息,确保签名仅在特定上下文中有效,防止重放攻击。
示例
const typedData = {
types: {
EIP712Domain: [
{ name: 'name', type: 'string' },
{ name: 'version', type: 'string' },
{ name: 'chainId', type: 'uint256' },
{ name: 'verifyingContract', type: 'address' },
],
Person: [
{ name: 'name', type: 'string' },
{ name: 'wallet', type: 'address' },
],
},
primaryType: 'Person',
domain: {
name: 'MyApp',
version: '1',
chainId: 1,
verifyingContract: '0xContractAddress',
},
message: {
name: 'Alice',
wallet: '0xWalletAddress',
},
};
const signedData = signTypedData(typedData, privateKey);