前
这次的一个period是基于《Nodejs区块链开发》这本书的的区块链项目–亿书,的源码学习笔记
EbookCoin项目地址
签名
简介
现实中的签名是有法律效益的,每个人的签名痕迹都是独一无二的,所以签名是用来证明这个东西是否和你相关的最好的东西。在现在的数字时代,签名一样是必不可少的而且是是数字化的。…又啰嗦了好多。
所以在区块链上,的数字资产的证明,一样是离不开数字签名的,当然在拓展需求的情况下还存在着多重签名。
数字签名技术,来自于 PKI 体系下的东西。我把某一数据的摘要值,使用我的私钥进行加密,接收方拥有我的公钥,即可以进行验证,对其加密摘要进行解密,之后与原文的同类型摘要进行对比,对比一致,就可以证明,数据没有被修改,且数据源是正确的发送方。这样就像等于对数据进行了签名。其具体的实现,在网上找了链接。
数字签名原理及其应用-CSDN
数字签名、数字证书关系-知乎
前面我们讲了,在区块链的世界,一切的操作或多或少都离不开交易,那么如果我要转账操作,那么如何说明这个操作是合法的呢?这里就是数字签名在区块链里的作用,进行交易广播的签名, 这样大家都知道和认为,这个交易是合法的。
文件包含
实现签名操作的模块如下
- ./modules/signatures.js
- ./modules/multisignatures.js
signatures.js 实现了对交易进行签名的功能
multisignatures.js 如其名曰,实现了消息的多重签名的功能。
代码实现
-
API
实现外部功能,就少不了API接口,一样的是对EXPRESS框架的拓展
router.map(shared, { "get /fee": "getFee", "put /": "addSignature"});library.network.app.use('/api/signatures', router);
得到的路由接口的对应关系是
get /api/signatures/fee -> getFeeput /api/signatures/ -> addSignature
-
添加签名
签名的添加在文中实现的代码如下。不知为何这个功能在整个项目中是只是留出了接口,而且和原本想想的作用不是十分一致。shared.addSignature = function (req, cb) { var body = req.body; library.scheme.validate(body, { type: "object", ... // 合法性检验 }, required: ["secret", "secondSecret"] }, function (err) { if (err) { return cb(err[0].message); } ... // 密码检测部分,签名出现多次 library.balancesSequence.add(function (cb) { // 多重签名判断 if (body.multisigAccountPublicKey && body.multisigAccountPublicKey != keypair.publicKey.toString('hex')) { modules.accounts.getAccount({publicKey: body.multisigAccountPublicKey}, function (err, account) { ... // 合法性检验 modules.accounts.getAccount({publicKey: keypair.publicKey}, function (err, requester) { if (err) { return cb(err.toString()); } ... // 合法性检验 var secondHash = crypto.createHash('sha256').update(body.secondSecret, 'utf8').digest(); var secondKeypair = ed.MakeKeypair(secondHash); ... // }); }); } else { modules.accounts.getAccount({publicKey: keypair.publicKey.toString('hex')}, function (err, account) { if (err) { return cb(err.toString()); } ... // 合法性检验 var secondHash = crypto.createHash('sha256').update(body.secondSecret, 'utf8').digest(); var secondKeypair = ed.MakeKeypair(secondHash); try { var transaction = library.logic.transaction.create({ type: TransactionTypes.SIGNATURE, sender: account, keypair: keypair, secondKeypair: secondKeypair }); } catch (e) { return cb(e.toString()); } modules.transactions.receiveTransactions([transaction], cb); }); } }, function (err, transaction) { if (err) { return cb(err.toString()); } cb(null, {transaction: transaction[0]}); }); });}
代码的实现,实际上是创建了一个是签名类型的交易。感觉在此处的功能可能不是那么完整。这里又secondSecret,像是注册了第二密码。实际上在书中所描述的,是亿书的支付密码功能。
-
多重签名
简单的理解来说,就好比一个文件需要几个人一起签名了之后才会生效,这个就是所谓的多重签名。就像是核弹的发射按钮一样,需要多个授权码才可以进行操作。
完成应用的场景,我们可以设想成我们常见的担保交易。AB之间的交易,需要C进行担保,所以先A签名,B签名,确认之后C进行签名,使得交易有效,即可实现功能
所以,多重签名的应用场景,在于 电子商务,财产分割,资金管理。
router.map(shared, { "get /pending": "pending", // Get pending transactions "post /sign": "sign", // Sign transaction "put /": "addMultisignature", // Add multisignature "get /accounts": "getAccounts"});library.network.app.use('/api/multisignatures', router);
多重签名其对应着自己的一套独立的API。,一样的格式,实现组建功能的拓展
required: ['min', 'lifetime', 'keysgroup', 'secret']
这里是多重签名所需要的参数。
后
实际上,这一部分的源码,感觉也只是从概念上再次理解了签名的实现。不过,这里的源码实现的方式可能和心中想的不太一样,
个人认为,签名是一个交易所必须的部分,因为这样才能证明交易的发起者,是正确的账户所有者。在文章所示的代码中,只是进行账户认证后,生成了secondKeypair。并没有实际上的使用其 prikey 对数据进行加密的部分 weird。可能具体细节是在交易里面实现的。