Browse Source

anchor: change is not an arbitrary output, but a pubkey we p2sh to.

Gets rid of the last pubkey user; they're generally deprecated.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
ppa-0.6.1
Rusty Russell 10 years ago
parent
commit
d30c470c7d
  1. 20
      anchor.c
  2. 174
      lightning.pb-c.c
  3. 78
      lightning.pb-c.h
  4. 14
      lightning.proto
  5. 27
      open-channel.c
  6. 13
      pubkey.c
  7. 3
      pubkey.h

20
anchor.c

@ -66,15 +66,27 @@ struct bitcoin_tx *anchor_tx_create(const tal_t *ctx,
n_out = 1; n_out = 1;
if (o1->anchor->change) { if (o1->anchor->change) {
struct bitcoin_tx_output *out = &tx->output[n_out++]; struct bitcoin_tx_output *out = &tx->output[n_out++];
struct pubkey key;
if (!proto_to_pubkey(o1->anchor->change->pubkey, &key))
return tal_free(tx);
out->amount = o1->anchor->change->amount; out->amount = o1->anchor->change->amount;
out->script_length = o1->anchor->change->script.len; out->script = scriptpubkey_p2sh(tx,
out->script = o1->anchor->change->script.data; bitcoin_redeem_single(tx, &key));
out->script_length = tal_count(out->script);
} }
if (o2->anchor->change) { if (o2->anchor->change) {
struct bitcoin_tx_output *out = &tx->output[n_out++]; struct bitcoin_tx_output *out = &tx->output[n_out++];
struct pubkey key;
if (!proto_to_pubkey(o2->anchor->change->pubkey, &key))
return tal_free(tx);
out->amount = o2->anchor->change->amount; out->amount = o2->anchor->change->amount;
out->script_length = o2->anchor->change->script.len; out->script = scriptpubkey_p2sh(tx,
out->script = o2->anchor->change->script.data; bitcoin_redeem_single(tx, &key));
out->script_length = tal_count(out->script);
} }
assert(n_out == tx->output_count); assert(n_out == tx->output_count);

174
lightning.pb-c.c

@ -136,90 +136,90 @@ void bitcoin_input__free_unpacked
assert(message->base.descriptor == &bitcoin_input__descriptor); assert(message->base.descriptor == &bitcoin_input__descriptor);
protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator);
} }
void bitcoin_output__init void bitcoin_pubkey__init
(BitcoinOutput *message) (BitcoinPubkey *message)
{ {
static BitcoinOutput init_value = BITCOIN_OUTPUT__INIT; static BitcoinPubkey init_value = BITCOIN_PUBKEY__INIT;
*message = init_value; *message = init_value;
} }
size_t bitcoin_output__get_packed_size size_t bitcoin_pubkey__get_packed_size
(const BitcoinOutput *message) (const BitcoinPubkey *message)
{ {
assert(message->base.descriptor == &bitcoin_output__descriptor); assert(message->base.descriptor == &bitcoin_pubkey__descriptor);
return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message));
} }
size_t bitcoin_output__pack size_t bitcoin_pubkey__pack
(const BitcoinOutput *message, (const BitcoinPubkey *message,
uint8_t *out) uint8_t *out)
{ {
assert(message->base.descriptor == &bitcoin_output__descriptor); assert(message->base.descriptor == &bitcoin_pubkey__descriptor);
return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); return protobuf_c_message_pack ((const ProtobufCMessage*)message, out);
} }
size_t bitcoin_output__pack_to_buffer size_t bitcoin_pubkey__pack_to_buffer
(const BitcoinOutput *message, (const BitcoinPubkey *message,
ProtobufCBuffer *buffer) ProtobufCBuffer *buffer)
{ {
assert(message->base.descriptor == &bitcoin_output__descriptor); assert(message->base.descriptor == &bitcoin_pubkey__descriptor);
return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer);
} }
BitcoinOutput * BitcoinPubkey *
bitcoin_output__unpack bitcoin_pubkey__unpack
(ProtobufCAllocator *allocator, (ProtobufCAllocator *allocator,
size_t len, size_t len,
const uint8_t *data) const uint8_t *data)
{ {
return (BitcoinOutput *) return (BitcoinPubkey *)
protobuf_c_message_unpack (&bitcoin_output__descriptor, protobuf_c_message_unpack (&bitcoin_pubkey__descriptor,
allocator, len, data); allocator, len, data);
} }
void bitcoin_output__free_unpacked void bitcoin_pubkey__free_unpacked
(BitcoinOutput *message, (BitcoinPubkey *message,
ProtobufCAllocator *allocator) ProtobufCAllocator *allocator)
{ {
assert(message->base.descriptor == &bitcoin_output__descriptor); assert(message->base.descriptor == &bitcoin_pubkey__descriptor);
protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator);
} }
void bitcoin_pubkey__init void change__init
(BitcoinPubkey *message) (Change *message)
{ {
static BitcoinPubkey init_value = BITCOIN_PUBKEY__INIT; static Change init_value = CHANGE__INIT;
*message = init_value; *message = init_value;
} }
size_t bitcoin_pubkey__get_packed_size size_t change__get_packed_size
(const BitcoinPubkey *message) (const Change *message)
{ {
assert(message->base.descriptor == &bitcoin_pubkey__descriptor); assert(message->base.descriptor == &change__descriptor);
return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message));
} }
size_t bitcoin_pubkey__pack size_t change__pack
(const BitcoinPubkey *message, (const Change *message,
uint8_t *out) uint8_t *out)
{ {
assert(message->base.descriptor == &bitcoin_pubkey__descriptor); assert(message->base.descriptor == &change__descriptor);
return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); return protobuf_c_message_pack ((const ProtobufCMessage*)message, out);
} }
size_t bitcoin_pubkey__pack_to_buffer size_t change__pack_to_buffer
(const BitcoinPubkey *message, (const Change *message,
ProtobufCBuffer *buffer) ProtobufCBuffer *buffer)
{ {
assert(message->base.descriptor == &bitcoin_pubkey__descriptor); assert(message->base.descriptor == &change__descriptor);
return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer);
} }
BitcoinPubkey * Change *
bitcoin_pubkey__unpack change__unpack
(ProtobufCAllocator *allocator, (ProtobufCAllocator *allocator,
size_t len, size_t len,
const uint8_t *data) const uint8_t *data)
{ {
return (BitcoinPubkey *) return (Change *)
protobuf_c_message_unpack (&bitcoin_pubkey__descriptor, protobuf_c_message_unpack (&change__descriptor,
allocator, len, data); allocator, len, data);
} }
void bitcoin_pubkey__free_unpacked void change__free_unpacked
(BitcoinPubkey *message, (Change *message,
ProtobufCAllocator *allocator) ProtobufCAllocator *allocator)
{ {
assert(message->base.descriptor == &bitcoin_pubkey__descriptor); assert(message->base.descriptor == &change__descriptor);
protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator);
} }
void anchor__init void anchor__init
@ -1279,93 +1279,93 @@ const ProtobufCMessageDescriptor bitcoin_input__descriptor =
(ProtobufCMessageInit) bitcoin_input__init, (ProtobufCMessageInit) bitcoin_input__init,
NULL,NULL,NULL /* reserved[123] */ NULL,NULL,NULL /* reserved[123] */
}; };
static const ProtobufCFieldDescriptor bitcoin_output__field_descriptors[2] = static const ProtobufCFieldDescriptor bitcoin_pubkey__field_descriptors[1] =
{ {
{ {
"amount", "key",
1, 1,
PROTOBUF_C_LABEL_REQUIRED, PROTOBUF_C_LABEL_REQUIRED,
PROTOBUF_C_TYPE_UINT64,
0, /* quantifier_offset */
offsetof(BitcoinOutput, amount),
NULL,
NULL,
0, /* flags */
0,NULL,NULL /* reserved1,reserved2, etc */
},
{
"script",
2,
PROTOBUF_C_LABEL_REQUIRED,
PROTOBUF_C_TYPE_BYTES, PROTOBUF_C_TYPE_BYTES,
0, /* quantifier_offset */ 0, /* quantifier_offset */
offsetof(BitcoinOutput, script), offsetof(BitcoinPubkey, key),
NULL, NULL,
NULL, NULL,
0, /* flags */ 0, /* flags */
0,NULL,NULL /* reserved1,reserved2, etc */ 0,NULL,NULL /* reserved1,reserved2, etc */
}, },
}; };
static const unsigned bitcoin_output__field_indices_by_name[] = { static const unsigned bitcoin_pubkey__field_indices_by_name[] = {
0, /* field[0] = amount */ 0, /* field[0] = key */
1, /* field[1] = script */
}; };
static const ProtobufCIntRange bitcoin_output__number_ranges[1 + 1] = static const ProtobufCIntRange bitcoin_pubkey__number_ranges[1 + 1] =
{ {
{ 1, 0 }, { 1, 0 },
{ 0, 2 } { 0, 1 }
}; };
const ProtobufCMessageDescriptor bitcoin_output__descriptor = const ProtobufCMessageDescriptor bitcoin_pubkey__descriptor =
{ {
PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC,
"bitcoin_output", "bitcoin_pubkey",
"BitcoinOutput", "BitcoinPubkey",
"BitcoinOutput", "BitcoinPubkey",
"", "",
sizeof(BitcoinOutput), sizeof(BitcoinPubkey),
2, 1,
bitcoin_output__field_descriptors, bitcoin_pubkey__field_descriptors,
bitcoin_output__field_indices_by_name, bitcoin_pubkey__field_indices_by_name,
1, bitcoin_output__number_ranges, 1, bitcoin_pubkey__number_ranges,
(ProtobufCMessageInit) bitcoin_output__init, (ProtobufCMessageInit) bitcoin_pubkey__init,
NULL,NULL,NULL /* reserved[123] */ NULL,NULL,NULL /* reserved[123] */
}; };
static const ProtobufCFieldDescriptor bitcoin_pubkey__field_descriptors[1] = static const ProtobufCFieldDescriptor change__field_descriptors[2] =
{ {
{ {
"key", "amount",
1, 1,
PROTOBUF_C_LABEL_REQUIRED, PROTOBUF_C_LABEL_REQUIRED,
PROTOBUF_C_TYPE_BYTES, PROTOBUF_C_TYPE_UINT64,
0, /* quantifier_offset */ 0, /* quantifier_offset */
offsetof(BitcoinPubkey, key), offsetof(Change, amount),
NULL,
NULL, NULL,
0, /* flags */
0,NULL,NULL /* reserved1,reserved2, etc */
},
{
"pubkey",
2,
PROTOBUF_C_LABEL_REQUIRED,
PROTOBUF_C_TYPE_MESSAGE,
0, /* quantifier_offset */
offsetof(Change, pubkey),
&bitcoin_pubkey__descriptor,
NULL, NULL,
0, /* flags */ 0, /* flags */
0,NULL,NULL /* reserved1,reserved2, etc */ 0,NULL,NULL /* reserved1,reserved2, etc */
}, },
}; };
static const unsigned bitcoin_pubkey__field_indices_by_name[] = { static const unsigned change__field_indices_by_name[] = {
0, /* field[0] = key */ 0, /* field[0] = amount */
1, /* field[1] = pubkey */
}; };
static const ProtobufCIntRange bitcoin_pubkey__number_ranges[1 + 1] = static const ProtobufCIntRange change__number_ranges[1 + 1] =
{ {
{ 1, 0 }, { 1, 0 },
{ 0, 1 } { 0, 2 }
}; };
const ProtobufCMessageDescriptor bitcoin_pubkey__descriptor = const ProtobufCMessageDescriptor change__descriptor =
{ {
PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC,
"bitcoin_pubkey", "change",
"BitcoinPubkey", "Change",
"BitcoinPubkey", "Change",
"", "",
sizeof(BitcoinPubkey), sizeof(Change),
1, 2,
bitcoin_pubkey__field_descriptors, change__field_descriptors,
bitcoin_pubkey__field_indices_by_name, change__field_indices_by_name,
1, bitcoin_pubkey__number_ranges, 1, change__number_ranges,
(ProtobufCMessageInit) bitcoin_pubkey__init, (ProtobufCMessageInit) change__init,
NULL,NULL,NULL /* reserved[123] */ NULL,NULL,NULL /* reserved[123] */
}; };
static const ProtobufCFieldDescriptor anchor__field_descriptors[6] = static const ProtobufCFieldDescriptor anchor__field_descriptors[6] =
@ -1389,7 +1389,7 @@ static const ProtobufCFieldDescriptor anchor__field_descriptors[6] =
PROTOBUF_C_TYPE_MESSAGE, PROTOBUF_C_TYPE_MESSAGE,
0, /* quantifier_offset */ 0, /* quantifier_offset */
offsetof(Anchor, change), offsetof(Anchor, change),
&bitcoin_output__descriptor, &change__descriptor,
NULL, NULL,
0, /* flags */ 0, /* flags */
0,NULL,NULL /* reserved1,reserved2, etc */ 0,NULL,NULL /* reserved1,reserved2, etc */

78
lightning.pb-c.h

@ -18,8 +18,8 @@ PROTOBUF_C__BEGIN_DECLS
typedef struct _Sha256Hash Sha256Hash; typedef struct _Sha256Hash Sha256Hash;
typedef struct _Signature Signature; typedef struct _Signature Signature;
typedef struct _BitcoinInput BitcoinInput; typedef struct _BitcoinInput BitcoinInput;
typedef struct _BitcoinOutput BitcoinOutput;
typedef struct _BitcoinPubkey BitcoinPubkey; typedef struct _BitcoinPubkey BitcoinPubkey;
typedef struct _Change Change;
typedef struct _Anchor Anchor; typedef struct _Anchor Anchor;
typedef struct _OpenChannel OpenChannel; typedef struct _OpenChannel OpenChannel;
typedef struct _OpenCommitSig OpenCommitSig; typedef struct _OpenCommitSig OpenCommitSig;
@ -106,20 +106,6 @@ struct _BitcoinInput
, NULL, 0, {0,NULL}, 0 } , NULL, 0, {0,NULL}, 0 }
/*
* A bitcoin output
*/
struct _BitcoinOutput
{
ProtobufCMessage base;
uint64_t amount;
ProtobufCBinaryData script;
};
#define BITCOIN_OUTPUT__INIT \
{ PROTOBUF_C_MESSAGE_INIT (&bitcoin_output__descriptor) \
, 0, {0,NULL} }
/* /*
* Pubkey for commitment transaction input. * Pubkey for commitment transaction input.
*/ */
@ -136,6 +122,20 @@ struct _BitcoinPubkey
, {0,NULL} } , {0,NULL} }
/*
* Change, if we want any.
*/
struct _Change
{
ProtobufCMessage base;
uint64_t amount;
BitcoinPubkey *pubkey;
};
#define CHANGE__INIT \
{ PROTOBUF_C_MESSAGE_INIT (&change__descriptor) \
, 0, NULL }
/* /*
* All about an anchor transaction. * All about an anchor transaction.
*/ */
@ -154,7 +154,7 @@ struct _Anchor
/* /*
* Any change from anchor (in case we don't want to use them all) * Any change from anchor (in case we don't want to use them all)
*/ */
BitcoinOutput *change; Change *change;
/* /*
* How much transaction fee we'll pay in the anchor tx. * How much transaction fee we'll pay in the anchor tx.
*/ */
@ -591,25 +591,6 @@ BitcoinInput *
void bitcoin_input__free_unpacked void bitcoin_input__free_unpacked
(BitcoinInput *message, (BitcoinInput *message,
ProtobufCAllocator *allocator); ProtobufCAllocator *allocator);
/* BitcoinOutput methods */
void bitcoin_output__init
(BitcoinOutput *message);
size_t bitcoin_output__get_packed_size
(const BitcoinOutput *message);
size_t bitcoin_output__pack
(const BitcoinOutput *message,
uint8_t *out);
size_t bitcoin_output__pack_to_buffer
(const BitcoinOutput *message,
ProtobufCBuffer *buffer);
BitcoinOutput *
bitcoin_output__unpack
(ProtobufCAllocator *allocator,
size_t len,
const uint8_t *data);
void bitcoin_output__free_unpacked
(BitcoinOutput *message,
ProtobufCAllocator *allocator);
/* BitcoinPubkey methods */ /* BitcoinPubkey methods */
void bitcoin_pubkey__init void bitcoin_pubkey__init
(BitcoinPubkey *message); (BitcoinPubkey *message);
@ -629,6 +610,25 @@ BitcoinPubkey *
void bitcoin_pubkey__free_unpacked void bitcoin_pubkey__free_unpacked
(BitcoinPubkey *message, (BitcoinPubkey *message,
ProtobufCAllocator *allocator); ProtobufCAllocator *allocator);
/* Change methods */
void change__init
(Change *message);
size_t change__get_packed_size
(const Change *message);
size_t change__pack
(const Change *message,
uint8_t *out);
size_t change__pack_to_buffer
(const Change *message,
ProtobufCBuffer *buffer);
Change *
change__unpack
(ProtobufCAllocator *allocator,
size_t len,
const uint8_t *data);
void change__free_unpacked
(Change *message,
ProtobufCAllocator *allocator);
/* Anchor methods */ /* Anchor methods */
void anchor__init void anchor__init
(Anchor *message); (Anchor *message);
@ -982,12 +982,12 @@ typedef void (*Signature_Closure)
typedef void (*BitcoinInput_Closure) typedef void (*BitcoinInput_Closure)
(const BitcoinInput *message, (const BitcoinInput *message,
void *closure_data); void *closure_data);
typedef void (*BitcoinOutput_Closure)
(const BitcoinOutput *message,
void *closure_data);
typedef void (*BitcoinPubkey_Closure) typedef void (*BitcoinPubkey_Closure)
(const BitcoinPubkey *message, (const BitcoinPubkey *message,
void *closure_data); void *closure_data);
typedef void (*Change_Closure)
(const Change *message,
void *closure_data);
typedef void (*Anchor_Closure) typedef void (*Anchor_Closure)
(const Anchor *message, (const Anchor *message,
void *closure_data); void *closure_data);
@ -1051,8 +1051,8 @@ typedef void (*Pkt_Closure)
extern const ProtobufCMessageDescriptor sha256_hash__descriptor; extern const ProtobufCMessageDescriptor sha256_hash__descriptor;
extern const ProtobufCMessageDescriptor signature__descriptor; extern const ProtobufCMessageDescriptor signature__descriptor;
extern const ProtobufCMessageDescriptor bitcoin_input__descriptor; extern const ProtobufCMessageDescriptor bitcoin_input__descriptor;
extern const ProtobufCMessageDescriptor bitcoin_output__descriptor;
extern const ProtobufCMessageDescriptor bitcoin_pubkey__descriptor; extern const ProtobufCMessageDescriptor bitcoin_pubkey__descriptor;
extern const ProtobufCMessageDescriptor change__descriptor;
extern const ProtobufCMessageDescriptor anchor__descriptor; extern const ProtobufCMessageDescriptor anchor__descriptor;
extern const ProtobufCMessageDescriptor open_channel__descriptor; extern const ProtobufCMessageDescriptor open_channel__descriptor;
extern const ProtobufCMessageDescriptor open_commit_sig__descriptor; extern const ProtobufCMessageDescriptor open_commit_sig__descriptor;

14
lightning.proto

@ -36,18 +36,18 @@ message bitcoin_input {
required uint64 amount = 4; required uint64 amount = 4;
} }
// A bitcoin output
message bitcoin_output {
required uint64 amount = 1;
required bytes script = 2;
}
// Pubkey for commitment transaction input. // Pubkey for commitment transaction input.
message bitcoin_pubkey { message bitcoin_pubkey {
// Either 65 or 33 bytes. // Either 65 or 33 bytes.
required bytes key = 1; required bytes key = 1;
}; };
// Change, if we want any.
message change {
required uint64 amount = 1;
required bitcoin_pubkey pubkey = 2;
}
// All about an anchor transaction. // All about an anchor transaction.
message anchor { message anchor {
// 0 or more unspent inputs we want to use for anchor. // 0 or more unspent inputs we want to use for anchor.
@ -55,7 +55,7 @@ message anchor {
// Pubkey for anchor to pay to for commitment tx (p2sh) // Pubkey for anchor to pay to for commitment tx (p2sh)
required bitcoin_pubkey pubkey = 5; required bitcoin_pubkey pubkey = 5;
// Any change from anchor (in case we don't want to use them all) // Any change from anchor (in case we don't want to use them all)
optional bitcoin_output change = 2; optional change change = 2;
// How much transaction fee we'll pay in the anchor tx. // How much transaction fee we'll pay in the anchor tx.
required uint64 fee = 8; required uint64 fee = 8;
// How much we'll be putting into channel (== sum(inputs) - change - fee) // How much we'll be putting into channel (== sum(inputs) - change - fee)

27
open-channel.c

@ -1,6 +1,6 @@
/* My example: /* My example:
* ./open-channel 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff 50000000000 mzqiPPbjTdcgM6NpNWJLHFt29tWD69bciE cUBCjrdJu8tfvM7FT8So6aqs6G6bZS1Cax6Rc9rFzYL6nYG4XNEC cTuY5gncxDymqe9dfF7R8QFdAsxMZxdViRMjs8Dj7xJJRsQcmPCt 08ffaf638849198f9c8f04aa75d225a5a104d5e7c540770ca55ad08b9a32d10c/1/100000000000/76a9148d2d939aa2aff2d341cde3e61a89bf9c2c21d12388ac > A-open.pb * ./open-channel 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff 50000000000 030da36b810c0930e5fe8b74014665873f6901d9f46018a5fda743a93dec7f0e4e cUBCjrdJu8tfvM7FT8So6aqs6G6bZS1Cax6Rc9rFzYL6nYG4XNEC cTuY5gncxDymqe9dfF7R8QFdAsxMZxdViRMjs8Dj7xJJRsQcmPCt 08ffaf638849198f9c8f04aa75d225a5a104d5e7c540770ca55ad08b9a32d10c/1/100000000000/76a9148d2d939aa2aff2d341cde3e61a89bf9c2c21d12388ac > A-open.pb
* ./open-channel 112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00 9795000 mpDyc5kPAJZB7Zz9iW9acq3Jk8yiTJ7HKj cQXhbUnNRsFcdzTQwjbCrud5yVskHTEas7tZPUWoJYNk5htGQrpi cQXhbUnNRsFcdzTQwjbCrud5yVskHTEas7tZPUWoJYNk5htGQrpi 8cb044605f33ca907b966701f49e0bd80b4294696b57f8cf45f22398a1e63a23/0/9800000/76a9143b2aab840afb327a12c8a90fb4ed45b6892eb80988ac > B-open.pb * ./open-channel 112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00 9795000 022e314a8f7a814e0900bf094f704b233dc693349cf55b888b43d902d7be251e95 cQXhbUnNRsFcdzTQwjbCrud5yVskHTEas7tZPUWoJYNk5htGQrpi cQXhbUnNRsFcdzTQwjbCrud5yVskHTEas7tZPUWoJYNk5htGQrpi 8cb044605f33ca907b966701f49e0bd80b4294696b57f8cf45f22398a1e63a23/0/9800000/76a9143b2aab840afb327a12c8a90fb4ed45b6892eb80988ac > B-open.pb
*/ */
#include <ccan/crypto/shachain/shachain.h> #include <ccan/crypto/shachain/shachain.h>
#include <ccan/short_types/short_types.h> #include <ccan/short_types/short_types.h>
@ -102,7 +102,6 @@ static u64 weak_random64(void)
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
struct sha256 seed, revocation_hash; struct sha256 seed, revocation_hash;
struct bitcoin_address changeaddr;
struct pkt *pkt; struct pkt *pkt;
const tal_t *ctx = tal_arr(NULL, char, 0); const tal_t *ctx = tal_arr(NULL, char, 0);
Anchor anchor = ANCHOR__INIT; Anchor anchor = ANCHOR__INIT;
@ -110,7 +109,7 @@ int main(int argc, char *argv[])
unsigned int locktime_seconds; unsigned int locktime_seconds;
bool testnet; bool testnet;
size_t i; size_t i;
struct pubkey commitkey, outkey; struct pubkey commitkey, outkey, changekey;
EC_KEY *commitprivkey, *outprivkey; EC_KEY *commitprivkey, *outprivkey;
err_set_progname(argv[0]); err_set_progname(argv[0]);
@ -125,7 +124,7 @@ int main(int argc, char *argv[])
locktime_seconds = LOCKTIME_MIN + 24 * 60 * 60; locktime_seconds = LOCKTIME_MIN + 24 * 60 * 60;
opt_register_noarg("--help|-h", opt_usage_and_exit, opt_register_noarg("--help|-h", opt_usage_and_exit,
"<seed> <amount> <changeaddr> <commitprivkey> <outpubkey> <txid>/<outnum>/<satoshis>/<script-in-hex>...\n" "<seed> <amount> <changepubkey> <commitprivkey> <outpubkey> <txid>/<outnum>/<satoshis>/<script-in-hex>...\n"
"A test program to output openchannel on stdout.", "A test program to output openchannel on stdout.",
"Print this message."); "Print this message.");
opt_register_arg("--min-anchor-confirms", opt_register_arg("--min-anchor-confirms",
@ -153,10 +152,8 @@ int main(int argc, char *argv[])
if (!anchor.total) if (!anchor.total)
errx(1, "Invalid total: must be > 0"); errx(1, "Invalid total: must be > 0");
if (!bitcoin_from_base58(&testnet, &changeaddr, argv[3], strlen(argv[3]))) if (!pubkey_from_hexstr(argv[3], &changekey))
errx(1, "Invalid bitcoin address '%s'", argv[3]); errx(1, "Invalid bitcoin pubkey '%s'", argv[3]);
if (!testnet)
errx(1, "Bitcoin address '%s' not on testnet!", argv[3]);
/* We don't really need the privkey here, but it's the most /* We don't really need the privkey here, but it's the most
* convenient way to get the pubkey from bitcoind. */ * convenient way to get the pubkey from bitcoind. */
@ -192,15 +189,11 @@ int main(int argc, char *argv[])
/* If there's change, say where to send it. */ /* If there's change, say where to send it. */
if (total_in != anchor.total + anchor.fee) { if (total_in != anchor.total + anchor.fee) {
anchor.change = tal(ctx, BitcoinOutput); anchor.change = tal(ctx, Change);
bitcoin_output__init(anchor.change); change__init(anchor.change);
anchor.change->pubkey = pubkey_to_proto(anchor.change,
&changekey);
anchor.change->amount = total_in - (anchor.total + anchor.fee); anchor.change->amount = total_in - (anchor.total + anchor.fee);
/* FIXME: Use p2sh? */
anchor.change->script.data
= scriptpubkey_pay_to_pubkeyhash(anchor.change,
&changeaddr);
anchor.change->script.len
= tal_count(anchor.change->script.data);
} }
/* Get first revocation hash. */ /* Get first revocation hash. */

13
pubkey.c

@ -1,5 +1,6 @@
#include "pubkey.h" #include "pubkey.h"
#include <openssl/ecdsa.h> #include <openssl/ecdsa.h>
#include <ccan/str/hex/hex.h>
/* Must agree on key validity with bitcoin! Stolen from bitcoin/src/pubkey.h's /* Must agree on key validity with bitcoin! Stolen from bitcoin/src/pubkey.h's
* GetLen: * GetLen:
@ -52,3 +53,15 @@ bool proto_to_pubkey(const BitcoinPubkey *pb, struct pubkey *key)
memcpy(key->key, pb->key.data, pb->key.len); memcpy(key->key, pb->key.data, pb->key.len);
return true; return true;
} }
bool pubkey_from_hexstr(const char *str, struct pubkey *key)
{
size_t slen = strlen(str), dlen;
dlen = hex_data_size(slen);
if (dlen != 33 && dlen != 65)
return false;
if (!hex_decode(str, slen, key->key, dlen))
return false;
return GetLen(key->key[0]) == dlen;
}

3
pubkey.h

@ -15,4 +15,7 @@ bool proto_to_pubkey(const BitcoinPubkey *pb, struct pubkey *key);
/* 33 or 65 bytes? */ /* 33 or 65 bytes? */
size_t pubkey_len(const struct pubkey *key); size_t pubkey_len(const struct pubkey *key);
/* Convert from hex string (scriptPubKey from validateaddress) */
bool pubkey_from_hexstr(const char *str, struct pubkey *key);
#endif /* LIGHTNING_PUBKEY_H */ #endif /* LIGHTNING_PUBKEY_H */

Loading…
Cancel
Save