我在学习时的有以下疑问。
目录
1.3.1 假如某一次交易没有完全消耗所有的钱,要修改前面的区块把现在有的钱订正余额吗?
1.3.2 那么按照上面的说法,就是输入的总量=输出的总量?
1.5 怎么去验证是A的公钥,而不是有人顶替A和B做交易呢?
1.7.2 既然不能结点树作为投票标准,那么什么作为投票标准?
2.1 在同一时间假如有两个结点可以提供可靠的nonce那么怎么办
2.3 假如有一个交易处理特别特别慢,原来的链上已经添加了新的交易记录a和新的交易记录b,但是慢交易还是用之前的取hash,能插到新的交易记录a和新的交易记录b前面吗?
1 怎么定义一单交易
生产者和消费者+生产者的签名
例如区块2的生产者是A消费者是B和A。
1.1 处理反复花费同一笔钱的问题?
反复花费同一笔钱也成为双花攻击,花是花费的意思
通过图中的箭头(指针)指向每一笔交易,以及交易的签名判定是同一笔钱。例如我是D,我要伪造一笔A给D的交易,因为我没有A的密钥所以签不了名,这笔交易就是非法的。UTXO这一个数据结构是用于存放没有花费的钱,例如交易A在UTXO中会给出交易A产生这个输入的hash值,以及它是第几个交易。
上图包括了4各种状态的交易,我决定用问题&解决方法的模式给大家介绍。
1.2 钱是怎么产生的?
看区块1,第一笔称之为铸币它是由挖矿作为奖励产生的。
1.3 交易过程是怎么样的?
看区块3,B给C转了5块钱,给D转了2块钱,此时B把他仅有的7块钱消耗干净,最后签名。
1.3.1 假如某一次交易没有完全消耗所有的钱,要修改前面的区块把现在有的钱订正余额吗?
不需要修改前面的区块,看第2个区块,A给B转了7块钱,剩下的钱会转回给自己,要保证每一次转钱都把钱花的干干净净。
1.3.2 那么按照上面的说法,就是输入的总量=输出的总量?
不是的,因为每一笔交易都有交易费,所以输出是略微大于输出的。
1.3.3 为什么需要这一笔交易费?
对于我来说帮你记一笔交易并没有好处,因为要消耗我的算力,我完全可以只记自己的帐,搁家自扫门前雪。
1.4 怎么查询余额?
看区块2和区块3,区块3的B指向区块2的B不断往前回溯到前面的区块,最后判断余额是否足够。看区块4,可以发现C的余额是不够支付给E所以E区块4不可以添加链上。
1.5 怎么去验证是A的公钥,而不是有人顶替A和B做交易呢?
例如第一笔交易,提供A的公钥hash值要和铸币交易时A的hash值一致。《区块链与Merkle tree》第1.2介绍如何防止篡改。
1.7 怎么保证大家都认可这一笔交易?
选用投票机制,过半数的结点认可就可以认同这一笔交易并添加到区块链上。
1.7.1 假如有恶意结点并且超过半数怎么办?
假如是投票机制,因为是去中心化的,只要生产一对公私钥就相当于注册了账户,当不断生成公私钥,新建账户那当账户超过半数结点,那么能不能添加到链上的生杀大权就留给了恶意结点,这就是女巫攻击。
1.7.2 既然不能结点树作为投票标准,那么什么作为投票标准?
算力作为投票的标准,谁的算力强就掌握了投票权,假如在单位时间里可以试10个随机数别人只能试一个随机数,你的投票权就比别人高。
2 在并发的情况下可能出现的情况
2.1 在同一时间假如有两个结点可以提供可靠的nonce那么怎么办
看谁的后面新增一个区块,假如新增了一个区块就是指认同了前一个区块。
2.2 假如这么巧两个分支正好同时又接上了两个呢?
那就要看往后谁的分支更长,选用最长链。
2.3 假如有一个交易处理特别特别慢,原来的链上已经添加了新的交易记录a和新的交易记录b,但是慢交易还是用之前的取hash,能插到新的交易记录a和新的交易记录b前面吗?
不可以,以为牵一发而动后半身《区块链与Merkle tree》第1.2介绍如何防止篡改,所以即使你的交易是合法的但是也不能插到交易a和交易b前面英文这样不符合插入到最长链而且还有a和b回滚这是很不划算的。
2.3.1 慢交易是合法的那么他该何去何从?
它会重新到最后面变成新的区块,总会有善意的结点去接纳它让它添加到链上。