比特币的加密(秘钥、地址、脚本验证)

秘钥生成和作用

  1. 私钥
  • 私钥是一个256位的2进制随机数,可以取从0到2²⁵⁶-1之间的任意值
  • 私钥可以根据不同的编码标准,生成不同编码的私钥格式,不同格式之间可以相互转换(Raw、WIF、WIF-compressed)
  • 私钥生成公钥,所以根据私钥是可以推导出公钥的,但是公钥不能推出私钥
  • 私钥用来生成数字签名用的
  1. 公钥
  • 对私钥进行椭圆曲线加密处理,得到的公钥
  • 公钥在交易的时候:P2PKH的账户之间交易,scriptSig里面需要有公钥信息,用来解锁output,因为output里面有 pubkHASH
  • 公钥用来不可逆的生成公钥哈希
  1. 公钥哈希值
  • 公钥哈希值=RIMPED160(SHA256(公钥))
  • 为了保护公钥,所以有pubkHash的概念,用在output.scriptPubKey的脚本里面,作为收款人的地址
  • 公钥哈希值可以根据不同的编码方式,生成不同的地址,编码方式不同,交易的锁定脚本和解锁脚本不同

Address

https://en.bitcoin.it/wiki/Address

image

  1. 根据地址的生成算法不同,有3种类型的地址算法,和对应的开头: 1、3、bc1
    There are currently three address formats in use:
  • P2PKH which begin with the number 1, eg: 1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2.
  • P2SH type starting with the number 3, eg: 3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy.
  • Bech32 type starting with bc1, eg: bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq.
  1. 比特币地址是一串由字母和数字组成的26-35位字符串,看起来有些像乱码,长短不同时因为前置的0,被省略了
  2. 比特币用户和比特币地址是一对多的关系,一个用户可以生成多个比特币地址(甚至可以离线生成),但是一个比特币地址只指向一个用户。
  3. 不同算法的scriptPubKey不同

P2PKH地址的生成方式

https://www.cnblogs.com/zhaoweiwei/p/address.html
生成方式:

  1. 计算出pubKeyHash:公钥哈希值=RIMPED160(SHA256(公钥))
  2. 计算出校验码:校验码=前四字节(SHA256(SHA256(000+公钥哈希值))) 如比特币主网版本号“0x00"
  3. 最后计算出Address: 比特币地址=1+Base58(0+公钥哈希值+校验码) //16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM

P2PKH的交易脚本

  • scriptPubKey: OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
  • scriptSig: <sig> <pubKey>

举个真实的例子:
ScriptSig:
PUSHDATA(72)[3045022100f8df16671995baaecab5a8d91fc3c78f22c156918cefb90dd1092fcd8578567d022041395667d7e99d131bffcb908904a2417cfb74b46df8bded2517a02beda0279701] PUSHDATA(33)
[021fc349da71680b2482e4c307adbd7aa2fc16d2cd564843ab873a8efff748d87b]

这里面的一个scriptSig由2部分组成,第一部分是签名,第二部分是公钥,PUSHDATA(N),表示要压入栈顶的byte,1个byte表示2个字符,PUSHDATA(72)表示压入144个字符

Output Scripts
HASH160 PUSHDATA(20)[d3ecd0e0d42d4b617767d9d1b966216c77ebb513] EQUAL
DUP HASH160 PUSHDATA(20)[7c45023433aea27b48251d4c5a52b1d73caba74e] EQUALVERIFY CHECKSIG

第二个找零output地址因为是P2PKH开头的,所以格式和描述的一样

Pay-to-Script-Hash

https://www.hibtc.org/2428.html
结合多重签名一起使用
scriptSig: ..signatures... <serialized script>
scriptPubKey: OP_HASH160 <scriptHash> OP_EQUAL

表示一共有n个参与方,只要有m个参与方同意了这笔交易,则这笔交易就生效了,具体的规则是通过scriptHash里面的脚本内容决定的
m-of-n multi-signature transaction:
scriptSig: 0 <sig1> ... <script>
script: OP_m <pubKey1> ... OP_n OP_CHECKMULTISIG

ScriptSig:
0[] PUSHDATA(72)[30450221009b37b97eb11341a5fa69d191312df12a41449cf922dbf8e72e93eb6ca7515cb60220759126a28f69525903da3e79e873c59ee7355b6a4874eed06ed6f616712ee51201] PUSHDATA(71)[304402202da30a860b7a2ee3cf614aae2ae8fb5a75de3ea9d5274701ef0ceebc94f75801022063155b788bfb7cada4e8050992b23340d9324306fbd6a201a169ff4a676ea9d701] PUSHDATA1[52210246ccf4de0c54cc7f3354cdd993c2c50cf965fd82238b89659fbd73a1b4bf05a121024fc59f72272a897fe43803374969f396058152fe4765a8d15216f94624257b1b21022593bc69ecbf3bbcc3c58082267cb49dadaf4ca8dbf1b2297338a9d628c4297653ae]

HASH160 PUSHDATA(20)[d3ecd0e0d42d4b617767d9d1b966216c77ebb513] EQUAL

结合P2SH的新特征

  1. 多重签名
    多重签名是一种允许多个公钥共同签署一笔比特币交易的技术。比如说,使用多重签名技术,爱丽丝,鲍勃和查理可以共同监管一个比特币,这样,要动用该比特币,至少需要他们之中的两个人的同意。
  • 比如类似于淘宝、京东这种中间商平台介入的平台, 实现2-3的支付模式
  • 防止单方擅用资产,2-2的模式,只有2方同时同意才可以动用资产
  1. 延迟交易
    新的支付方式允许交易输出在未来的某个时间点之前不可使用,OP_CHECKLOCKTIMEVERIFY

P2PKH账户的交易认证

https://en.bitcoin.it/wiki/Transaction
目前比特币支持两种类型的交易:Pay-to-PubkeyHash、Pay-to-Script-Hash

  • txid
  • Input[] inputs
  • Output[] outputs
  1. Input的构成
  • preTxid (该笔余额的来源交易hash)
  • index(属于该笔交易的output[]下标)
  • scriptSig (<sig> <pubk>)(用秘钥生成的签名信息,和自己的公钥信息)
  1. Output的构成
  • value
  • scriptPubKey (pubkHash)

验证一笔P2PKH交易的一个输入是否合法:

  1. 先遍历,根据每个Input的 Previous tx和Index,找到这笔input的输出来源为哪笔交易的哪个输出。
  2. 并且把input的scriptSig ,pubkey 按照顺序入栈
  3. 首先执行OP_DUP,这条指令是把栈顶元素pubkey 复制一份(scriptSig ,pubkey,pubkey)
  4. 紧接着执行OP_HASH160,表示对栈顶进行SHA256/RipeMD160,实际就是计算公钥hash:(scriptSig ,pubkey,pubkeyHash)
  5. 然后下一条是直接把数据46af3fb4…6829入栈(也就是对应output里面的 pubkHash)
  6. 然后执行OP_EQUALVERIFY,比较栈顶两个元素是否相等,如果不相等,整个脚本就执行失败
  7. 如果成功:最后执行OP_CHECKSIG栈顶两个元素进行签名校验,如果相等,出栈返回成功

总结:先验证这笔output是不是属于该用户,再验证该用户的签名是否有效

参考:
https://blog.csdn.net/jerry81333/article/details/56824166

初级版的比特币交易
https://www.jianshu.com/p/a57795ec562c

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容