Bitcoin Forum

Local => Новички => Topic started by: Alda Gordaya on January 27, 2013, 05:01:24 AM



Title: unlocked transactions
Post by: Alda Gordaya on January 27, 2013, 05:01:24 AM
Чем locked transactions отличаются от unlocked transactions ?

Можно ли сказать, что клиент отправляет locked-транзакцию, в которой указывается что она валидна в течении такого-то времени
и если она не будет за это время включена в блок, то она будет отброшена?

Или это что-то другое, что именно?


UPD:
это вот отсюда:
http://bitcoin.stackexchange.com/questions/2025/what-is-txins-sequence

а что будет, если будет послана замещающая транзакция, но не успеет дойти,
а в блок будет принята более старая транзакция?

Чем мотивируется хранение траких транзакций?
Что, например, мешает провести DOS-атаку зафлудив такими транзакциями сеть?


Title: Re: unlocked transactions
Post by: Yurock on January 27, 2013, 06:14:01 AM
Чем locked transactions отличаются от unlocked transactions ?
Locked transactions should be considered final. Unlocked transactions can be changed by broadcasting a new version of the transaction.

Можно ли сказать, что клиент отправляет locked-транзакцию, в которой указывается что она валидна в течении такого-то времени
и если она не будет за это время включена в блок, то она будет отброшена?
Неправильно.

Или это что-то другое, что именно?
Такая транзакция не может быть включена в блок до lock_time. At the point determined by  lock_time the transaction becomes locked/final and can be included in the block chain. Также, до того, как наступит lock_time, может быть создана и передана в сеть окончательная версия транзакции с максимально возможным порядковым номером, которая может быть сразу включена в блок.


Title: Re: unlocked transactions
Post by: Alda Gordaya on January 27, 2013, 06:19:38 AM
может быть создана и передана в сеть окончательная версия транзакции с максимально возможным порядковым номером, которая может быть сразу включена в блок.

А что у такой транзакции можно поменять?
Например сумму денег можно изменить? или получателя?

Идея такая - резервируем сумму денег до даты завершения работ по контракту.
Если контракт выполнен - подтверждаем
Если не выполнен - отменяем

Пример, правда неудачный. Надо сделать невозможной отмену для отправителя...

Зачем ещё это может понадобиться?


Title: Re: unlocked transactions
Post by: Yurock on January 27, 2013, 08:00:08 AM
А что у такой транзакции можно поменять?
Например сумму денег можно изменить? или получателя?
Можно. "Вход" должен быть тот же,  с увеличенным серийником. Другие "входы" и "выходы" могут быть изменены.

Зачем ещё это может понадобиться?
Когда есть доверие к отправителю и заранее неизвестна общая сумма перевода. Например, я собираю бутылки на улице. Наполнил сумки и отнёс в приёмный пункт. Пункт вещает транзу на стоимость бутылок, анлокнутую до момента закрытия, например. Я приношу ещё бутылки и пункт увеличивает сумму. К концу дня транза становится окончательной и я могу потратить битки на буханку хлеба и сырок. :) Смысл в том, что только одна транзакция попадает в блок и только за неё надо платить комсу.


Title: Re: unlocked transactions
Post by: viv on January 27, 2013, 05:57:16 PM
Возможность изменения транзакций сейчас заблокирована.

 // Check for conflicts with in-memory transactions
    CTransaction* ptxOld = NULL;
    for (unsigned int i = 0; i < tx.vin.size(); i++)
    {
        COutPoint outpoint = tx.vin.prevout;
        if (mapNextTx.count(outpoint))
        {
            // Disable replacement feature for now
            return false;

            // Allow replacing with a newer version of the same transaction
            if (i != 0)
                return false;
            ptxOld = mapNextTx[outpoint].ptx;
            if (ptxOld->IsFinal())
                return false;
            if (!tx.IsNewerThan(*ptxOld))
                return false;
            for (unsigned int i = 0; i < tx.vin.size(); i++)
            {
                COutPoint outpoint = tx.vin.prevout;
                if (!mapNextTx.count(outpoint) || mapNextTx[outpoint].ptx != ptxOld)
                    return false;
            }
            break;
        }
    }