生成签名
在应用中,会把很多的积分数据上传到链上,比如用户打游戏的积分,观看视频和广告的积分,点击互动的积分。如果把这些积分的输入简单作为智能合约里的函数输入参数,就可以被黑客很方便进行改动。
如果要控制只允许上传真实的数据,还需要在区块链上对数据进行验证。常规的流程是:
- 项目生成公钥和私钥,将公钥存储在智能合约上
- 当用户发起需要私钥签名的交易请求时,在服务器上查询数据,构建待验证签名,把输入参数和待验证签名构建成交易请求,发回给用户
- 用户收到包含待验证签名的交易信息,确认无误后,授权签署交易,将交易和用户对交易的签名发给应用
- 应用将用户的交易和对交易的签名发给全节点,调用智能合约函数
- 智能合约使用公钥对数据和签名进行验证,如果合法,就更新数据
由于私钥是保密的,只在项目团队手里,就不会被黑客团队更改区块链数据。
生成公钥私钥对
在第二单元已经提供随机生成公钥私钥对的示例代码,为了方便教学演示,本单元都会导入相同的私钥。
** 在具体项目中,请另外再生成独立和保密的私钥,不要使用与本教程相同的私钥!!!
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
, 然后签署任意的信息。