为什么要开一个区块链的系列?引用mixlab社区里的熊叔(ML94)的话:
“
如果把人比作手机,价值观、态度和习惯是这个操作系统底层,领域技能更像是系统上的app。技能不会的话装一个就好,如果大家有好的“app”,可以相互推荐,如果自己没有装这个“app”,也可以借别人的。
”
mixlab无界社区为大家提供了一个跨界的平台,不止于跨界人才的交流(人),更多的还有跨领域技能的指南(内容)。所以,开始会更新一些区块链技术的文章。
最近感受比较深的方法,分享给大家:
mix方法:不让概念限制想象力,更多地关注原理本身。当我们掌握了概念对应的原理本身,就可以跳出概念本身的限制,基于原理,自由创作我们想象中的产品。
接上一期数字签名与加密算法-上【mix指南之区块链】:
6 ECDSA
比特币采用的加密方案
比特币中使用的数字签名算法是椭圆曲线数字签名算法(Elliptic Curve Digital Signature Algorithm)或 ECDSA 。 ECDSA 是用于基于椭圆曲线私钥/公钥对的数字签名算法。
6.1 私钥和公钥
JS有个开源库:
https://github.com/indutny/elliptic
我们将使用这个 elliptic 的库,来实验。
区块链中的密钥分为公钥和私钥两种,是通过非对称加密算法生成的。 通过这种算法得到的密钥对能保证在世界范围内是唯一的。
公钥的主要作用:加密;验证签名。
私钥的主要作用:签名;解密。
特性:
通过私钥可以计算出公钥,反之则不行。
公钥加密:公钥加密的内容可以用私钥来解密——只有私钥持有者才能解密。
私钥签名:私钥签名的内容可以用公钥验证。公钥能验证的签名均可视为私钥持有人所签署。
有效的私钥是任何随机的32字节字符串,例如:
19f128debc1b9122da0635914488b208b829879cf13b3d6cac5d1260c0fd967c
一个有效的公钥是'04'与一个64字节的字符串连接,例如:
04bfcab8722991ae774db48f934ca79cfb7dd991229153b9f732ba5334aafcd8e7266e47076996b55a14bf9913ee3145ce0cfc1372ada8ada74bd287450313534a
6.2 ECDSA算法的使用
1)为用户A生成配对的公钥和私钥;
2)用户A对数据“hello mixlab”用私钥进行签名;
3)签名及数据“hello mixlab”保存在每个用户手上;
4)用户A用公钥证明其拥有数据“hello mixlab”。
代码语言:javascript复制var EC = elliptic.ec;
var ec = new EC('secp256k1');
//定义生成密钥的方法
function genKey() {
var key = ec.genKeyPair();
var private = key.getPrivate();
var public = key.getPublic();
var pub = public.encode('hex');
var pri = private.toJSON();
return {
public: pub,
private: pri,
sign: function (msg) {
var signature = key.sign(msg);
var derSign = signature.toDER('hex');
console.log('-------signature:', derSign, msg);
return derSign
}
}; };
//------生成密钥-------
var A = genKey();
console.log('-------public key:', A.public);
console.log('-------private key:', A.private);
//签名
var derSign = A.sign('hello mixlab');
//用公钥验证所有权
verify(A.public,'hello mixlab', derSign);
function verify(address, msg, signature) {
var ec = new EC('secp256k1');
var keyc = ec.keyFromPublic(address, 'hex');
var signature = signature;
var isVerify=keyc.verify(msg, signature);
console.log(isVerify);
return isVerify
};
6.3 ECDSA在交易上的应用
主要理解清楚以下几个概念:
6.3.1 交易地址
从一个随机数生成私钥,公钥可以从私钥中派生出来。公钥将被用作交易中加密货币的“接收者”(交易地址)。
6.3.2 区块的产生
如果我们能够首先证明我们拥有某些Block,我们就可以将Block里存储的交易数据代表的加密货币发送到收账人的地址(收账人的公钥地址),转账的过程就是交易,发起一个交易,产生一个新的Block。
在比特币的ECDSA算法的实现中,被签名的“消息”是交易中特定数据的哈希值。而交易就是存储在比特币区块链上的Block。
6.3.3 交易的结构
一个交易(Block)的组成包括:
交易的输入:UTXO 解锁脚本(签名、A的公钥)
交易的输出:锁定的UTXO 锁定脚本(B的公钥)
输出的UTXO被整个网络识别,所有者可在未来的交易中使用它们。
6.3.4 UTXO
比特币中,实际上没有“余额”的概念,只有 “未花费的交易输出”(unspent transaction outputs),即UTXO。当用户的钱包已经“收到”比特币时,本质上是,钱包已经检测到了可用的UTXO。通过钱包所控制的个人私钥,我们可以把这些UTXO花出去。 因此,用户的比特币“余额”是指用户钱包中可用的UTXO总和,而UTXO可能分散在数百个交易的区块中。
那么如何证明我们拥有某些Block?举比特币的例子,一个比特币地址中的所有资金的控制取决于相应私钥的所有权和控制权。
以简化版的数字币为例,若A想要向B转账1个数字币,交易流程如图所示:
1)B把交易地址(B的公钥)发送给A;
2)A查询其所拥有的区块(交易),用私钥解锁,生成签名写入交易的输入;
3)A生成交易申请,在交易输出中锁定1个数字币,并写入B的交易地址,然后向整个网络中的所有节点发出申请信息(发送区块);
4)然后,所有节点都将获得此交易的区块数据,并进行验证;
5)最快验证成功的节点,立即向整个网络公告;
6)最后,在网络中所有节点验证此区块(交易)通过后,此次交易最终完成,形成一条合法的记录。
可见,整个数字币交易流程是完全透明、公开,且只有在整个网络达成共识的前提下,才能完成最终的记账。
7 用户体验设计
从密码学、加密算法,比特币采用的ECDSA算法,公钥与私钥、交易这些技术,有一些用户体验设计的思考,分享给大家:
7.1 私钥储存的重要性
采用非对称加密算法生成公钥及私钥,应用于区块链中,用户需要保留好自己的私钥,尤其是比特币系统中,私钥就代表着拥有的数字币资产数,如果私钥丢失,将无法恢复,不像我们传统的密码形式,可以通过各种手段重置。
用户体验设计需要考虑在适当的地方提示用户注意保留私钥,及安全性。或者思考新的一种存储方式,安全而又方便的形式。
7.2 区块链链式存储的理念传达
区块链的交互流程也区别于我们所理解的“钱包”的概念,因为账户的余额不是单独记录在某条数据里的,而是化解在一笔笔交易之中,如果传达技术概念给普通用户,需要设计师好好考虑。我们可以参考浏览器中对于https地址都有个小锁的标志,一种细微的提示。
7.3 公钥地址的可理解/可阅读性设计
因为区块链的公钥地址是一串毫无规律的字符串,普通用户很难对此有深刻的理解。UX设计需要考虑如果转化为一种阅读性更强的形式展示给用户,然而现在并没有很好的设计,也许二维码的形式是一种方式。
参考资料:
百度百科
维基百科
Github
https://github.com/bitcoin/bitcoin