- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
比特币交易本质上包含交易参与者价值转移的相关信息数据结构。比特币区块链是一本全球复式记账总账簿,每笔交易都是在比特币区块链上的一个公开记录.
本章中使用术语“钱包”时,我们指的是构建交易的软件,而不仅仅是包含密钥的数据库.
UTXO,即“未花费的交易输出”(unspent transaction outputs)。所有 UTXO 的集合被称为 UTXO 集。UTXO 集大小在新的 UTXO 增加时而增长,并在 UTXO 被消耗时而缩小。每一个交易都代表 UTXO 集中的变化(状态转换).
用户的比特币“余额”是指用户钱包中可用的 UTXO 总和 ,它们可能分散在数百个交易和区块中。比特币钱包通过扫描区块链并汇聚所有属于该钱包控制的私钥的 UTXO 来计算该用户的余额.
比特币的脚本语言是一种基于栈的语言。脚本语言通过从左到右处理每个项目来执行脚本.
数字签名是一种由两部分组成的数学方案:第一部分是使用私钥对数据创建签名的算法;第二部分是允许在给定数据和公钥时验证签名合法性的算法。比特币中使用的数字签名算法是椭圆曲线数字签名算法(Elliptic Curve Digital Signature Algorithm,ECDSA) 。
在比特币的 ECDSA 算法的实现中,被签名的“消息”是交易,或更确切地说是交易中特定数据子集的哈希值。签名密钥是用户的私钥,结果就是签名,签名 Sig 由两个值组成,称为 R 和 S:Sig = (R, S).
具体流程如下:
其中:
验证使用数据(交易或其部分的哈希值),签名者的公钥和签名(R 和 S 值)来计算值 P,该值是椭圆曲线上的一个点,如果计算出的点 P 的 x 坐标等于 R ,则签名有效.
其中:
R 和 S 是签名值 。
Qa 是签名者的公钥 。
m 是交易数据(或其部分) 。
G 是椭圆曲线生成点 。
数字签名的用途:
每一笔比特币交易都会创造输出,并被比特币账簿(区块链)记录下来。除特例之外,几乎所有的输出都能创造 UTXO.
交易输出包含两部分:
{
...
"vout": [
{
"value": 0.01500000,
"scriptPubKey": "OP_DUP OP_HASH160 ab68025513c3dbd2f7b92a94e0581f5d50f654e7 OP_EQUALVERIFY OP_CHECKSIG"
},
{
"value": 0.08450000,
"scriptPubKey": "OP_DUP OP_HASH160 7f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a8 OP_EQUALVERIFY OP_CHECKSIG"
}
]
}
交易输入将 UTXO(通过被引用)标记为将被消费,并通过解锁脚本提供所有权证明.
交易输入包含四部分:
{
...
"vin": [
{
"txid": "7957a35fe64f80d234d76d83a2a8f1a0d8149a41d81de548f0a65a8a999f6f18",
"vout": 0,
"scriptSig": "3045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813[ALL]0484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade8416ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc17b4a10fa336a8d752adf",
"sequence": 4294967295
}
]
}
比特币网络处理的大多数交易花费的是由“付款至公钥散列”(Pay-to-Public-Key-Hash,P2PKH)脚本锁定的输出.
相应的锁定脚本和解锁脚本如下:
每个比特币验证节点将通过一起执行锁定和解锁脚本来验证交易.
例子:
OP_DUP OP_HASH160 <Cafe Public Key Hash> OP_EQUALVERIFY OP_CHECKSIG
<Cafe Signature> <Cafe Public Key>
<Cafe Signature> <Cafe Public Key> OP_DUP OP_HASH160 <Cafe Public Key Hash> OP_EQUALVERIFY OP_CHECKSIG
比特币签名有一种方法,用于通过使用 SIGHASH 标志来指示交易数据的 某一部分 包含在由私钥签名的散列中.
每个输入可能在其解锁脚本中包含一个签名。因此,包含多个输入的交易可以拥有具有不同 SIGHASH 标志的多个签名,这些标志在每个输入中承诺交易的不同部分.
有三个 SIGHASH 标志:ALL,NONE 和 SINGLE.
SIGHASH flag | Value | Description |
---|---|---|
ALL | 0x01 | 签名应用到所有输出输入 |
NONE | 0x02 | 签名只应用到所有输入,不包括任何输出 |
SINGLE | 0x03 | 签名应用到所有输入和与签名输入具有相同索引号的那个输出 |
另外还有一个修饰符标志 SIGHASH_ANYONECANPAY,它可以与前面的每个标志组合使用.
当设置 ANYONECANPAY 时,只有当前输入被签名,其余的(及其序列号)保持开放以进行修改。 ANYONECANPAY 的值为 0x80,并通过按位 OR 运算,得到如下表所示组合标志:
SIGHASH flag | Value | Description |
---|---|---|
ALL | ANYONECANPAY | 0x81 |
NONE | ANYONECANPAY | 0x82 |
SINGLE | ANYONECANPAY | 0x83 |
应用 sighash 标志的方式:
应用:
交易费是指输入和输出之间的差值。从所有输入中扣掉所有输出之后的剩余的金额是矿工收取的交易费.
最后此篇关于区块链入门③-交易的文章就讲到这里了,如果你想了解更多关于区块链入门③-交易的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我听过很多次公司喜欢HBase的强一致性。我阅读了 HBase 并喜欢它。然后我想到了mongodb write和那时候的区别。查了一下MongoDB似乎也有很强的一致性。但它是一致的吗?看起来 HB
区块链入门 ③ - 交易 交易 概述 比特币交易本质上包含交易参与者价值转移的相关信息数据结构。比特币区块链是一本全球复式记账总账簿,每笔交易都是在比特币区块链上的一个公开记录.
我有以下情况: 我正在迭代我的Affiliate 实体,对于每个实体,我需要在一个唯一的事务中保存和更新数据。因此,我有一个服务,其方法用 Spring @Transactional 注释(其中创建和
我无法理解 DaoManager 的默认行为。 DaoManager.createDao(connectionSource, theClass); 这需要一个 connectionSource - 而
我是 Spring 新手,有一个关于事务的问题。 我知道对于每个 http 请求都有一个 servlet 线程,它有自己的堆栈。据我所知,所有局部变量和方法都驻留在堆栈上。因此,如果我有一个方法 pu
我想设计一个简单的应用程序(没有 j2ee 和 jms),可以处理大量消息(比如在交易系统中) 我创建了一个服务,可以接收消息并将它们放入队列中,这样系统就不会在过载时卡住。 然后我创建了一个包装队列
如果使用 PDO 事务,是否需要锁定表? 如果用户 a 有 50 笔钱,将 50 笔转给用户 b,PDO 交易是否会确保它们都无误地执行? 另外,如果说我有一个 if 语句, if ($user['m
我正在实现一个方法,它会做类似的事情: ... try { myPojo.setProperty("foo"); myService.execute(myPojo); } catch (E
我正在尝试使用 ActiveRecord::Base.transaction。我认为使用 Rails 1.2.6 和 mysql 5.0 默认情况下回滚不起作用。多玩一点我发现 autocommit
我在我的网站上使用嵌入式支付,支付交易直接从买家到卖家发起,服务充当 API 调用方。商品价格由卖家以美元设定,以简化国际贸易。 当发件人和收件人都是俄罗斯居民时,发件人会收到错误消息: The pa
如果我删除我的应用程序中的数据,然后重新购买一些我知道该帐户已经拥有的托管 IAP,iOS 会给我原生的“您确定要重新购买该项目吗?您不会被收取费用”对话框。这符合预期。 当购买返回到我的应用程序时,
我一直在阅读 transactions & jooq但我很难看到如何在实践中实现它。 假设我为 JOOQ 提供了一个自定义 ConnectionProvider,它恰好使用了一个自动提交设置为 fal
我们正在使用 Entity Framework 并在事务范围内运行单元测试。我们最初在标题中遇到错误。 我已经设法将问题隔离开来。 using (TransactionScope scope1 = n
我有一个注册页面,基本上我需要将数据插入到 4 个表中。我是 PDO 的新手,对某些事情感到困惑。 基本上,如果任何插入失败,我不想向数据库中添加任何内容,这看起来很简单。 我的困惑是,我需要首先在我
我使用枢轴点进行交易。我在屏幕指示器上使用以下指标“CM_Pivots_Filtered”、“Pivots”、“CD_PivotR”和“CM_Gaps_Intra-Day_V2.1”。这些枢轴工作得很
我正在努力解决 Sonar 问题: squid:S2229 "Methods should not call same-class methods with incompatible "@Transa
在我的 Controller 中,我有一些类似的代码... ... if user.save something = Something.where("thing = ?", thing)
我使用 StoreKit 进行应用内购买。我发现当用户按下“取消”按钮时,API 的行为很奇怪。 例如,如果我在“确认您的应用内购买”屏幕上按“取消”,我会收到一个带有 error.code == S
AppStore 在自动续订自动续订订阅时是否会发出交易?如果是这样,如果应用程序将自己设置为观察者,那么下次应用程序加载时是否可以可靠地检测到它: [[SKPaymentQueue defaultQ
我正在研究 EMV 技术,并寻找终端和发行者之间的通信(请求/响应)以进行授权/在线 PIN 检查。 我知道离线数据验证仅在终端上进行检查,然后终端将数据发送给发行者。我想知道授权过程需要发送哪些数据
我是一名优秀的程序员,十分优秀!