跳到主要内容

生成签名

在应用中,会把很多的积分数据上传到链上,比如用户打游戏的积分,观看视频和广告的积分,点击互动的积分。如果把这些积分的输入简单作为智能合约里的函数输入参数,就可以被黑客很方便进行改动。

如果要控制只允许上传真实的数据,还需要在区块链上对数据进行验证。常规的流程是:

  1. 项目生成公钥和私钥,将公钥存储在智能合约上
  2. 当用户发起需要私钥签名的交易请求时,在服务器上查询数据,构建待验证签名,把输入参数和待验证签名构建成交易请求,发回给用户
  3. 用户收到包含待验证签名的交易信息,确认无误后,授权签署交易,将交易和用户对交易的签名发给应用
  4. 应用将用户的交易和对交易的签名发给全节点,调用智能合约函数
  5. 智能合约使用公钥对数据和签名进行验证,如果合法,就更新数据

由于私钥是保密的,只在项目团队手里,就不会被黑客团队更改区块链数据。

生成公钥私钥对

第二单元已经提供随机生成公钥私钥对的示例代码,为了方便教学演示,本单元都会导入相同的私钥。
** 在具体项目中,请另外再生成独立和保密的私钥,不要使用与本教程相同的私钥!!!

import { Ed25519Keypair } from "@mysten/sui/keypairs/ed25519";
import { fromHex, toHex } from "@mysten/sui/utils";

const secret_key = "9bf49a6a0755f953811fce125f2683d50429c3bb49e074147e0089a52eae155f"
const keypair = Ed25519Keypair.fromSecretKey(fromHex(secret_key));
console.log(keypair);

const address = keypair.toSuiAddress();
console.log(address);

其中,fromHex是将十六进制的私钥转为Uint8Array的格式。

本示例程序中,使用的私钥是 9bf49a6a0755f953811fce125f2683d50429c3bb49e074147e0089a52eae155f, 公钥是b9c6ee1630ef3e711144a648db06bbb2284f7274cfbee53ffcee503cc1a49200.

分别转为Uint8Array格式是
私钥[ 155, 244, 154, 106, 7, 85, 249, 83, 129, 31, 206, 18, 95, 38, 131, 213, 4, 41, 195, 187, 73, 224, 116, 20, 126, 0, 137, 165, 46, 174, 21, 95 ]
公钥[ 185, 198, 238, 22, 48, 239, 62, 113, 17, 68, 166, 72, 219, 6, 187, 178, 40, 79, 114, 116, 207, 190, 229, 63, 252, 238, 80, 60, 193, 164, 146, 0 ]

可以选择的加密算法除了ed25519还有很多,官方文档中还提供了更多示例,按需选择即可。

使用私钥对数据签名

Keypair数据结构自带了对信息签名的方法,传入的数据结构是Uint8Array格式。

async sign(data: Uint8Array) {
return nacl.sign.detached(data, this.keypair.secretKey);
}

示例程序中演示了如何使用导入的私钥来签署信息。

const msg = new Uint8Array([5, 6, 7]);
const signature = await keypair.sign(msg);
console.log(signature);

作业

使用TypeScript SDK生成随机的Keypair, 并且记录下其中一对公钥私钥。在本地导入私钥得到Keypair, 然后签署任意的信息。