Skip to main content

三种签名

在以太坊及其他区块链系统中,签名是确保交易和数据安全性、完整性和真实性的关键机制。不同的签名 API(如 signTransactionsignTypedDatasignBlobData)被设计用于不同的用例和数据类型。以下是这些 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);

3. signBlobData

目的

signBlobData API 用于签名任意的二进制数据(Blob Data)。这通常用于签名非结构化的数据或文件,以确保数据的完整性和真实性。

解决的问题

  • 数据完整性:确保任意二进制数据在传输过程中未被篡改。
  • 文件签名:允许对文件或其他非结构化数据进行签名。
  • 广泛适用性:适用于各种数据类型,不局限于交易或结构化数据。

示例

const blobData = new Uint8Array([
/* binary data */
]);

const signedBlob = signBlobData(blobData, privateKey);

总结

  • signTransaction:用于签名交易数据,确保交易的完整性、真实性和防篡改。
  • signTypedData:用于签名结构化数据,适用于复杂数据结构的签名,确保数据完整性和防止重放攻击。
  • signBlobData:用于签名任意二进制数据,适用于文件或非结构化数据的签名,确保数据的完整性和真实性。

每个 API 都有其特定的用例和适用场景,通过这些不同的签名方法,开发者可以确保各种数据类型在区块链系统中的安全性和完整性。