mirror of
https://github.com/bisq-network/bisq.git
synced 2025-02-23 15:00:30 +01:00
Send seller's delayedPayoutTx signature to peer ASAP
Include a new 'delayedPayoutTxSellerSignature' field with the prepared delayed payout tx sent to the buyer, in DelayedPayoutTxSignatureRequest. This will allow the buyer to compute the final, signed delayedPayoutTx as early as possible and withhold their deposit tx witness from the seller until they know they have a valid delayedPayoutTx, preventing its premature publishing in the fully segwit case. (To be done in a later commit - for now just save the seller's delayedPayoutTx signature.) As part of this, run the SellerSignsDelayedPayoutTx trade task at an earlier step (just after payout tx creation) to make its signature available to the seller ASAP. Also rename 'delayedPayoutTxSignature' to 'delayedPayoutTxBuyerSignature' in DelayedPayoutTxSignatureResponse.
This commit is contained in:
parent
79fa219533
commit
f02d5ee216
9 changed files with 37 additions and 20 deletions
|
@ -33,16 +33,19 @@ import lombok.Value;
|
|||
public final class DelayedPayoutTxSignatureRequest extends TradeMessage implements DirectMessage {
|
||||
private final NodeAddress senderNodeAddress;
|
||||
private final byte[] delayedPayoutTx;
|
||||
private final byte[] delayedPayoutTxSellerSignature;
|
||||
|
||||
public DelayedPayoutTxSignatureRequest(String uid,
|
||||
String tradeId,
|
||||
NodeAddress senderNodeAddress,
|
||||
byte[] delayedPayoutTx) {
|
||||
byte[] delayedPayoutTx,
|
||||
byte[] delayedPayoutTxSellerSignature) {
|
||||
this(Version.getP2PMessageVersion(),
|
||||
uid,
|
||||
tradeId,
|
||||
senderNodeAddress,
|
||||
delayedPayoutTx);
|
||||
delayedPayoutTx,
|
||||
delayedPayoutTxSellerSignature);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -53,10 +56,12 @@ public final class DelayedPayoutTxSignatureRequest extends TradeMessage implemen
|
|||
String uid,
|
||||
String tradeId,
|
||||
NodeAddress senderNodeAddress,
|
||||
byte[] delayedPayoutTx) {
|
||||
byte[] delayedPayoutTx,
|
||||
byte[] delayedPayoutTxSellerSignature) {
|
||||
super(messageVersion, tradeId, uid);
|
||||
this.senderNodeAddress = senderNodeAddress;
|
||||
this.delayedPayoutTx = delayedPayoutTx;
|
||||
this.delayedPayoutTxSellerSignature = delayedPayoutTxSellerSignature;
|
||||
}
|
||||
|
||||
|
||||
|
@ -67,16 +72,19 @@ public final class DelayedPayoutTxSignatureRequest extends TradeMessage implemen
|
|||
.setUid(uid)
|
||||
.setTradeId(tradeId)
|
||||
.setSenderNodeAddress(senderNodeAddress.toProtoMessage())
|
||||
.setDelayedPayoutTx(ByteString.copyFrom(delayedPayoutTx)))
|
||||
.setDelayedPayoutTx(ByteString.copyFrom(delayedPayoutTx))
|
||||
.setDelayedPayoutTxSellerSignature(ByteString.copyFrom(delayedPayoutTxSellerSignature)))
|
||||
.build();
|
||||
}
|
||||
|
||||
public static DelayedPayoutTxSignatureRequest fromProto(protobuf.DelayedPayoutTxSignatureRequest proto, int messageVersion) {
|
||||
public static DelayedPayoutTxSignatureRequest fromProto(protobuf.DelayedPayoutTxSignatureRequest proto,
|
||||
int messageVersion) {
|
||||
return new DelayedPayoutTxSignatureRequest(messageVersion,
|
||||
proto.getUid(),
|
||||
proto.getTradeId(),
|
||||
NodeAddress.fromProto(proto.getSenderNodeAddress()),
|
||||
proto.getDelayedPayoutTx().toByteArray());
|
||||
proto.getDelayedPayoutTx().toByteArray(),
|
||||
proto.getDelayedPayoutTxSellerSignature().toByteArray());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -84,6 +92,7 @@ public final class DelayedPayoutTxSignatureRequest extends TradeMessage implemen
|
|||
return "DelayedPayoutTxSignatureRequest{" +
|
||||
"\n senderNodeAddress=" + senderNodeAddress +
|
||||
",\n delayedPayoutTx=" + Utilities.bytesAsHexString(delayedPayoutTx) +
|
||||
",\n delayedPayoutTxSellerSignature=" + Utilities.bytesAsHexString(delayedPayoutTxSellerSignature) +
|
||||
"\n} " + super.toString();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,17 +32,17 @@ import lombok.Value;
|
|||
@Value
|
||||
public final class DelayedPayoutTxSignatureResponse extends TradeMessage implements DirectMessage {
|
||||
private final NodeAddress senderNodeAddress;
|
||||
private final byte[] delayedPayoutTxSignature;
|
||||
private final byte[] delayedPayoutTxBuyerSignature;
|
||||
|
||||
public DelayedPayoutTxSignatureResponse(String uid,
|
||||
String tradeId,
|
||||
NodeAddress senderNodeAddress,
|
||||
byte[] delayedPayoutTxSignature) {
|
||||
byte[] delayedPayoutTxBuyerSignature) {
|
||||
this(Version.getP2PMessageVersion(),
|
||||
uid,
|
||||
tradeId,
|
||||
senderNodeAddress,
|
||||
delayedPayoutTxSignature);
|
||||
delayedPayoutTxBuyerSignature);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -53,10 +53,10 @@ public final class DelayedPayoutTxSignatureResponse extends TradeMessage impleme
|
|||
String uid,
|
||||
String tradeId,
|
||||
NodeAddress senderNodeAddress,
|
||||
byte[] delayedPayoutTxSignature) {
|
||||
byte[] delayedPayoutTxBuyerSignature) {
|
||||
super(messageVersion, tradeId, uid);
|
||||
this.senderNodeAddress = senderNodeAddress;
|
||||
this.delayedPayoutTxSignature = delayedPayoutTxSignature;
|
||||
this.delayedPayoutTxBuyerSignature = delayedPayoutTxBuyerSignature;
|
||||
}
|
||||
|
||||
|
||||
|
@ -67,24 +67,25 @@ public final class DelayedPayoutTxSignatureResponse extends TradeMessage impleme
|
|||
.setUid(uid)
|
||||
.setTradeId(tradeId)
|
||||
.setSenderNodeAddress(senderNodeAddress.toProtoMessage())
|
||||
.setDelayedPayoutTxSignature(ByteString.copyFrom(delayedPayoutTxSignature))
|
||||
.setDelayedPayoutTxBuyerSignature(ByteString.copyFrom(delayedPayoutTxBuyerSignature))
|
||||
)
|
||||
.build();
|
||||
}
|
||||
|
||||
public static DelayedPayoutTxSignatureResponse fromProto(protobuf.DelayedPayoutTxSignatureResponse proto, int messageVersion) {
|
||||
public static DelayedPayoutTxSignatureResponse fromProto(protobuf.DelayedPayoutTxSignatureResponse proto,
|
||||
int messageVersion) {
|
||||
return new DelayedPayoutTxSignatureResponse(messageVersion,
|
||||
proto.getUid(),
|
||||
proto.getTradeId(),
|
||||
NodeAddress.fromProto(proto.getSenderNodeAddress()),
|
||||
proto.getDelayedPayoutTxSignature().toByteArray());
|
||||
proto.getDelayedPayoutTxBuyerSignature().toByteArray());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "DelayedPayoutTxSignatureResponse{" +
|
||||
"\n senderNodeAddress=" + senderNodeAddress +
|
||||
",\n delayedPayoutTxSignature=" + Utilities.bytesAsHexString(delayedPayoutTxSignature) +
|
||||
",\n delayedPayoutTxBuyerSignature=" + Utilities.bytesAsHexString(delayedPayoutTxBuyerSignature) +
|
||||
"\n} " + super.toString();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -35,6 +35,7 @@ import bisq.core.trade.protocol.tasks.maker.MakerSetsLockTime;
|
|||
import bisq.core.trade.protocol.tasks.maker.MakerVerifyTakerFeePayment;
|
||||
import bisq.core.trade.protocol.tasks.seller.SellerCreatesDelayedPayoutTx;
|
||||
import bisq.core.trade.protocol.tasks.seller.SellerSendDelayedPayoutTxSignatureRequest;
|
||||
import bisq.core.trade.protocol.tasks.seller.SellerSignsDelayedPayoutTx;
|
||||
import bisq.core.trade.protocol.tasks.seller_as_maker.SellerAsMakerCreatesUnsignedDepositTx;
|
||||
import bisq.core.trade.protocol.tasks.seller_as_maker.SellerAsMakerFinalizesDepositTx;
|
||||
import bisq.core.trade.protocol.tasks.seller_as_maker.SellerAsMakerProcessDepositTxMessage;
|
||||
|
@ -103,6 +104,7 @@ public class SellerAsMakerProtocol extends SellerProtocol implements MakerProtoc
|
|||
MakerRemovesOpenOffer.class,
|
||||
SellerAsMakerFinalizesDepositTx.class,
|
||||
SellerCreatesDelayedPayoutTx.class,
|
||||
SellerSignsDelayedPayoutTx.class,
|
||||
SellerSendDelayedPayoutTxSignatureRequest.class)
|
||||
.withTimeout(30))
|
||||
.executeTasks();
|
||||
|
|
|
@ -30,6 +30,7 @@ import bisq.core.trade.protocol.tasks.TradeTask;
|
|||
import bisq.core.trade.protocol.tasks.VerifyPeersAccountAgeWitness;
|
||||
import bisq.core.trade.protocol.tasks.seller.SellerCreatesDelayedPayoutTx;
|
||||
import bisq.core.trade.protocol.tasks.seller.SellerSendDelayedPayoutTxSignatureRequest;
|
||||
import bisq.core.trade.protocol.tasks.seller.SellerSignsDelayedPayoutTx;
|
||||
import bisq.core.trade.protocol.tasks.seller_as_taker.SellerAsTakerCreatesDepositTxInputs;
|
||||
import bisq.core.trade.protocol.tasks.seller_as_taker.SellerAsTakerSignsDepositTx;
|
||||
import bisq.core.trade.protocol.tasks.taker.CreateTakerFeeTx;
|
||||
|
@ -98,6 +99,7 @@ public class SellerAsTakerProtocol extends SellerProtocol implements TakerProtoc
|
|||
TakerPublishFeeTx.class,
|
||||
SellerAsTakerSignsDepositTx.class,
|
||||
SellerCreatesDelayedPayoutTx.class,
|
||||
SellerSignsDelayedPayoutTx.class,
|
||||
SellerSendDelayedPayoutTxSignatureRequest.class)
|
||||
.withTimeout(30))
|
||||
.executeTasks();
|
||||
|
|
|
@ -33,7 +33,6 @@ import bisq.core.trade.protocol.tasks.seller.SellerPublishesTradeStatistics;
|
|||
import bisq.core.trade.protocol.tasks.seller.SellerSendPayoutTxPublishedMessage;
|
||||
import bisq.core.trade.protocol.tasks.seller.SellerSendsDepositTxAndDelayedPayoutTxMessage;
|
||||
import bisq.core.trade.protocol.tasks.seller.SellerSignAndFinalizePayoutTx;
|
||||
import bisq.core.trade.protocol.tasks.seller.SellerSignsDelayedPayoutTx;
|
||||
|
||||
import bisq.network.p2p.NodeAddress;
|
||||
|
||||
|
@ -77,7 +76,6 @@ public abstract class SellerProtocol extends DisputeProtocol {
|
|||
.with(message)
|
||||
.from(peer))
|
||||
.setup(tasks(SellerProcessDelayedPayoutTxSignatureResponse.class,
|
||||
SellerSignsDelayedPayoutTx.class,
|
||||
SellerFinalizesDelayedPayoutTx.class,
|
||||
SellerSendsDepositTxAndDelayedPayoutTxMessage.class,
|
||||
SellerPublishesDepositTx.class,
|
||||
|
|
|
@ -46,6 +46,7 @@ public class BuyerProcessDelayedPayoutTxSignatureRequest extends TradeTask {
|
|||
byte[] delayedPayoutTxAsBytes = checkNotNull(request.getDelayedPayoutTx());
|
||||
Transaction preparedDelayedPayoutTx = processModel.getBtcWalletService().getTxFromSerializedTx(delayedPayoutTxAsBytes);
|
||||
processModel.setPreparedDelayedPayoutTx(preparedDelayedPayoutTx);
|
||||
processModel.getTradingPeer().setDelayedPayoutTxSignature(checkNotNull(request.getDelayedPayoutTxSellerSignature()));
|
||||
|
||||
// When we receive that message the taker has published the taker fee, so we apply it to the trade.
|
||||
// The takerFeeTx was sent in the first message. It should be part of DelayedPayoutTxSignatureRequest
|
||||
|
|
|
@ -42,7 +42,7 @@ public class SellerProcessDelayedPayoutTxSignatureResponse extends TradeTask {
|
|||
checkNotNull(response);
|
||||
checkTradeId(processModel.getOfferId(), response);
|
||||
|
||||
processModel.getTradingPeer().setDelayedPayoutTxSignature(checkNotNull(response.getDelayedPayoutTxSignature()));
|
||||
processModel.getTradingPeer().setDelayedPayoutTxSignature(checkNotNull(response.getDelayedPayoutTxBuyerSignature()));
|
||||
|
||||
// update to the latest peer address of our peer if the message is correct
|
||||
trade.setTradingPeerNodeAddress(processModel.getTempTradingPeerNodeAddress());
|
||||
|
|
|
@ -47,10 +47,13 @@ public class SellerSendDelayedPayoutTxSignatureRequest extends TradeTask {
|
|||
|
||||
Transaction preparedDelayedPayoutTx = checkNotNull(processModel.getPreparedDelayedPayoutTx(),
|
||||
"processModel.getPreparedDelayedPayoutTx() must not be null");
|
||||
byte[] delayedPayoutTxSignature = checkNotNull(processModel.getDelayedPayoutTxSignature(),
|
||||
"processModel.getDelayedPayoutTxSignature() must not be null");
|
||||
DelayedPayoutTxSignatureRequest message = new DelayedPayoutTxSignatureRequest(UUID.randomUUID().toString(),
|
||||
processModel.getOfferId(),
|
||||
processModel.getMyNodeAddress(),
|
||||
preparedDelayedPayoutTx.bitcoinSerialize());
|
||||
preparedDelayedPayoutTx.bitcoinSerialize(),
|
||||
delayedPayoutTxSignature);
|
||||
|
||||
NodeAddress peersNodeAddress = trade.getTradingPeerNodeAddress();
|
||||
log.info("Send {} to peer {}. tradeId={}, uid={}",
|
||||
|
|
|
@ -271,13 +271,14 @@ message DelayedPayoutTxSignatureRequest {
|
|||
string trade_id = 2;
|
||||
NodeAddress sender_node_address = 3;
|
||||
bytes delayed_payout_tx = 4;
|
||||
bytes delayed_payout_tx_seller_signature = 5;
|
||||
}
|
||||
|
||||
message DelayedPayoutTxSignatureResponse {
|
||||
string uid = 1;
|
||||
string trade_id = 2;
|
||||
NodeAddress sender_node_address = 3;
|
||||
bytes delayed_payout_tx_signature = 4;
|
||||
bytes delayed_payout_tx_buyer_signature = 4;
|
||||
}
|
||||
|
||||
message DepositTxAndDelayedPayoutTxMessage {
|
||||
|
|
Loading…
Add table
Reference in a new issue