比特币签名和签名脚本
❶ 比特币开发者指南(二)续--- P2PKH脚本验证和P2SH脚本
验证过程需要对签名脚本和公钥脚本进行求值,在P2PKH 输出中,公钥脚本的格式是盯戚:
发送方的签名脚本被解析作为整个脚本的头部。在P2PKH交易中,签名脚本包含了一个secp256k1的签名,和完整的公钥,这样和上面的公钥脚本连在一起就创建了完整的脚本
脚本语言是一个基于栈的、故意被设计成无状态、非图灵完备的语言。无状态确保交易一旦被放到区块链上,就不会出现输出永远不能被花费的情况。非图灵完备陵笑(缺少循环和goto语句)让脚本语言更加灵活(flexible)和可预见,大大简化了安全模型。
为了测试交易是否有效,签名脚本和公钥脚本的操作逐语句执行,从Bob的签凯汪陵名脚本开始直到Alice的公钥脚本。下面的图展示了脚本的执行过程。
公钥脚本由发送方创建,发送方并不在乎公钥脚本是干嘛用的。接收方很关心公钥脚本,如果他们想,会让发送方使用一个特殊的公钥脚本。不幸的是,一般的公钥脚本不像比特币地址那样简单,而且在不同的程序之间无法互通(在BIP70支付协议实现之前)。
为了解决这个问题,pay-to-script-hash(P@SH)交易在2012念的时候被创建。它允许用户创建一个公钥脚本,这个公钥脚本包含第二个脚本的哈希和回收脚本的。
基本的P2SH工作流如下图所示,看起来几乎和P2PKH的工作流一样。Bob创建一个回收脚本,然后进行哈希,并且将回收脚本给Alice,Alice创建一个P2SH-style输出用于包含Bob的回收脚本。
当Bob需要花那个输出中的钱的时候,他在他的签名脚本中包含回收脚本和他的签名。P2P网络确保完整的回收脚本的哈希和Alice在他的输出中所给出的一致。然后执行回收脚本,执行成功就允许Bob花费那个输出,否则执行失败。
回收脚本的哈希和公钥脚本的哈希有同样的功能---因此只需要通过一点点改动,它也可以被转换成标准的比特币地址。这是的搜集P2SH风格的地址和P2PKH风格的一样简单。哈希同样可以隐藏哈希的具体内容,所以P2SH脚本和P2PKH脚本一样安全。
❷ 脚本解锁订阅原理
脚本解锁是一个“解决”或满足被锁定脚本在一个输出上设定的花费条件的脚本,同时它将允许输出被消费。解锁脚本是每一笔比特币交易输出的一部分,而且往往含有一个被用户的比特币钱包(通过用户的私钥)生成的数字签名。由于解锁脚本常常包含一个数字签名,因此它曾被称作ScriptSig。在大多数比特币应用的源代码中,ScriptSig便是我们所说的解锁脚本。考虑到更宽泛的锁定脚本要求,在本书中,我们将它称为“解锁脚本”。但并非所有解锁脚本都一定会包含签名
❸ 比特股的交易
比特股X认识到,当所有的交易数据都在使用同样的脚本时,那么保持脚本语言的灵活性是不必要的。
在比特币的案例中,脚本语言的使用是受限的,因此我们无法使用比特币的交易脚本来创建比特股X的交易宣告数据。
因此,定义了一套包含七种宣告条件的交易类型:
以签名宣告
在交易数据输出时,允许持有人签名进行宣告。
这就跟标准的比特币交易输出脚本一样。
以M分之N的签名宣告
在交易数据输出时,允许M位持有者当中的N位签名进行宣告。
这就像是比特币的多重签名交易输出。
以买单宣告
在特定的资产已经以指定的价位支付给买家之下,允许输出执行支付。
一笔买单可以被部份达成,只要同时产生一个包含了变更的买单即可。
买单只能够在新的区块依照市场撮和算法产生时,以其他的买单宣告、做多宣告、平仓宣告的交易输出等明确的方式来进行撮和。
一项买单宣告的交易输出也可以经由买家的签名进行支付,此情形下买家可以取消挂单。
以做多宣告
当有人在某个价位做空 (以平仓宣告)时,允许此类交易输出宣告。
空头头寸必须和另一个铸造了等量的新BitUSD以签名宣告的交易输出相契合。
这种交易输出也可以经由其持有者签名进行支付,此情形下该持有者可以取消挂单。
以平仓宣告
允许从为空仓背书的抵押金中收取费用,该费用应与同一笔交易当中所销毁的BitUSD成相应比例。
BitUSD的销毁方式是将其包含在交易输入数据中,但是不包含在交易输出数据中达成的。
这笔交易输出只能够经由持有者补平,除非该输出是被用于包含在挂单撮和算法中作为追加保证金的一部分。
以期权执行宣告
在设定的日期之前,将期权买方将指定金额付给期权卖方的情况下,允许交易输出进行支付。
在设定的日期之后,交易输出只能由期权卖方来宣告。
以密码宣告
用于跨链交易,在以下两种情况下允许交易输出执行支付: 提供两组签名或是一组签名和一组密码。
交易费用被设定为需支付的每字节数据对应BTSX的价格。
简誉伍单地说,交易费用即是市场执行订单撮和算法所收取的费用。
确切的交易费用根据每一笔挂单金额而有所变动。
关于具体的交易费用,我们计划在比特股X已经运营一段时间并获得一些历史数据后再做公布。
要寻求更详细的解释请参见后面的“订单撮和算法”部分。
制定受托人销毁比率以实现盈利
比特股X将比特股X视为一个分布式自治公司(DAC)并寻求盈利。
因此它应当为持股人赚取利润。
盈利的实现,除了依靠股份市值的增长之外,还可以借由制定销毁比率来销毁交易费用实现。
在经济学角度上看,减少BTSX的供应量就如同将交易费用成比例以分红的形式发给所有BTSX持股人。
虽比特股X会把用户的BTSX的余额占总流通量的多寡按百分比进行显示,因此会看到余额会随着产块的过程逐渐增加。
当用户花费BTSX时,用户界面在交易发生之前将显示的占百分比换算回真实的股份数量,然后再发送到区块链上。
比特股X使用了非传统的挂单撮和算法。
传统的挂单撮和算法选择提供给买家所要求的最少数量,有时会多一些,而比特股X的撮合算法将总是提供给买家所要求恰好的数量。
如果出现最高买入价大于最低卖出价的情况时 – 其差额将会被系统收取为手续费。
在比特股X当中买家和卖家没有本质的区别,因为一个用美元购入BTSX的人和用BTSX购入美元的人没有分别。
双方的交易都在各自指定的价位上成交,而非双方使用了共同的价格。
其差额会被系统留存作为手续费。
比特股挂单撮和算法
采用这种算法的原因是为了惩罚那些想要制造大量挂单操纵单边市场的人,因为在此算法之下手续费的数目将会随着挂单的数量成比例地增加。
这项设计是为了增强基于价值的投资而非纯技术流的交易。
我们预期这将会减低市场波动性以及流动性,因为扰乱式的交易被移除了。
市场的参与者们对自燃源己的挂单能够精准成交应该不会有抱怨,这样一来大家只会理性地以他们认为合理的方式下单。
在开市并创建第一个比特资产之前,应该先以共识价格建立最小的市场深度。
相关的规则正在庆段或评估中,目前的设计是这样的:
· 撮合所有的空单和多单 – 这将消除重叠挂单并建立一个初始的买/卖散布单。
· 核算参考价格 – 计算剩余的最高买入价以及最低的卖出价得出平均值。
· 验证+/-15%参考价格以内的市场深度 – 当买入以及卖出的量超过了最小临界值,称之为开放深度,交易将会被允许并正式开始。
藉由触发市场需求或是买下所有挂单的行为可能会造成操纵市场攻击并破坏市场的情况发生。
为此,当+/-15%参考价格以内的市场深度低于运行深度时,交易会中止。
如果价格在某交易回合中波动超过1%,那么交易会暂停5分钟。
这些保护措施避免了操纵市场造成的价格快速波动,并给交易者机会增加抵押品或是增加新挂单来稳定价格。
❹ 4. 比特币的密钥、地址和钱包 - 精通比特币笔记
比特币的所有权是通过密钥、比特币地址和数字签名共同确定的。密钥不存在于比特币网络中,而是用户自己保存,或者利用管理私钥的软件-钱包来生成及管理。
比特币的交易必须有有效签名才会被存储在区块中,因此拥有密钥就拥有对应账户中的比特币。密钥都是成对出现的,由一个公钥和一个私钥组成。公钥相当于银行账号,私钥就相当于银行卡密码。通常情况下密钥由钱包软件管理,用户不直接使用密钥。
比特币地址通常是由公钥计算得来,也可以由比特币脚本得来。
比特币私钥通常是数字,由比特币系统随机( 因为算法的可靠性与随机性正相关,所以随机性必须是真随机,不是伪随机,因此比特币系统可以作为随机源来使用 )生成,然后将私钥作为输入,使用椭圆曲线算法这个单向加密函数生成对应的公钥,再将公钥作为输入,使用单向加密哈希函数生成地址。例如,通过公钥K得到地址A的计算方式为:
其中SHA256和PIPEMD160被称为双哈希或者HASH160,Base58Check是带有验证功能的Base58编码,验证方式为先计算原始数据(编码前)的验证码,再比较编码后数据的验证码,相同则地址有效,否则无效。而在使用Base58Check编码前,需要对数据做处理。
处理方式为: 版本前缀 + 双哈希后的数据 + 校验码
其中版本前缀是自定义的,如比特币私钥的前缀是0x80,校验码是把版本前缀和双哈希后的数据拼接起来,进行两次SHA256计算,取前4字节。得到处理的数据后,再进行Base58编码,得到最终的结果。
下图是Base58Check版本前缀和Base58编码后的结果
密钥可以采用不同的编码格式,得到的编码后结果虽然不同,但密钥本身没有任何变化,采用哪种编码格式,就看情况而论了,最终目的都是方便人们准确无误的使用和识别密钥。
下图是相同私钥采用不同编码方式的结果:
公钥也有很多种格式,不过最重要的是公钥被分为压缩格式和非压缩格式,带04前缀的公钥为非压缩格式的公钥,而03,02开头的标识压缩格式的公钥。
前面说过,公钥是椭圆曲线上的一个点,由一对坐标(x, y)表示,再加上前缀,公钥可以表示为:前缀 x y。
比如一个公钥的坐标为:
以非压缩格式为例,公钥为(略长):
压缩格式的公钥可以节省一定的存储,对于每天成千上万的比特币交易记录来说,这一点点的节省能起到很大效果。
因为椭圆曲线实际上是一个方程(y2 mod p = (x3 + 7)mod P, y2是y的平方,x3是x的立方),而公钥是椭圆曲线上的一个点,那么公钥即为方程的一个解,如果公钥中只保留x,那么可以通过解方程得到y,而压缩公钥格式有两个前缀是因为对y2开方,会得到正负两个解,在素数p阶的有限域上使用二进制算术计算椭圆曲线的时候,y坐标或奇或偶,所以用02表示y为奇数,03表示y为偶数。
所以压缩格式的公钥可以表示为:前缀x
以上述公钥的坐标为准,y为奇数为例,公钥K为:
不知道大家发现没有,这种压缩方式存在一个问题,即一个私钥可以得出两个公钥,压缩和非压缩公钥,而这两个公钥都对应同一个私钥,都合法,但生成的比特币地址却不相同,这就涉及到钱包软件的实现方式,是使用压缩公钥还是非压缩公钥,或者二者皆用,这个问题后面来介绍。
比特币钱包最主要的功能就是替用户保管比特币私钥,比特币钱包有很多种,比如非确定性(随机)钱包,确定性(种子)钱包。所谓的非确定性是指钱包运行时会生成足够的私钥(比如100个私钥),每个私钥仅会使用一次,这样私钥管理就很麻烦。确定性钱包拥有一个公共种子,单向离散方程使用种子生成私钥,种子足够回收所有私钥,所以在钱包创建时,简单备份下,就可以在钱包之间转移输入。
这里要特别介绍下助记码词汇。助记码词汇是英文单词序列,在BIP0039中提出。这些序列对应着钱包中的种子,种子可以生成随机数,随机数生成私钥,私钥生成公钥,便有了你需要的一切。所以单词的顺序就是钱包的备份,通过助记码词汇能重建钱包,这比记下一串随机数要强的多。
BIP0039定义助记码和种子的创建过程如下:
另外一种重要的钱包叫做HD钱包。HD钱包提供了随机(不确定性) 钥匙有两个主要的优势。
第一,树状结构可以被用来表达额外的组织含义。比如当一个特定分支的子密钥被用来接收交易收入并且有另一个分支的子密钥用来负责支付花费。不同分支的密钥都可以被用在企业环境中,这就可以支配不同的分支部门,子公司,具体功能以及会计类别。
第二,它可以允许让使用者去建立一个公共密钥的序列而不需要访问相对应的私钥。这可允许HD钱包在不安全的服务器中使用或者在每笔交易中发行不同的公共钥匙。公共钥匙不需要被预先加载或者提前衍生,但是在服务器中不具有可用来支付的私钥。
BIP0038提出了一个通用标准,使用一个口令加密私钥并使用Base58Check对加密的私钥进行编码,这样加密的私钥就可以安全地保存在备份介质里,安全地在钱包间传输,保持密钥在任何可能被暴露情况下的安全性。这个加密标准使用了AES,这个标准由NIST建立,并广泛应用于商业和军事应用的数据加密。
BIP0038加密方案是: 输入一个比特币私钥,通常使用WIF编码过,base58chek字符串的前缀“5”。此外BIP0038加密方案需要一个长密码作为口令,通常由多个单词或一段复杂的数字字母字符串组成。BIP0038加密方案的结果是一个由base58check编码过的加密私钥,前缀为6P。如果你看到一个6P开头的的密钥,这就意味着该密钥是被加密过,并需个口令来转换(解码) 该密钥回到可被用在任何钱包WIF格式的私钥(前缀为5)。许多钱包APP现在能够识别BIP0038加密过的私钥,会要求用户提供口令解码并导入密钥。
最通常使用BIP0038加密的密钥用例是纸钱包一一张纸张上备份私钥。只要用户选择了强口令,使用BIP0038加密的私钥的纸钱包就无比的安全,这也是一种很棒的比特币离线存储方式(也被称作“冷存储”)。
P2SH函数最常见的实现时用于多重签名地址脚本。顾名思义,底层脚本需要多个签名来证明所有权,然后才能消费资金。这类似在银行开设一个联合账户。
你可以通过计算,生成特殊的比特币地址,例如我需要一个Hello开头的地址,你可以通过脚本来生成这样一个地址。但是每增加一个字符,计算量会增加58倍,超过7个字符,需要专门的硬件或者矿机来生成,如果是8~10个字符,那么计算量将无法想象。
❺ 比特币的数字签名简介
比特币中的数字签名,是交易中的发起方产生的,为了保证这笔交易确实是由此人发起,并且数据在传输时没有被篡改。数字签名简单点来说,就是完整的交易信息,通过数字摘要技术压缩成固定格式的字符串,然后通过非对称加密技术,生成一个私钥。将完整的交易信息和数字签名传送给矿工,矿工用交易发起方的公钥对数字签名进行解密,解密成功,就将此交易数据写到区块中。
❻ 比特币的加密(秘钥、地址、脚本验证)
https://en.bitcoin.it/wiki/Address
https://www.cnblogs.com/zhaoweiwei/p/address.html
生成方式:
P2PKH的交易脚本
举个真实的例子:
ScriptSig:
PUSHDATA(72)[9701] PUSHDATA(33)
[]
这里面的一个scriptSig由2部分组成,第一部分是签名,第二部分是公钥,PUSHDATA(N),表示要压入栈顶的byte,1个byte表示2个字符,PUSHDATA(72)表示压入144个字符
Output Scripts
HASH160 PUSHDATA(20)[] EQUAL
DUP HASH160 PUSHDATA(20)[] EQUALVERIFY CHECKSIG
第二个找零output地址因为是P2PKH开头的,所以格式和描述的一样
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)[1201] PUSHDATA(71)[01] PUSHDATA1[]
HASH160 PUSHDATA(20)[] EQUAL
结合P2SH的新特征
https://en.bitcoin.it/wiki/Transaction
目前比特币支持两种类型的交易:Pay-to-PubkeyHash、Pay-to-Script-Hash
验证一笔P2PKH交易的一个输入是否合法:
总结:先验证这笔output是不是属于该用户,再验证该用户的签名是否有效
参考:
https://blog.csdn.net/jerry81333/article/details/56824166
初级版的比特币交易
https://www.jianshu.com/p/a57795ec562c
❼ 『学概念找员外』门限密码与多重签名
密钥分存还是有一个问题:密钥分存之后,如果后面要用原密钥来签名,那就需要取得子密钥,还原成原密钥,然后才能签名。这个过程有可能被黑客乘虚而入,盗取密钥。
密码学可以解决这个问题。如果子密钥储存在不同的设备中,可以以去中心化的方式还原原密钥,而不是在某台设备上完成,这种技术叫门限签名(threshold signature)技术。典型的例子就是使用双重安全机制的电子钱包(N=2且K=2),如果两个子密钥分别保存在个人电脑和手机上,你可以在电脑上发起付款,这时,电脑会生成一个签名片段,并发送到你的手机上,然后,手机会提示你付款信息(包括收款人、金额等),然后等待你确认。如果你确认了付款信息,这时,手机会利用它的子密钥完成整个签名,然后广播到区块链上。万一黑客控制了你的电脑,试图把比特币转到他的账户,你根据手机上的付款信息就知道有问题了,从而不会确认这笔交易。门限密码涉及的数学细节比较复杂,员外也看不懂,所以就不展开讨论了。
门限签名是密码学中的一项技术,将一个密钥切分成不同片段,分别储存,在交易签名时无须还原原密钥。而多重签名是比特币脚本的特性,把一个比特币账户的控制权交给多个密钥,这些密钥共同保障账户安全。门限签名和多重签名都能克服密钥单点保存的缺陷。
还有另外一种方法可以克服密钥单点保存的缺陷,即多重签名(multisignatures),这个名词在第3章曾出现过。通过比特币脚本,可以直接把一个比特币账户的控制权交给多个密钥,而不是将密钥分存。这些密钥可以保存在不同的地点,并分别生成签名。当然,最终完成的交易的信息还是会保存在某台设备上,但即使黑客控制了这台设备,他所能做的也只不过阻止这个交易被广播到整个网络上去。没有其他设备参与,他无法生成出一个正当有效的多重签名。
举例来说,假设A、B、C、D、E是一家公司的创始人,这家公司有许多的比特币。我们可能会用多重签名来保护这些比特币。这5个人,每人都有一对密钥,我们可以用其中的3个签名来保护冷储存,一笔交易需要5个人中至少3个人的签名才能完成。
这样,只要我们5个人在不同地方且使用不同的安全措施保存各自的密钥,那么比特币就会相当安全。黑客必须盗取我们当中3个人的密钥,才能盗取比特币。即便我们其中一个或两个背弃了我们,他(们)也无法卷款而逃,因为他们还需要另一个签名。同时,如果我们其中一个遗失了密钥,其他人还是可以取出比特币,并转到新的账户,重新设置密码。总而言之,多重签名可以比较妥善地管理在冷储存端的大额比特币,任何重大事项都需要多人的参与才能实现。
上文中,我们说到,人们使用门限签名技术的原因是为了实现双重安全机制或多重安全机制,使用多重签名技术的原因是为了实现多人对共同财产实现共同控制。实际上,这两种技术都可以实现上述两种目的。
❽ 如何使用比特币离线签名交易
GUA单GUADAN
❾ 什么是比特币延展性攻击
交易的延展性,也被称作为是可锻性,啥叫可锻,也即同样一个东西(如一坨金属),它的本质和质量都没有改变,但是它的形状改变了。而这个可锻性,会造成交易ID——TXID的不一致,从而导致用户找不到发送的交易。
现在比特币的交易数据格式中,将交易签名部分也纳入了整体交易中,最后对整体交易做哈希,而交易签名又可以有多种写法,攻击者篡改了它们,它们作用上是一样的,但是字节发生了变化,导致这个签名不一样了,前段时间甚至有一个矿池挖出了一个包含所有交易都是延展攻击了的,给一些应用带来了麻烦。
TXID发生变化可能会导致一些应用在查找TXID时找不到,从而影响一些钱包充值或提现的状态,给运营者和用户带来麻烦,隔离见证是为了解决这个问题而提出的,将交易数据和签名数据分开,这样一笔交易的TXID一定唯一。
❿ 比特币的数字签名是什么
比特币的数字签名,就是只有比特币转账的转出方生成的,一段防伪造的字符串。通过验证该数字串,一方面证明该交易是转出方发起的,另一方面证明交易信息在传输中没有被更改。
数字签名通过数字摘要技术把交易信息缩短成固定长度的字符串。举个栗子,牛牛发起一笔比特币转账,需要先将该交易进行数字摘要,缩短成一段字符串,然后用自己的私钥对摘要进行加密,形成数字签名。完成后,牛牛需要将原文(交易信息)和数字签名一起广播给矿工,矿工用牛牛的公钥进行验证,如果验证成功,说明该笔交易确实是牛牛发出的,且信息未被更改。
同时,数字签名加密的私钥和解密的公钥不一致,采用非对称加密技术。看起来好复杂,其实转账只需要你输入私钥就瞬间完成啦!