BeeCee1 (OP)
Member
Offline
Activity: 115
Merit: 10
|
|
June 28, 2011, 02:32:43 AM |
|
The protocol https://en.bitcoin.it/wiki/Protocol_specification includes a lock_time field for transaction (bitcoin doesn't currently implement it), the description from the wiki: "The block number or timestamp at which this transaction is locked, or 0 if the transaction is always locked. A non-locked transaction must not be included in blocks, and it can be modified by broadcasting a new version before the time has expired" Then in TXIn there is a field for sequence, describe as: "Transaction version as defined by the sender. Intended for "replacement" of transactions when information is updated before inclusion into a block." What is unclear to me is what changes to a transaction would be acceptable in an update, could you change the source coins, the destination address, the script? And, if they are changed, how would miners determine that this is an updated transaction and not a new, totally different one?
|
|
|
|
theymos
Administrator
Legendary
Offline
Activity: 5376
Merit: 13407
|
|
June 28, 2011, 02:58:46 AM |
|
You can change anything if you own all of the inputs. You can even reverse it. Miners can tell because the inputs of the new transaction all have higher sequence numbers than the old ones.
With the non-default SIGHASH modes, multiple people can contribute inputs into a transaction. Then you can only change certain things, depending on the mode.
|
1NXYoJ5xU91Jp83XfVMHwwTUyZFK64BoAD
|
|
|
JoelKatz
Legendary
Offline
Activity: 1596
Merit: 1012
Democracy is vulnerable to a 51% attack.
|
|
June 28, 2011, 03:08:58 AM |
|
What is unclear to me is what changes to a transaction would be acceptable in an update, could you change the source coins, the destination address, the script? And, if they are changed, how would miners determine that this is an updated transaction and not a new, totally different one? Why would they need to know? If you changed everything in the transaction, what difference does it make whether it's updated or new? And if, say, leave at least one of the coin sources the same, obviously only one transaction can go through anyway.
|
I am an employee of Ripple. Follow me on Twitter @JoelKatz 1Joe1Katzci1rFcsr9HH7SLuHVnDy2aihZ BM-NBM3FRExVJSJJamV9ccgyWvQfratUHgN
|
|
|
BeeCee1 (OP)
Member
Offline
Activity: 115
Merit: 10
|
|
June 28, 2011, 11:18:42 PM |
|
What is unclear to me is what changes to a transaction would be acceptable in an update, could you change the source coins, the destination address, the script? And, if they are changed, how would miners determine that this is an updated transaction and not a new, totally different one? Why would they need to know? If you changed everything in the transaction, what difference does it make whether it's updated or new? And if, say, leave at least one of the coin sources the same, obviously only one transaction can go through anyway. Lots of questions here. "Why would they need to know?": There is a field in the transaction to say it is an updated transaction. If that is to be useful, you have to know what transaction is being updated. "If you changed everything in the transaction, what difference does it make whether it's updated or new?" If it is updated then the old transaction wouldn't go through, if it is new then the old transaction could go through too. I wouldn't expect people to change everything , even if they changed one of them how would you tell that it is updated? For example: You change the output: how do you distinguish it from a double spend attempt. You change the input(s): how do you distinguish it from a second transaction to the same output?
|
|
|
|
TierNolan
Legendary
Offline
Activity: 1232
Merit: 1104
|
|
June 28, 2011, 11:37:25 PM |
|
Why would they need to know? If you changed everything in the transaction, what difference does it make whether it's updated or new? And if, say, leave at least one of the coin sources the same, obviously only one transaction can go through anyway.
You want to be able to cancel the previous transaction. Otherwise, miners wouldn't know which one to include in the block chain. You lock the transaction so it isn't included in the chain and until that time you can update the transaction.
|
1LxbG5cKXzTwZg9mjL3gaRE835uNQEteWF
|
|
|
genjix
Legendary
Offline
Activity: 1232
Merit: 1076
|
|
June 29, 2011, 12:54:23 AM |
|
Basically if presented with 2 transactions then miners can randomly choose which to include in a block (if using the same outputs). The only condition is that the tx they include mustn't use the same outputs as a tx already in a block.
So you send out tx A with no fee, and tx B with a fee + lock time.
Two scenarios:
1. tx A gets included in a block before tx B's locktime finishes. By the time tx B becomes active, tx A is already in a block so it gets dropped.
2. tx A never gets into a block. tx B becomes active + gets into a block. tx A is forgotten.
|
|
|
|
TierNolan
Legendary
Offline
Activity: 1232
Merit: 1104
|
|
June 29, 2011, 01:16:57 AM |
|
Basically if presented with 2 transactions then miners can randomly choose which to include in a block (if using the same outputs). The only condition is that the tx they include mustn't use the same outputs as a tx already in a block.
True, but miners are supposed to prioritise transactions with higher sequence numbers. If 80% of miners do that, then you have a good chance of the higher one winning. Also, if you send out the update well in advance, it is even more likely.
|
1LxbG5cKXzTwZg9mjL3gaRE835uNQEteWF
|
|
|
BeeCee1 (OP)
Member
Offline
Activity: 115
Merit: 10
|
|
June 29, 2011, 02:45:21 AM |
|
Basically if presented with 2 transactions then miners can randomly choose which to include in a block (if using the same outputs). The only condition is that the tx they include mustn't use the same outputs as a tx already in a block.
I think I'm beginning to understand this, tell me if I have it right. A output can only be spent once, thus, if two transactions spend the same output (as one of their inputs) then they count as the same transaction. So if you had two transactions: T1: Input1,Input2 -> Output1 T2: Input1,Input3 -> Output2 They would both be considered different versions of the same transaction since the both share Input1. If you had a transaction T3: Input1 -> Output1 with a lock time that was non-zero and greater than the current block number then that transaction then that transaction is still open, you would be able to broadcast a replacement transaction (with a higher sequence number) and change the output or the script (or both) to whatever you wanted, but you couldn't change the input. (I realize this isn't all implemented in the client, I'm just trying to figure out how it will be done when devs get to it.)
|
|
|
|
theymos
Administrator
Legendary
Offline
Activity: 5376
Merit: 13407
|
|
June 29, 2011, 03:18:15 AM |
|
You could add additional inputs or remove some of the inputs if there were several. You could even change the input scripts (as long as they still work).
|
1NXYoJ5xU91Jp83XfVMHwwTUyZFK64BoAD
|
|
|
TierNolan
Legendary
Offline
Activity: 1232
Merit: 1104
|
|
June 29, 2011, 09:30:34 AM |
|
Basically if presented with 2 transactions then miners can randomly choose which to include in a block (if using the same outputs). The only condition is that the tx they include mustn't use the same outputs as a tx already in a block.
I think I'm beginning to understand this, tell me if I have it right. A output can only be spent once, thus, if two transactions spend the same output (as one of their inputs) then they count as the same transaction. So if you had two transactions: T1: Input1,Input2 -> Output1 T2: Input1,Input3 -> Output2 They would both be considered different versions of the same transaction since the both share Input1. I am pretty sure the current client would consider the second transaction that it received invalid, since it is reusing an input. It would assume that it is a double spend attempt and refuse to forward it to the rest of the network. If you could get both to miners, then the miner would have to decide which one would be used. Once one is incorporated into the chain, then the other one is considered dead. If you had a transaction T3: Input1 -> Output1 with a lock time that was non-zero and greater than the current block number then that transaction then that transaction is still open, you would be able to broadcast a replacement transaction (with a higher sequence number) and change the output or the script (or both) to whatever you wanted, but you couldn't change the input.
That is the intention of the lock system.
|
1LxbG5cKXzTwZg9mjL3gaRE835uNQEteWF
|
|
|
BeeCee1 (OP)
Member
Offline
Activity: 115
Merit: 10
|
|
June 30, 2011, 01:30:32 AM |
|
You could add additional inputs or remove some of the inputs if there were several. You could even change the input scripts (as long as they still work).
Thanks. I that clears up a lot. Can you change the outputs or are they required to be the same?
|
|
|
|
theymos
Administrator
Legendary
Offline
Activity: 5376
Merit: 13407
|
|
June 30, 2011, 02:10:27 AM |
|
You can change everything.
|
1NXYoJ5xU91Jp83XfVMHwwTUyZFK64BoAD
|
|
|
MoonShadow
Legendary
Offline
Activity: 1708
Merit: 1010
|
|
June 30, 2011, 02:16:35 AM |
|
Basically if presented with 2 transactions then miners can randomly choose which to include in a block (if using the same outputs). The only condition is that the tx they include mustn't use the same outputs as a tx already in a block.
So you send out tx A with no fee, and tx B with a fee + lock time.
Two scenarios:
1. tx A gets included in a block before tx B's locktime finishes. By the time tx B becomes active, tx A is already in a block so it gets dropped.
2. tx A never gets into a block. tx B becomes active + gets into a block. tx A is forgotten.
I'm pretty sure that the free transaction that doesn't consider a lock time would render the one with the fee and lock time invalid. The reason for this is because the scripting system is required to use a lock time, and this requires a fee, but it's the use of the lock time that keeps the inputs from being 'commited' by the clients that see the lock time transaction. However, the regular (feeless) transaction would cause the inputs to be 'commited' by the clients, and thus the scripted transaction would become invalid and be dropped before it's lock expired. I could be wrong about this, not sure.
|
"The powers of financial capitalism had another far-reaching aim, nothing less than to create a world system of financial control in private hands able to dominate the political system of each country and the economy of the world as a whole. This system was to be controlled in a feudalist fashion by the central banks of the world acting in concert, by secret agreements arrived at in frequent meetings and conferences. The apex of the systems was to be the Bank for International Settlements in Basel, Switzerland, a private bank owned and controlled by the world's central banks which were themselves private corporations. Each central bank...sought to dominate its government by its ability to control Treasury loans, to manipulate foreign exchanges, to influence the level of economic activity in the country, and to influence cooperative politicians by subsequent economic rewards in the business world."
- Carroll Quigley, CFR member, mentor to Bill Clinton, from 'Tragedy And Hope'
|
|
|
Pieter Wuille
|
|
June 30, 2011, 07:28:24 AM |
|
You can change everything.
This is not true. All prevouts must remain identical and none may be removed or added, for a transaction to be considered a new version of another. Input scripts may be changed, though. For outputs, you can change everything.
|
I do Bitcoin stuff.
|
|
|
molecular
Donator
Legendary
Offline
Activity: 2772
Merit: 1019
|
|
December 07, 2012, 07:35:31 AM |
|
You can change everything.
This is not true. All prevouts must remain identical and none may be removed or added, for a transaction to be considered a new version of another. Input scripts may be changed, though. For outputs, you can change everything. sorry to necro this thread. I like this feature. Is it implemented by now and if so what are the implications of "old clients" being around that don't yet implement this?
|
PGP key molecular F9B70769 fingerprint 9CDD C0D3 20F8 279F 6BE0 3F39 FC49 2362 F9B7 0769
|
|
|
Mike Hearn
Legendary
Offline
Activity: 1526
Merit: 1134
|
|
December 07, 2012, 11:11:29 AM |
|
Transaction replacement has been "implemented" since day 1, but it was switched off until some concerns with it can be addressed. Those concerns were not yet addressed so it wasn't yet switched back on. However we have done a lot of research and documentation on how it can be used: https://en.bitcoin.it/wiki/Contracts
|
|
|
|
MatthewLM
Legendary
Offline
Activity: 1190
Merit: 1004
|
|
December 07, 2012, 01:32:29 PM |
|
|
|
|
|
Pieter Wuille
|
|
December 07, 2012, 01:38:17 PM |
|
nLockTime is implemented and has always been enabled (disabling this would be a forking change). It is transaction replacement (which is related, but not the same thing) which is disabled (and enabling this is just a local implementation change, not a forking change).
|
I do Bitcoin stuff.
|
|
|
smithd98@gmail.com
Newbie
Offline
Activity: 26
Merit: 0
|
|
August 18, 2013, 03:06:55 PM |
|
Transaction replacement has been "implemented" since day 1, but it was switched off until some concerns with it can be addressed. Those concerns were not yet addressed so it wasn't yet switched back on. However we have done a lot of research and documentation on how it can be used: https://en.bitcoin.it/wiki/Contracts Mike thanks for the link! Those features are exciting!
|
|
|
|
Meccup
Newbie
Offline
Activity: 13
Merit: 0
|
|
January 12, 2014, 01:13:45 AM |
|
You lock the transaction so it isn't included in the chain and until that time you can update the transaction.
Vice versa... You unlock transaction for further changes...
|
|
|
|
|