close_tx: don't use protobufs.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
Rusty Russell 2016-01-22 06:41:47 +10:30
parent 9aa0eac814
commit e1eef5db65
4 changed files with 37 additions and 26 deletions

View File

@ -8,42 +8,33 @@
struct bitcoin_tx *create_close_tx(secp256k1_context *secpctx,
const tal_t *ctx,
OpenChannel *ours,
OpenChannel *theirs,
OpenAnchor *anchor,
const struct pubkey *our_final,
const struct pubkey *their_final,
const struct sha256_double *anchor_txid,
unsigned int anchor_index,
u64 anchor_satoshis,
uint64_t to_us, uint64_t to_them)
{
struct bitcoin_tx *tx;
const u8 *redeemscript;
struct pubkey ourkey, theirkey;
struct sha256 redeem;
/* Now create close tx: one input, two outputs. */
tx = bitcoin_tx(ctx, 1, 2);
/* Our input spends the anchor tx output. */
proto_to_sha256(anchor->txid, &tx->input[0].txid.sha);
tx->input[0].index = anchor->output_index;
tx->input[0].input_amount = anchor->amount;
/* Outputs goes to final pubkey */
if (!proto_to_pubkey(secpctx, ours->final_key, &ourkey))
return tal_free(tx);
if (!proto_to_pubkey(secpctx, theirs->final_key, &theirkey))
return tal_free(tx);
proto_to_sha256(ours->revocation_hash, &redeem);
tx->input[0].txid = *anchor_txid;
tx->input[0].index = anchor_index;
tx->input[0].input_amount = anchor_satoshis;
/* One output is to us. */
tx->output[0].amount = to_us;
redeemscript = bitcoin_redeem_single(tx, &ourkey);
redeemscript = bitcoin_redeem_single(tx, our_final);
tx->output[0].script = scriptpubkey_p2sh(tx, redeemscript);
tx->output[0].script_length = tal_count(tx->output[0].script);
/* Other output is to them. */
tx->output[1].amount = to_them;
redeemscript = bitcoin_redeem_single(tx, &theirkey);
redeemscript = bitcoin_redeem_single(tx, their_final);
tx->output[1].script = scriptpubkey_p2sh(tx, redeemscript);
tx->output[1].script_length = tal_count(tx->output[1].script);

View File

@ -11,8 +11,10 @@ struct sha256_double;
* input scriptsig. */
struct bitcoin_tx *create_close_tx(secp256k1_context *secpctx,
const tal_t *ctx,
OpenChannel *ours,
OpenChannel *theirs,
OpenAnchor *anchor,
const struct pubkey *our_final,
const struct pubkey *their_final,
const struct sha256_double *anchor_txid,
unsigned int anchor_index,
u64 anchor_satoshis,
uint64_t to_us, uint64_t to_them);
#endif

View File

@ -33,7 +33,8 @@ int main(int argc, char *argv[])
struct signature sig;
struct privkey privkey;
bool testnet;
struct pubkey pubkey1, pubkey2;
struct pubkey pubkey1, pubkey2, final1, final2;
struct sha256_double anchor_txid;
u8 *redeemscript;
char *close_file = NULL;
u64 close_fee = 10000;
@ -87,12 +88,20 @@ int main(int argc, char *argv[])
if (!proto_to_pubkey(secp256k1_context_create(0),
o2->commit_key, &pubkey2))
errx(1, "Invalid o2 commit pubkey");
if (!proto_to_pubkey(secp256k1_context_create(0),
o1->final_key, &final1))
errx(1, "Invalid o1 final pubkey");
if (!proto_to_pubkey(secp256k1_context_create(0),
o2->final_key, &final2))
errx(1, "Invalid o2 final pubkey");
/* This is what the anchor pays to. */
redeemscript = bitcoin_redeem_2of2(ctx, &pubkey1, &pubkey2);
proto_to_sha256(a->txid, &anchor_txid.sha);
close_tx = create_close_tx(secp256k1_context_create(0),
ctx, o1, o2, a,
ctx, &final1, &final2,
&anchor_txid, a->output_index, a->amount,
cstate->a.pay_msat / 1000,
cstate->b.pay_msat / 1000);

View File

@ -26,7 +26,8 @@ int main(int argc, char *argv[])
OpenAnchor *a;
struct bitcoin_tx *close_tx;
struct bitcoin_signature sig1, sig2;
struct pubkey pubkey1, pubkey2;
struct pubkey pubkey1, pubkey2, final1, final2;
struct sha256_double anchor_txid;
u8 *redeemscript;
CloseChannel *close;
CloseChannelComplete *closecomplete;
@ -59,6 +60,12 @@ int main(int argc, char *argv[])
if (!proto_to_pubkey(secp256k1_context_create(0),
o2->commit_key, &pubkey2))
errx(1, "Invalid o2 commit_key");
if (!proto_to_pubkey(secp256k1_context_create(0),
o1->final_key, &final1))
errx(1, "Invalid o1 final pubkey");
if (!proto_to_pubkey(secp256k1_context_create(0),
o2->final_key, &final2))
errx(1, "Invalid o2 final pubkey");
/* Get delta by accumulting all the updates. */
cstate = gather_updates(ctx, o1, o2, a, close->close_fee, argv + 6,
@ -68,8 +75,10 @@ int main(int argc, char *argv[])
redeemscript = bitcoin_redeem_2of2(ctx, &pubkey1, &pubkey2);
/* Now create the close tx to spend 2/2 output of anchor. */
proto_to_sha256(a->txid, &anchor_txid.sha);
close_tx = create_close_tx(secp256k1_context_create(0),
ctx, o1, o2, a,
ctx, &final1, &final2,
&anchor_txid, a->output_index, a->amount,
cstate->a.pay_msat / 1000,
cstate->b.pay_msat / 1000);