用Go 构建一个区块链 -- Part 5: 地址
链客,专为开发者而生,有问必答!
此文章来自链客区块链技术问答社区,未经允许拒绝转载。
比特币地址
这就是一个真实的比特币地址:1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa。这是史上第一个比特币地址,据说属于中本聪。比特币地址是完全公开的,如果你想要给某个人发送币,只需要知道他的地址就可以了。但是,地址(尽管地址也是独一无二的)并不是用来证明你是一个“钱包”所有者的信物。实际上,所谓的地址,只不过是将公钥表示成人类可读的形式而已,因为原生的公钥人类很难阅读。在比特币中,你的身份(identity)就是一对(或者多对)保存在你的电脑(或者你能够获取到的地方)上的公钥(public key)和私钥(private key)。比特币基于一些加密算法的组合来创建这些密钥,并且保证了在这个世界上没有其他人能够取走你的币,除非拿到你的密钥。下面,让我们来讨论一下这些算法到底是什么。
公钥加密
公钥加密(public-key cryptography)算法使用的是成对的密钥:公钥和私钥。公钥并不是敏感信息,可以告诉其他人。但是,私钥绝对不能告诉其他人:只有所有者(owner)才能知道私钥,能够识别,鉴定和证明所有者身份的就是私钥。在加密货币的世界中,你的私钥代表的就是你,私钥就是一切。
本质上,比特币钱包也只不过是这样的密钥对而已。当你安装一个钱包应用,或是使用一个比特币客户端来生成一个新地址时,它就会为你生成一对密钥。在比特币中,谁拥有了私钥,谁就可以控制所以发送到这个公钥的币。
私钥和公钥只不过是随机的字节序列,因此它们无法在屏幕上打印,人类也无法通过肉眼去读取。这就是为什么比特币使用了一个转换算法,将公钥转化为一个人类可读的字符串(也就是我们看到的地址)。
如果你用过比特币钱包应用,很可能它会为你生成一个助记符。这样的助记符可以用来替代私钥,并且可以被用于生成私钥。BIP-039 已经实现了这个机制。
好了,现在我们已经知道了在比特币中证明用户身份的是私钥。那么,比特币如何检查交易输出(和存储在里面的币)的所有权呢?
数字签名
在数学和密码学中,有一个数字签名(digital signature)的概念,算法可以保证:
当数据从发送方传送到接收方时,数据不会被修改;
数据由某一确定的发送方创建;
发送方无法否认发送过数据这一事实。
通过在数据上应用签名算法(也就是对数据进行签名),你就可以得到一个签名,这个签名晚些时候会被验证。生成数字签名需要一个私钥,而验证签名需要一个公钥。签名有点类似于印章,比方说我做了一幅画,完了用印章一盖,就说明了这幅画是我的作品。给数据生成签名,就是给数据盖了章。
为了对数据进行签名,我们需要下面两样东西:
1.要签名的数据
2.私钥
应用签名算法可以生成一个签名,并且这个签名会被存储在交易输入中。为了对一个签名进行验证,我们需要以下三样东西:
1.被签名的数据
2.签名
3.公钥
简单来说,验证过程可以被描述为:检查签名是由被签名数据加上私钥得来,并且公钥恰好是由该私钥生成。
用Go 构建一个区块链 -- Part 5: 地址相关推荐
- 用 Go 构建一个区块链 -- Part 5: 地址
翻译的系列文章我已经放到了 GitHub 上:blockchain-tutorial,后续如有更新都会在 GitHub 上,可能就不在这里同步了.如果想直接运行代码,也可以 clone GitHub ...
- 用 Go 构建一个区块链 -- Part 5: 地址 1
想知道更多关于区块链技术知识,请百度[链客区块链技术问答社区] 链客,有问必答!! 比特币地址 这就是一个真实的比特币地址:1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa.这是史 ...
- 通过python构建一个区块链来学习区块链
了解区块链Blockchains如何工作的最快方法就是构建一个区块链.你来到这里是因为,和我一样,你对加密钱币的崛起感到很兴奋.而且你想知道区块链是如何工作的,想了解它们背后的基本技术. 但理解区块链 ...
- php构建一个区块链(含源码)
php构建一个区块链(含源码) 我们要用PHP编程语言构建区块链,区块链本身就是一个非常简单的概念,它是一个非常简单的数据结构,数字货币是很复杂,但区块链不是,它们复杂的原因是共识算法,挖矿机制和运行 ...
- 用 Go 构建一个区块链 -- Part 7: 网络
翻译的系列文章我已经放到了 GitHub 上:blockchain-tutorial,后续如有更新都会在 GitHub 上,可能就不在这里同步了.如果想直接运行代码,也可以 clone GitHub ...
- 用 Go 构建一个区块链 -- Part 6: 交易(2)
翻译的系列文章我已经放到了 GitHub 上:blockchain-tutorial,后续如有更新都会在 GitHub 上,可能就不在这里同步了.如果想直接运行代码,也可以 clone GitHub ...
- 用 Go 构建一个区块链 -- Part 3: 持久化和命令行接口
翻译的系列文章我已经放到了 GitHub 上:blockchain-tutorial,后续如有更新都会在 GitHub 上,可能就不在这里同步了.如果想直接运行代码,也可以 clone GitHub ...
- 用 Go 构建一个区块链 ---- Part 1: 基本原型
翻译的系列文章我已经放到了 GitHub 上:blockchain-tutorial,后续如有更新都会在 GitHub 上,可能就不在这里同步了.如果想直接运行代码,也可以 clone GitHub ...
- 用 Go 构建一个区块链 -- Part 1: 基本原型
引言 区块链是 21 世纪最具革命性的技术之一,它仍然处于不断成长的阶段,而且还有很多潜力尚未显现出来. 本质上,区块链只是一个分布式数据库而已. 不过,使它独一无二的是,区块链是一个公开的数据库,而 ...
最新文章
- Centos7 上安装 redis5.0.5
- Android的一个关于Activity和UI的小程序
- FAGLFLEXA 表和 BSEG 表有什么区别
- [云炬创业基础笔记]第九章企业的法律形态测试4
- JZOJ__Day 3:【NOIP普及模拟】数数(count)
- J2EE从头开始__EJB3
- 【SpringBoot的坑】Restful请求报错Request method 'POST' not supported,HiddenHttpMethodFilter无法将POST转换为PUT原因分析
- mysql查看binlog_MySQL的binlog数据如何查看
- ggeditor推动_谁推动了特殊招聘的文化?
- jQuery LigerUI 使用教程表格篇(1)
- 苹果或将推中国特色版iPhone 削掉了Face ID改用屏幕指纹
- [VBA]VBA编写的时光倒流软件
- 上传项目源码至Nexus私服
- 为什么要学习现代控制理论(机器人方向)?
- 2021年全国省市区街道代码自动同步(包含解决方案)
- 非服务器模式下运行getImageData函数出现 the operation is insecure
- godaddy域名转入步骤
- 计算机基础知识 pdf答案,计算机基础知识试题及答案(一).pdf
- 考过证券从业资格证的朋友们用的什么APP呢?
- python简易爬虫获取A股上证所有股票历史数据
热门文章
- 用Java中的HashSet写一个学生管理系统(添加、删除、修改、查询学生信息)
- Java中父类构造方法对子类构造方法的影响(不是一句话可以说清的)
- switch的case使用数组C语言,使用常量数组的元素作为switch语句中的case
- 办公室自动化系统_信息化管理建设 公司办公室用自动盖章机贵吗?
- 【系列】EOS开发3 EOS提供的程序和工具
- bzoj 4025 二分图——线段树分治+LCT
- RN Exception: Before building your project, you need to accept the license agreements and comp le...
- PHP如何更好的利用PHPstorm的自动提示
- Redis主从复制配置
- 破解CentOS的root密码(救援模式无密码)