问题:
zhangsan.create_transaction(wangwu.wallet.addrs[-1],100)
zhangsan.broadcast_transaction()
zhangsan.get_unconfirmed_utxo()
wangwu.get_unconfirmed_utxo()
结果为:
[UTXO(vout:Vout(to_addr:1EBXwVC6QKawB1vA2oFEdhUbyuo6CXvHjD,value:99890),pointer:Pointer(tx_id:969a1e0d702c027a298d4f7741b4c4e51f9e1f4fb694ac85efe9650c33e69c09,n:1))]
[UTXO(vout:Vout(to_addr:1N7qkwQBsiQNehcQ6Zvas39bEs6qBLZRgn,value:100),pointer:Pointer(tx_id:969a1e0d702c027a298d4f7741b4c4e51f9e1f4fb694ac85efe9650c33e69c09,n:0))]
为什么zhangsan.get_unconfirmed_utxo()与wangwu.get_unconfirmed_utxo()中的Vout中的to_addr不一样
解答:
一种解答:
在 UTXO(Unspent Transaction Output)模型中,每笔交易的输出(Vout)包含以下信息:
to_addr:接收方的地址。amount:发送的金额。
Vout 中的 to_addr 是指接收这笔交易输出的地址。换句话说,to_addr 是这笔交易输出的所有权归属地址。
详细解释:
交易的输出(Vout):
每笔交易的输出(Vout)指定新的所有权和金额。
to_addr 是接收这笔交易输出的地址。
amount 是发送的金额。
未确认的 UTXO:
未确认的 UTXO 是指那些已经被创建但尚未被包含在区块链中的交易输出。
这些未确认的 UTXO 通常是作为交易的输入(Input)被引用,而不是作为交易的输出(Output)。
具体示例:
假设 zhangsan 的钱包中有以下 UTXO:
zhangsan_utxos = [{"txid": "txid1", "vout": 0, "amount": 200, "to_addr": "zhangsan_wallet_address"},{"txid": "txid2", "vout": 1, "amount": 150, "to_addr": "zhangsan_wallet_address"}
]
当 zhangsan 创建一笔交易时,他引用这些 UTXO 作为输入(Input):
# 创建交易
zhangsan.create_transaction(wangwu_addr, 100)
这笔交易的输入(Input)引用 zhangsan 钱包中的 UTXO,这些 UTXO 的 to_addr 是 zhangsan 的地址。
这笔交易的输出(Vout)中的 to_addr 是 wangwu 的地址:
# 交易的输出(Vout)
vout = [{"to_addr": "wangwu_wallet_address", "amount": 100}
]
为什么 zhangsan.get_unconfirmed_utxo() 获取的 UTXO 的 to_addr 是 zhangsan 的地址?
在 UTXO 模型中,未确认的 UTXO 通常是作为交易的输入(Input)被引用,而不是作为交易的输出(Output)。具体来说:
交易的输入(Input):
交易的输入(Input)引用之前交易的输出(Output),这些输出必须是未花费的(即 UTXO)。
当 zhangsan 创建一笔交易时,他需要引用自己钱包中的 UTXO 作为输入(Input)。
交易的输出(Output):
交易的输出(Output)指定新的所有权和金额。
当 zhangsan 创建一笔交易时,他指定 wangwu 的地址作为输出(Output)的 to_addr。
未确认的 UTXO:
未确认的 UTXO 是指那些已经被创建但尚未被包含在区块链中的交易输出。
当 zhangsan 创建一笔交易时,他引用自己的钱包中的 UTXO 作为输入(Input),这些 UTXO 的 to_addr 是 zhangsan 的地址。
具体步骤:
创建交易:
zhangsan 创建一笔交易,将 100 单位的货币发送到 wangwu 的地址。
这笔交易的输入(Input)引用 zhangsan 钱包中的 UTXO,这些 UTXO 的 to_addr 是 zhangsan 的地址。
这笔交易的输出(Output)中的 to_addr 是 wangwu 的地址。
广播交易:
zhangsan 将创建的交易广播到区块链网络中。
这笔交易现在处于未确认状态,等待矿工节点将其打包进区块。
获取未确认的 UTXO:
zhangsan.get_unconfirmed_utxo() 获取 zhangsan 钱包中未确认的 UTXO。
这些未确认的 UTXO 是作为交易的输入(Input)被引用的,因此它们的 to_addr 是 zhangsan 的地址。
总结:
Vout 中的 to_addr 是指接收这笔交易输出的地址。具体来说:
当 zhangsan 创建一笔交易时,他引用自己的钱包中的 UTXO 作为输入(Input),这些 UTXO 的 to_addr 是 zhangsan 的地址。
这笔交易的输出(Output)中的 to_addr 是 wangwu 的地址。
未确认的 UTXO 是指那些已经被创建但尚未被包含在区块链中的交易输出,它们通常是作为交易的输入(Input)被引用。
因此,zhangsan.get_unconfirmed_utxo() 获取的 UTXO 的 to_addr 是 zhangsan 的地址。
另一种解答是:
在书中看到当节点需要创建交易时从OWN_UTXO_SET中查找会更快捷高效
张三创建的交易输出(Vout)指向的是王五的地址。因为它们不是张三可以花费的UTXO,这些输出不会出现在张三的OWN_UTXO_SET中,所以张三的to_addr指向自己。
不知道哪个解答是正确的,先挖个坑