区块链之公钥、私钥、地址之间的关系_weixin_33670713的博客-程序员信息网

技术标签: 区块链  

一句话解释公钥、私钥、地址
私钥:实际上是一组随机数,关于区块链中的 随机数我们已经介绍过了
公钥:对私钥进行椭圆曲线加密算法生成,但是无法通过公钥倒推得到私钥。公钥的作用是在和对方交易时,使用自己的私钥加密信息,然后对方使用自己的公钥解密获得原始信息,这个过程俗称签名。
地址:由于公钥太长,在交易中不方便使用,就对公钥哈希进行SHA256、RIPEMD160、Base58算法加密生成地址

具体过程:

  1. 首先使用随机数发生器生成一个『私钥』。后续的公钥、地址都会由私钥生成,所以一句话概括私钥的重要性:"谁掌握了私钥, 谁就掌握了该钱包的使用权!"
  2. 『私钥』经过椭圆曲线算法(SECP256K1)算法加密生成了'公钥'。这是一种非对称单向加密算法,知道私钥可以算出公钥,但知道公钥却无法反向算出私钥

  1. 『公钥』经过单向Hash算法(SHA256、RIPEMD160)生成『公钥Hash』
  2. 将一个字节的地址版本号连接到『公钥哈希』头部(对于比特币网络的pubkey地址,这一字节为“0”),然后对其进行两次SHA256运算,将结果的前4字节作为『公钥哈希』的校验值,连接在其尾部。
  3. 将上一步结果使用BASE58进行编码(比特币定制版本),就得到了『钱包地址』。

『私钥』『公钥』『钱包地址』间的关系
  在上述的五个步骤里只有“BASE58编码”有相应的可逆算法(“BASE58解码”),其他算法都是不可逆的,所以这些数据之间的关系可以表示为:

可以看出:通过『私钥』可以得到上述计算过程中所有的值。『公钥哈希』和『钱包地址』可以通过互逆运算进行转换,所以它们是等价的。

使用『私钥』对交易进行签名
比特币钱包间的转账是通过交易(Transaction)实现的。交易数据是由转出钱包『私钥』的所有者生成,也就是说有了『私钥』就可以花费该钱包的比特币余额。生成交易的过程如下:

  1. 交易的原始数据包括“转账数额”和“转入钱包地址”,但是仅有这些是不够的,因为无法证明交易的生成者对“转出钱包地址”余额有动用的权利。所以需要用『私钥』对原始数据进行签名。
  2. 生成“转出钱包公钥”,这一过程与生成『钱包地址』的第2步是一样的。
  3. 将“转出签名”和“转出公钥”添加到原始交易数据中,生成了正式的交易数据,这样它就可以被广播到比特币网络进行转账了。

使用『公钥』对签名进行验证

交易数据被广播到比特币网络后,节点会对这个交易数据进行检验,其中就包括对签名的校验。如果校验正确,那么这笔余额就成功地从“转出钱包”转移到“转入钱包”了。



欢迎订阅「K叔区块链」 - 专注于区块链技术学习

博客地址: http://www.jouypub.com
简书主页: https://www.jianshu.com/u/756c9c8ae984
segmentfault主页: https://segmentfault.com/blog/jouypub
腾讯云主页: https://cloud.tencent.com/developer/column/72548
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33670713/article/details/88751960

智能推荐

python: np.pad() 函数的用法_一颗行走的大白菜的博客-程序员信息网

在卷积神经网络中,为了避免因为卷积运算导致输出图像缩小和图像边缘信息丢失,常常采用图像边缘填充技术,即在图像四周边缘填充0,使得卷积运算后图像大小不会缩小,同时也不会丢失边缘和角落的信息。在Python的numpy库中,常常采用numpy.pad()进行填充操作,具体分析如下: 1. ...

函数式接口详解_洛 笙的博客-程序员信息网_合法的函数式接口

函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。函数式接口可以被隐式转换为 lambda 表达式。java1.8之前接口中只能写抽象的方法,但在java1.8后接口中可以写静态的方法,可以写default修饰的方法,对于函数式接口只要求只能有一个抽象方法必须被实现,而接口中可以声明default方法和静态方法,所以,不代表接口...

openshift启动失败_汀桦坞的博客-程序员信息网

问题描述:kube-apiserver自检没有通过,检查发现端口8443没有监听[[email protected] openshift]# oc cluster upGetting a Docker client ...Checking if image openshift/origin-control-plane:v3.11 is available ...Checking type...

宏基因组QIIME2专题讨论群_刘永鑫Adam的博客-程序员信息网

写在前面宏基因组公众号负责QIIME 2 官方中文文档的更新。目前已经有更新了14章,近8万字(详见下方文章列表链接)。鉴于QIIME 2的整体架构和使用方法与QIIME存在较大不同、QIIME 2仍存在一些不足,同时用户也积累了较多共性问题。现成立QIIME 2中文微信讨论群,方便真正使用者间的经验交流。扫描以下二维码。备注:姓名-单位-研究方向-职务-QIIME2,带你入QIIME 2...

VScode配置c++环境(MinGW安装教程)_朽木白露的博客-程序员信息网_mingw vscode

VScode配置C++环境需要安装MinGW编译器:安装MinGW下载可以下载这个:https://blog.csdn.net/shiaiao/article/details/90759813?utm_medium=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-1.nonecase&depth_1-utm_source=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-1

随便推点

再看SLA文档_李晓瑞_廊坊师范提高班十五期_新浪博客_李晓瑞的博客-程序员信息网

1.传统外语学习的误区?a)要有语言环境,多跟外国人交流,最好是能出国,不久自然就能会说了。b)学习外语要多记多背,也就是说是用记忆学语言。c)想纠正发音,一定要专听和模仿纯正的发音,比如BBC或VOA那种。d)要学习外语语法,如果语法熟练,说句子就正确了。e)...

关于GBase8s如何配置审计功能_狂躁的压皮的博客-程序员信息网

1、配置审计:a、通过gbasedbt用户登录操作系统,执行mkdir /opt/gbase8s/audit_logb、指定审计文件路径为/opt/gbase8s/audit_log,大小我256MBonaudit -p /opt/gbase8s/audit_log -s 256000000c、指定用户缺省下需要审计的事件(访问数据表,更新数据行,删除数据行,插入数据行)onaudit -a -u _default -e +ACTB,UPRW,DLRW,INRW 查看审计事件:

Python学习之Anaconda的使用及配置方法_leoe_的博客-程序员信息网

俗话说‘人生苦短,我有Python’,但是如果初学Python的过程中碰到包和Python版本的问题估计会让你再苦一会,我在学习Python的爬虫框架中看到看到了anaconda的介绍,简直是相见恨晚啊,我觉的每个Python的学习网站上首先都应该使用anaconda来进行教程,因为在实践的过程中光环境的各种报错就能消磨掉你所有的学习兴趣!下面简单的介绍下anaconda,它是将Python版本和许

[AS/Android Studio] Gradle Plugin Version 和 Gradle Version 的版本对应关系_米歪(MiWi)的博客-程序员信息网_android gradle plugin version

Android Gradle 插件版本说明在更新 Android Studio 时,您可能会收到一并将 Gradle更新为最新可用版本的提示。您可以选择接受该更新,也可以根据项目的构建要求手动指定版本。下表列出了各个 Android Gradle 插件版本所需的 Gradle 版本。为了获得最佳性能,您应使用 Gradle和插件这两者的最新版本。插件版本所需的 Gradle 版本1.0.0 - 1.1.32.2.1 - 2.31.2.0 - 1.3.12.2.1

发帖需要验证手机-解决办法_jiuqi88的博客-程序员信息网

1、使用手机版百度APP,搜索贴吧,点击进去发帖即可(不需要绑定手机和验证手机)2、使用微信小程序也可以实现贴吧发帖,搜索贴吧小程序进去发帖(不需要绑定手机和验证手机)3、贴吧极速版APP,发帖回帖不需要验证手机(方便)应用商城或者安卓市场,搜索‘’百度APP‘’应用下载安卓的APK名称是:手机百度。苹果商城APK名字是: 百度...

layerUI api_余茕然的博客-程序员信息网_layui的api

本文档主要针对layer1.9及以上版本,如果您项目中使用的是1.9之前的版本,请前往1.8.5文档页。我们提到的基础参数主要指调用方法时用到的配置项,如:layer.open({content: ''})layer.msg('', {time: 3})等,其中的content和time即是基础参数,以键值形式存在,基础参数可合理应用于任何层类型中,您不需要所有都去配置,大多数都是可选的。而其

推荐文章

热门文章

相关标签