Updates for btcutil and btcscript's btcnet conversion.
This commit is contained in:
parent
2c4ea4e4bc
commit
4495a523d8
8 changed files with 106 additions and 62 deletions
|
@ -154,7 +154,7 @@ func (a *Account) txToPairs(pairs map[string]btcutil.Amount,
|
||||||
|
|
||||||
// Add outputs to new tx.
|
// Add outputs to new tx.
|
||||||
for addrStr, amt := range pairs {
|
for addrStr, amt := range pairs {
|
||||||
addr, err := btcutil.DecodeAddress(addrStr, activeNet.Net)
|
addr, err := btcutil.DecodeAddress(addrStr, activeNet.Params)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("cannot decode address: %s", err)
|
return nil, fmt.Errorf("cannot decode address: %s", err)
|
||||||
}
|
}
|
||||||
|
|
3
ntfns.go
3
ntfns.go
|
@ -108,7 +108,8 @@ func NtfnRecvTx(n btcjson.Cmd) error {
|
||||||
// and record the received txout.
|
// and record the received txout.
|
||||||
for outIdx, txout := range tx.MsgTx().TxOut {
|
for outIdx, txout := range tx.MsgTx().TxOut {
|
||||||
var accounts []*Account
|
var accounts []*Account
|
||||||
_, addrs, _, _ := btcscript.ExtractPkScriptAddrs(txout.PkScript, activeNet.Net)
|
_, addrs, _, _ := btcscript.ExtractPkScriptAddrs(txout.PkScript,
|
||||||
|
activeNet.Params)
|
||||||
for _, addr := range addrs {
|
for _, addr := range addrs {
|
||||||
a, err := AcctMgr.AccountByAddress(addr)
|
a, err := AcctMgr.AccountByAddress(addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
34
rpcserver.go
34
rpcserver.go
|
@ -277,7 +277,7 @@ func makeMultiSigScript(keys []string, nRequired int) ([]byte, *btcjson.Error) {
|
||||||
// mixture of the two.
|
// mixture of the two.
|
||||||
for i, a := range keys {
|
for i, a := range keys {
|
||||||
// try to parse as pubkey address
|
// try to parse as pubkey address
|
||||||
a, err := btcutil.DecodeAddress(a, activeNet.Net)
|
a, err := btcutil.DecodeAddress(a, activeNet.Params)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, &btcjson.Error{
|
return nil, &btcjson.Error{
|
||||||
Code: btcjson.ErrParse.Code,
|
Code: btcjson.ErrParse.Code,
|
||||||
|
@ -301,7 +301,7 @@ func makeMultiSigScript(keys []string, nRequired int) ([]byte, *btcjson.Error) {
|
||||||
|
|
||||||
// This will be an addresspubkey
|
// This will be an addresspubkey
|
||||||
a, err := btcutil.DecodeAddress(apkinfo.ExportPubKey(),
|
a, err := btcutil.DecodeAddress(apkinfo.ExportPubKey(),
|
||||||
activeNet.Net)
|
activeNet.Params)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, &btcjson.Error{
|
return nil, &btcjson.Error{
|
||||||
Code: btcjson.ErrParse.Code,
|
Code: btcjson.ErrParse.Code,
|
||||||
|
@ -384,7 +384,7 @@ func CreateMultiSig(icmd btcjson.Cmd) (interface{}, *btcjson.Error) {
|
||||||
return nil, jsonerr
|
return nil, jsonerr
|
||||||
}
|
}
|
||||||
|
|
||||||
address, err := btcutil.NewAddressScriptHash(script, activeNet.Net)
|
address, err := btcutil.NewAddressScriptHash(script, activeNet.Params)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// above is a valid script, shouldn't happen.
|
// above is a valid script, shouldn't happen.
|
||||||
return nil, &btcjson.Error{
|
return nil, &btcjson.Error{
|
||||||
|
@ -409,7 +409,7 @@ func DumpPrivKey(icmd btcjson.Cmd) (interface{}, *btcjson.Error) {
|
||||||
return nil, &btcjson.ErrInternal
|
return nil, &btcjson.ErrInternal
|
||||||
}
|
}
|
||||||
|
|
||||||
addr, err := btcutil.DecodeAddress(cmd.Address, activeNet.Net)
|
addr, err := btcutil.DecodeAddress(cmd.Address, activeNet.Params)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, &btcjson.ErrInvalidAddressOrKey
|
return nil, &btcjson.ErrInvalidAddressOrKey
|
||||||
}
|
}
|
||||||
|
@ -616,11 +616,11 @@ func GetAccount(icmd btcjson.Cmd) (interface{}, *btcjson.Error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Is address valid?
|
// Is address valid?
|
||||||
addr, err := btcutil.DecodeAddress(cmd.Address, activeNet.Net)
|
addr, err := btcutil.DecodeAddress(cmd.Address, activeNet.Params)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, &btcjson.ErrInvalidAddressOrKey
|
return nil, &btcjson.ErrInvalidAddressOrKey
|
||||||
}
|
}
|
||||||
if !addr.IsForNet(activeNet.Net) {
|
if !addr.IsForNet(activeNet.Params) {
|
||||||
return nil, &btcjson.ErrInvalidAddressOrKey
|
return nil, &btcjson.ErrInvalidAddressOrKey
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -694,7 +694,7 @@ func GetAddressBalance(icmd btcjson.Cmd) (interface{}, *btcjson.Error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Is address valid?
|
// Is address valid?
|
||||||
addr, err := btcutil.DecodeAddress(cmd.Address, activeNet.Net)
|
addr, err := btcutil.DecodeAddress(cmd.Address, activeNet.Params)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, &btcjson.ErrInvalidAddressOrKey
|
return nil, &btcjson.ErrInvalidAddressOrKey
|
||||||
}
|
}
|
||||||
|
@ -1220,12 +1220,12 @@ func ListAddressTransactions(icmd btcjson.Cmd) (interface{}, *btcjson.Error) {
|
||||||
// Decode addresses.
|
// Decode addresses.
|
||||||
pkHashMap := make(map[string]struct{})
|
pkHashMap := make(map[string]struct{})
|
||||||
for _, addrStr := range cmd.Addresses {
|
for _, addrStr := range cmd.Addresses {
|
||||||
addr, err := btcutil.DecodeAddress(addrStr, activeNet.Net)
|
addr, err := btcutil.DecodeAddress(addrStr, activeNet.Params)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, &btcjson.ErrInvalidAddressOrKey
|
return nil, &btcjson.ErrInvalidAddressOrKey
|
||||||
}
|
}
|
||||||
apkh, ok := addr.(*btcutil.AddressPubKeyHash)
|
apkh, ok := addr.(*btcutil.AddressPubKeyHash)
|
||||||
if !ok || !apkh.IsForNet(activeNet.Net) {
|
if !ok || !apkh.IsForNet(activeNet.Params) {
|
||||||
return nil, &btcjson.ErrInvalidAddressOrKey
|
return nil, &btcjson.ErrInvalidAddressOrKey
|
||||||
}
|
}
|
||||||
pkHashMap[string(addr.ScriptAddress())] = struct{}{}
|
pkHashMap[string(addr.ScriptAddress())] = struct{}{}
|
||||||
|
@ -1300,7 +1300,7 @@ func ListUnspent(icmd btcjson.Cmd) (interface{}, *btcjson.Error) {
|
||||||
if len(cmd.Addresses) != 0 {
|
if len(cmd.Addresses) != 0 {
|
||||||
// confirm that all of them are good:
|
// confirm that all of them are good:
|
||||||
for _, as := range cmd.Addresses {
|
for _, as := range cmd.Addresses {
|
||||||
a, err := btcutil.DecodeAddress(as, activeNet.Net)
|
a, err := btcutil.DecodeAddress(as, activeNet.Params)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, &btcjson.ErrInvalidAddressOrKey
|
return nil, &btcjson.ErrInvalidAddressOrKey
|
||||||
}
|
}
|
||||||
|
@ -1635,7 +1635,7 @@ func SignMessage(icmd btcjson.Cmd) (interface{}, *btcjson.Error) {
|
||||||
return nil, &btcjson.ErrInternal
|
return nil, &btcjson.ErrInternal
|
||||||
}
|
}
|
||||||
|
|
||||||
addr, err := btcutil.DecodeAddress(cmd.Address, activeNet.Net)
|
addr, err := btcutil.DecodeAddress(cmd.Address, activeNet.Params)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, &btcjson.Error{
|
return nil, &btcjson.Error{
|
||||||
Code: btcjson.ErrParse.Code,
|
Code: btcjson.ErrParse.Code,
|
||||||
|
@ -1800,7 +1800,7 @@ func SignRawTransaction(icmd btcjson.Cmd) (interface{}, *btcjson.Error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
addr, err := btcutil.NewAddressScriptHash(redeemScript,
|
addr, err := btcutil.NewAddressScriptHash(redeemScript,
|
||||||
activeNet.Net)
|
activeNet.Params)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, &btcjson.Error{
|
return nil, &btcjson.Error{
|
||||||
Code: btcjson.ErrDeserialization.Code,
|
Code: btcjson.ErrDeserialization.Code,
|
||||||
|
@ -1861,7 +1861,7 @@ func SignRawTransaction(icmd btcjson.Cmd) (interface{}, *btcjson.Error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if !wif.IsForNet(activeNet.Net) {
|
if !wif.IsForNet(activeNet.Params) {
|
||||||
return nil, &btcjson.Error{
|
return nil, &btcjson.Error{
|
||||||
Code: btcjson.ErrDeserialization.Code,
|
Code: btcjson.ErrDeserialization.Code,
|
||||||
Message: "key network doesn't match " +
|
Message: "key network doesn't match " +
|
||||||
|
@ -1870,7 +1870,7 @@ func SignRawTransaction(icmd btcjson.Cmd) (interface{}, *btcjson.Error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
addr, err := btcutil.NewAddressPubKey(wif.SerializePubKey(),
|
addr, err := btcutil.NewAddressPubKey(wif.SerializePubKey(),
|
||||||
activeNet.Net)
|
activeNet.Params)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, &btcjson.Error{
|
return nil, &btcjson.Error{
|
||||||
Code: btcjson.ErrDeserialization.Code,
|
Code: btcjson.ErrDeserialization.Code,
|
||||||
|
@ -2017,7 +2017,7 @@ func SignRawTransaction(icmd btcjson.Cmd) (interface{}, *btcjson.Error) {
|
||||||
if (hashType&btcscript.SigHashSingle) !=
|
if (hashType&btcscript.SigHashSingle) !=
|
||||||
btcscript.SigHashSingle || i < len(msgTx.TxOut) {
|
btcscript.SigHashSingle || i < len(msgTx.TxOut) {
|
||||||
|
|
||||||
script, err := btcscript.SignTxOutput(activeNet.Net,
|
script, err := btcscript.SignTxOutput(activeNet.Params,
|
||||||
msgTx, i, input, byte(hashType), getKey,
|
msgTx, i, input, byte(hashType), getKey,
|
||||||
getScript, txIn.SignatureScript)
|
getScript, txIn.SignatureScript)
|
||||||
// Failure to sign isn't an error, it just means that
|
// Failure to sign isn't an error, it just means that
|
||||||
|
@ -2060,7 +2060,7 @@ func ValidateAddress(icmd btcjson.Cmd) (interface{}, *btcjson.Error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
result := btcjson.ValidateAddressResult{}
|
result := btcjson.ValidateAddressResult{}
|
||||||
addr, err := btcutil.DecodeAddress(cmd.Address, activeNet.Net)
|
addr, err := btcutil.DecodeAddress(cmd.Address, activeNet.Params)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return result, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
|
@ -2116,7 +2116,7 @@ func VerifyMessage(icmd btcjson.Cmd) (interface{}, *btcjson.Error) {
|
||||||
return nil, &btcjson.ErrInternal
|
return nil, &btcjson.ErrInternal
|
||||||
}
|
}
|
||||||
|
|
||||||
addr, err := btcutil.DecodeAddress(cmd.Address, activeNet.Net)
|
addr, err := btcutil.DecodeAddress(cmd.Address, activeNet.Params)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, &btcjson.Error{
|
return nil, &btcjson.Error{
|
||||||
Code: btcjson.ErrParse.Code,
|
Code: btcjson.ErrParse.Code,
|
||||||
|
|
|
@ -19,15 +19,15 @@ package txstore
|
||||||
import (
|
import (
|
||||||
"github.com/conformal/btcchain"
|
"github.com/conformal/btcchain"
|
||||||
"github.com/conformal/btcjson"
|
"github.com/conformal/btcjson"
|
||||||
|
"github.com/conformal/btcnet"
|
||||||
"github.com/conformal/btcscript"
|
"github.com/conformal/btcscript"
|
||||||
"github.com/conformal/btcutil"
|
"github.com/conformal/btcutil"
|
||||||
"github.com/conformal/btcwire"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// ToJSON returns a slice of btcjson listtransaction result types for all credits
|
// ToJSON returns a slice of btcjson listtransaction result types for all credits
|
||||||
// and debits of this transaction.
|
// and debits of this transaction.
|
||||||
func (t *TxRecord) ToJSON(account string, chainHeight int32,
|
func (t *TxRecord) ToJSON(account string, chainHeight int32,
|
||||||
net btcwire.BitcoinNet) ([]btcjson.ListTransactionsResult, error) {
|
net *btcnet.Params) ([]btcjson.ListTransactionsResult, error) {
|
||||||
|
|
||||||
var results []btcjson.ListTransactionsResult
|
var results []btcjson.ListTransactionsResult
|
||||||
if d := t.Debits(); d != nil {
|
if d := t.Debits(); d != nil {
|
||||||
|
@ -50,7 +50,7 @@ func (t *TxRecord) ToJSON(account string, chainHeight int32,
|
||||||
// ToJSON returns a slice of objects that may be marshaled as a JSON array
|
// ToJSON returns a slice of objects that may be marshaled as a JSON array
|
||||||
// of JSON objects for a listtransactions RPC reply.
|
// of JSON objects for a listtransactions RPC reply.
|
||||||
func (d *Debits) ToJSON(account string, chainHeight int32,
|
func (d *Debits) ToJSON(account string, chainHeight int32,
|
||||||
net btcwire.BitcoinNet) ([]btcjson.ListTransactionsResult, error) {
|
net *btcnet.Params) ([]btcjson.ListTransactionsResult, error) {
|
||||||
|
|
||||||
msgTx := d.Tx().MsgTx()
|
msgTx := d.Tx().MsgTx()
|
||||||
reply := make([]btcjson.ListTransactionsResult, 0, len(msgTx.TxOut))
|
reply := make([]btcjson.ListTransactionsResult, 0, len(msgTx.TxOut))
|
||||||
|
@ -93,7 +93,7 @@ func (d *Debits) ToJSON(account string, chainHeight int32,
|
||||||
// ToJSON returns a slice of objects that may be marshaled as a JSON array
|
// ToJSON returns a slice of objects that may be marshaled as a JSON array
|
||||||
// of JSON objects for a listtransactions RPC reply.
|
// of JSON objects for a listtransactions RPC reply.
|
||||||
func (c *Credit) ToJSON(account string, chainHeight int32,
|
func (c *Credit) ToJSON(account string, chainHeight int32,
|
||||||
net btcwire.BitcoinNet) (btcjson.ListTransactionsResult, error) {
|
net *btcnet.Params) (btcjson.ListTransactionsResult, error) {
|
||||||
|
|
||||||
msgTx := c.Tx().MsgTx()
|
msgTx := c.Tx().MsgTx()
|
||||||
txout := msgTx.TxOut[c.OutputIndex]
|
txout := msgTx.TxOut[c.OutputIndex]
|
||||||
|
|
|
@ -1395,7 +1395,7 @@ func (c *Credit) Addresses(net *btcnet.Params) (btcscript.ScriptClass,
|
||||||
|
|
||||||
msgTx := c.Tx().MsgTx()
|
msgTx := c.Tx().MsgTx()
|
||||||
pkScript := msgTx.TxOut[c.OutputIndex].PkScript
|
pkScript := msgTx.TxOut[c.OutputIndex].PkScript
|
||||||
return btcscript.ExtractPkScriptAddrs(pkScript, net.Net)
|
return btcscript.ExtractPkScriptAddrs(pkScript, net)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Change returns whether the credit is the result of a change output.
|
// Change returns whether the credit is the result of a change output.
|
||||||
|
|
|
@ -20,6 +20,7 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/conformal/btcnet"
|
||||||
"github.com/conformal/btcutil"
|
"github.com/conformal/btcutil"
|
||||||
. "github.com/conformal/btcwallet/txstore"
|
. "github.com/conformal/btcwallet/txstore"
|
||||||
"github.com/conformal/btcwire"
|
"github.com/conformal/btcwire"
|
||||||
|
@ -108,7 +109,7 @@ func TestInsertsCreditsDebitsRollbacks(t *testing.T) {
|
||||||
}
|
}
|
||||||
// Verify that we can create the JSON output without any
|
// Verify that we can create the JSON output without any
|
||||||
// errors.
|
// errors.
|
||||||
_, err = r.ToJSON("", 100, btcwire.MainNet)
|
_, err = r.ToJSON("", 100, &btcnet.MainNetParams)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -134,7 +135,7 @@ func TestInsertsCreditsDebitsRollbacks(t *testing.T) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = r.ToJSON("", 100, btcwire.MainNet)
|
_, err = r.ToJSON("", 100, &btcnet.MainNetParams)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -161,7 +162,7 @@ func TestInsertsCreditsDebitsRollbacks(t *testing.T) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = r.ToJSON("", 100, btcwire.MainNet)
|
_, err = r.ToJSON("", 100, &btcnet.MainNetParams)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -188,7 +189,7 @@ func TestInsertsCreditsDebitsRollbacks(t *testing.T) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = r.ToJSON("", 100, btcwire.MainNet)
|
_, err = r.ToJSON("", 100, &btcnet.MainNetParams)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -231,7 +232,7 @@ func TestInsertsCreditsDebitsRollbacks(t *testing.T) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = r.ToJSON("", 100, btcwire.MainNet)
|
_, err = r.ToJSON("", 100, &btcnet.MainNetParams)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -263,7 +264,7 @@ func TestInsertsCreditsDebitsRollbacks(t *testing.T) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = r.ToJSON("", 100, btcwire.MainNet)
|
_, err = r.ToJSON("", 100, &btcnet.MainNetParams)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -294,7 +295,7 @@ func TestInsertsCreditsDebitsRollbacks(t *testing.T) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = r.ToJSON("", 100, btcwire.MainNet)
|
_, err = r.ToJSON("", 100, &btcnet.MainNetParams)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -320,7 +321,7 @@ func TestInsertsCreditsDebitsRollbacks(t *testing.T) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = r.ToJSON("", 100, btcwire.MainNet)
|
_, err = r.ToJSON("", 100, &btcnet.MainNetParams)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -348,7 +349,7 @@ func TestInsertsCreditsDebitsRollbacks(t *testing.T) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = r.ToJSON("", 100, btcwire.MainNet)
|
_, err = r.ToJSON("", 100, &btcnet.MainNetParams)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -373,7 +374,7 @@ func TestInsertsCreditsDebitsRollbacks(t *testing.T) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = r.ToJSON("", 100, btcwire.MainNet)
|
_, err = r.ToJSON("", 100, &btcnet.MainNetParams)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -456,7 +457,7 @@ func TestInsertsCreditsDebitsRollbacks(t *testing.T) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = r.ToJSON("", 100, btcwire.MainNet)
|
_, err = r.ToJSON("", 100, &btcnet.MainNetParams)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -485,6 +485,45 @@ func (v *varEntries) ReadFrom(r io.Reader) (n int64, err error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Wallet uses a custom network parameters type so it can be an io.ReaderFrom.
|
||||||
|
// Due to the way and order that wallets are currently serialized and how
|
||||||
|
// address reading requires the wallet's network parameters, setting and
|
||||||
|
// erroring on unknown wallet networks must happen on the read itself and not
|
||||||
|
// after the fact. This is admitidly a hack, but with a bip32 keystore on the
|
||||||
|
// horizon I'm not too motivated to clean this up.
|
||||||
|
type netParams btcnet.Params
|
||||||
|
|
||||||
|
func (net *netParams) ReadFrom(r io.Reader) (int64, error) {
|
||||||
|
var buf [4]byte
|
||||||
|
uint32Bytes := buf[:4]
|
||||||
|
|
||||||
|
n, err := io.ReadFull(r, uint32Bytes)
|
||||||
|
n64 := int64(n)
|
||||||
|
if err != nil {
|
||||||
|
return n64, err
|
||||||
|
}
|
||||||
|
|
||||||
|
switch btcwire.BitcoinNet(binary.LittleEndian.Uint32(uint32Bytes)) {
|
||||||
|
case btcwire.MainNet:
|
||||||
|
*net = *(*netParams)(&btcnet.MainNetParams)
|
||||||
|
case btcwire.TestNet3:
|
||||||
|
*net = *(*netParams)(&btcnet.TestNet3Params)
|
||||||
|
default:
|
||||||
|
return n64, errors.New("unknown network")
|
||||||
|
}
|
||||||
|
return n64, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (net *netParams) WriteTo(w io.Writer) (int64, error) {
|
||||||
|
var buf [4]byte
|
||||||
|
uint32Bytes := buf[:4]
|
||||||
|
|
||||||
|
binary.LittleEndian.PutUint32(uint32Bytes, uint32(net.Net))
|
||||||
|
n, err := w.Write(uint32Bytes)
|
||||||
|
n64 := int64(n)
|
||||||
|
return n64, err
|
||||||
|
}
|
||||||
|
|
||||||
// Stringified byte slices for use as map lookup keys.
|
// Stringified byte slices for use as map lookup keys.
|
||||||
type addressKey string
|
type addressKey string
|
||||||
type transactionHashKey string
|
type transactionHashKey string
|
||||||
|
@ -500,7 +539,7 @@ func getAddressKey(addr btcutil.Address) addressKey {
|
||||||
// write to any type of byte streams, including files.
|
// write to any type of byte streams, including files.
|
||||||
type Wallet struct {
|
type Wallet struct {
|
||||||
vers version
|
vers version
|
||||||
net btcwire.BitcoinNet
|
net *netParams
|
||||||
flags walletFlags
|
flags walletFlags
|
||||||
createDate int64
|
createDate int64
|
||||||
name [32]byte
|
name [32]byte
|
||||||
|
@ -560,7 +599,7 @@ func NewWallet(name, desc string, passphrase []byte, net *btcnet.Params,
|
||||||
// Create and fill wallet.
|
// Create and fill wallet.
|
||||||
w := &Wallet{
|
w := &Wallet{
|
||||||
vers: VersCurrent,
|
vers: VersCurrent,
|
||||||
net: net.Net,
|
net: (*netParams)(net),
|
||||||
flags: walletFlags{
|
flags: walletFlags{
|
||||||
useEncryption: true,
|
useEncryption: true,
|
||||||
watchingOnly: false,
|
watchingOnly: false,
|
||||||
|
@ -638,6 +677,7 @@ func (w *Wallet) Name() string {
|
||||||
func (w *Wallet) ReadFrom(r io.Reader) (n int64, err error) {
|
func (w *Wallet) ReadFrom(r io.Reader) (n int64, err error) {
|
||||||
var read int64
|
var read int64
|
||||||
|
|
||||||
|
w.net = &netParams{}
|
||||||
w.addrMap = make(map[addressKey]walletAddress)
|
w.addrMap = make(map[addressKey]walletAddress)
|
||||||
w.addrCommentMap = make(map[addressKey]comment)
|
w.addrCommentMap = make(map[addressKey]comment)
|
||||||
w.chainIdxMap = make(map[int64]btcutil.Address)
|
w.chainIdxMap = make(map[int64]btcutil.Address)
|
||||||
|
@ -653,7 +693,7 @@ func (w *Wallet) ReadFrom(r io.Reader) (n int64, err error) {
|
||||||
datas := []interface{}{
|
datas := []interface{}{
|
||||||
&id,
|
&id,
|
||||||
&w.vers,
|
&w.vers,
|
||||||
&w.net,
|
w.net,
|
||||||
&w.flags,
|
&w.flags,
|
||||||
make([]byte, 6), // Bytes for Armory unique ID
|
make([]byte, 6), // Bytes for Armory unique ID
|
||||||
&w.createDate,
|
&w.createDate,
|
||||||
|
@ -727,7 +767,7 @@ func (w *Wallet) ReadFrom(r io.Reader) (n int64, err error) {
|
||||||
w.importedAddrs = append(w.importedAddrs, &e.script)
|
w.importedAddrs = append(w.importedAddrs, &e.script)
|
||||||
|
|
||||||
case *addrCommentEntry:
|
case *addrCommentEntry:
|
||||||
addr, err := e.address(w.net)
|
addr, err := e.address(w.Net())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
@ -802,7 +842,7 @@ func (w *Wallet) WriteTo(wtr io.Writer) (n int64, err error) {
|
||||||
datas := []interface{}{
|
datas := []interface{}{
|
||||||
&fileID,
|
&fileID,
|
||||||
&VersCurrent,
|
&VersCurrent,
|
||||||
&w.net,
|
w.net,
|
||||||
&w.flags,
|
&w.flags,
|
||||||
make([]byte, 6), // Bytes for Armory unique ID
|
make([]byte, 6), // Bytes for Armory unique ID
|
||||||
&w.createDate,
|
&w.createDate,
|
||||||
|
@ -1195,9 +1235,9 @@ func (w *Wallet) Address(a btcutil.Address) (WalletAddress, error) {
|
||||||
return btcaddr, nil
|
return btcaddr, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Net returns the bitcoin network identifier for this wallet.
|
// Net returns the bitcoin network parameters for this wallet.
|
||||||
func (w *Wallet) Net() btcwire.BitcoinNet {
|
func (w *Wallet) Net() *btcnet.Params {
|
||||||
return w.net
|
return (*btcnet.Params)(w.net)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetSyncStatus sets the sync status for a single wallet address. This
|
// SetSyncStatus sets the sync status for a single wallet address. This
|
||||||
|
@ -2530,7 +2570,15 @@ func (a *btcAddress) ExportPrivKey() (*btcutil.WIF, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return btcutil.NewWIF((*btcec.PrivateKey)(pk), a.wallet.Net(), a.Compressed())
|
// NewWIF only errors if the network is nil. In this case, panic,
|
||||||
|
// as our program's assumptions are so broken that this needs to be
|
||||||
|
// caught immediately, and a stack trace here is more useful than
|
||||||
|
// elsewhere.
|
||||||
|
wif, err := btcutil.NewWIF((*btcec.PrivateKey)(pk), a.wallet.Net(), a.Compressed())
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return wif, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// watchingCopy creates a copy of an address without a private key.
|
// watchingCopy creates a copy of an address without a private key.
|
||||||
|
@ -3168,7 +3216,7 @@ type addrCommentEntry struct {
|
||||||
comment []byte
|
comment []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *addrCommentEntry) address(net btcwire.BitcoinNet) (*btcutil.AddressPubKeyHash, error) {
|
func (e *addrCommentEntry) address(net *btcnet.Params) (*btcutil.AddressPubKeyHash, error) {
|
||||||
return btcutil.NewAddressPubKeyHash(e.pubKeyHash160[:], net)
|
return btcutil.NewAddressPubKeyHash(e.pubKeyHash160[:], net)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,10 +32,10 @@ import (
|
||||||
"github.com/davecgh/go-spew/spew"
|
"github.com/davecgh/go-spew/spew"
|
||||||
)
|
)
|
||||||
|
|
||||||
var netParams = &btcnet.MainNetParams
|
var tstNetParams = &btcnet.MainNetParams
|
||||||
|
|
||||||
func TestBtcAddressSerializer(t *testing.T) {
|
func TestBtcAddressSerializer(t *testing.T) {
|
||||||
fakeWallet := &Wallet{net: netParams.Net}
|
fakeWallet := &Wallet{net: (*netParams)(tstNetParams)}
|
||||||
kdfp := &kdfParameters{
|
kdfp := &kdfParameters{
|
||||||
mem: 1024,
|
mem: 1024,
|
||||||
nIter: 5,
|
nIter: 5,
|
||||||
|
@ -88,7 +88,7 @@ func TestBtcAddressSerializer(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestScriptAddressSerializer(t *testing.T) {
|
func TestScriptAddressSerializer(t *testing.T) {
|
||||||
fakeWallet := &Wallet{net: netParams.Net}
|
fakeWallet := &Wallet{net: (*netParams)(tstNetParams)}
|
||||||
script := []byte{btcscript.OP_TRUE, btcscript.OP_DUP,
|
script := []byte{btcscript.OP_TRUE, btcscript.OP_DUP,
|
||||||
btcscript.OP_DROP}
|
btcscript.OP_DROP}
|
||||||
addr, err := newScriptAddress(fakeWallet, script, &BlockStamp{})
|
addr, err := newScriptAddress(fakeWallet, script, &BlockStamp{})
|
||||||
|
@ -120,7 +120,7 @@ func TestScriptAddressSerializer(t *testing.T) {
|
||||||
func TestWalletCreationSerialization(t *testing.T) {
|
func TestWalletCreationSerialization(t *testing.T) {
|
||||||
createdAt := &BlockStamp{}
|
createdAt := &BlockStamp{}
|
||||||
w1, err := NewWallet("banana wallet", "A wallet for testing.",
|
w1, err := NewWallet("banana wallet", "A wallet for testing.",
|
||||||
[]byte("banana"), netParams, createdAt, 100)
|
[]byte("banana"), tstNetParams, createdAt, 100)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error("Error creating new wallet: " + err.Error())
|
t.Error("Error creating new wallet: " + err.Error())
|
||||||
return
|
return
|
||||||
|
@ -332,7 +332,7 @@ func TestWalletPubkeyChaining(t *testing.T) {
|
||||||
const keypoolSize = 5
|
const keypoolSize = 5
|
||||||
|
|
||||||
w, err := NewWallet("banana wallet", "A wallet for testing.",
|
w, err := NewWallet("banana wallet", "A wallet for testing.",
|
||||||
[]byte("banana"), netParams, &BlockStamp{}, keypoolSize)
|
[]byte("banana"), tstNetParams, &BlockStamp{}, keypoolSize)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error("Error creating new wallet: " + err.Error())
|
t.Error("Error creating new wallet: " + err.Error())
|
||||||
return
|
return
|
||||||
|
@ -508,7 +508,7 @@ func TestWatchingWalletExport(t *testing.T) {
|
||||||
const keypoolSize = 10
|
const keypoolSize = 10
|
||||||
createdAt := &BlockStamp{}
|
createdAt := &BlockStamp{}
|
||||||
w, err := NewWallet("banana wallet", "A wallet for testing.",
|
w, err := NewWallet("banana wallet", "A wallet for testing.",
|
||||||
[]byte("banana"), netParams, createdAt, keypoolSize)
|
[]byte("banana"), tstNetParams, createdAt, keypoolSize)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error("Error creating new wallet: " + err.Error())
|
t.Error("Error creating new wallet: " + err.Error())
|
||||||
return
|
return
|
||||||
|
@ -717,10 +717,7 @@ func TestWatchingWalletExport(t *testing.T) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
pk, _ := btcec.PrivKeyFromBytes(btcec.S256(), make([]byte, 32))
|
pk, _ := btcec.PrivKeyFromBytes(btcec.S256(), make([]byte, 32))
|
||||||
wif, err := btcutil.NewWIF(pk, netParams.Net, true)
|
wif := btcutil.NewWIF(pk, tstNetParams, true)
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
if _, err := ww.ImportPrivateKey(wif, createdAt); err != ErrWalletIsWatchingOnly {
|
if _, err := ww.ImportPrivateKey(wif, createdAt); err != ErrWalletIsWatchingOnly {
|
||||||
t.Errorf("Nonsensical func ImportPrivateKey returned no or incorrect error: %v", err)
|
t.Errorf("Nonsensical func ImportPrivateKey returned no or incorrect error: %v", err)
|
||||||
return
|
return
|
||||||
|
@ -732,7 +729,7 @@ func TestImportPrivateKey(t *testing.T) {
|
||||||
createHeight := int32(100)
|
createHeight := int32(100)
|
||||||
createdAt := &BlockStamp{Height: createHeight}
|
createdAt := &BlockStamp{Height: createHeight}
|
||||||
w, err := NewWallet("banana wallet", "A wallet for testing.",
|
w, err := NewWallet("banana wallet", "A wallet for testing.",
|
||||||
[]byte("banana"), netParams, createdAt, keypoolSize)
|
[]byte("banana"), tstNetParams, createdAt, keypoolSize)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error("Error creating new wallet: " + err.Error())
|
t.Error("Error creating new wallet: " + err.Error())
|
||||||
return
|
return
|
||||||
|
@ -761,10 +758,7 @@ func TestImportPrivateKey(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// import priv key
|
// import priv key
|
||||||
wif, err := btcutil.NewWIF((*btcec.PrivateKey)(pk), netParams.Net, false)
|
wif := btcutil.NewWIF((*btcec.PrivateKey)(pk), tstNetParams, false)
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
importHeight := int32(50)
|
importHeight := int32(50)
|
||||||
importedAt := &BlockStamp{Height: importHeight}
|
importedAt := &BlockStamp{Height: importHeight}
|
||||||
address, err := w.ImportPrivateKey(wif, importedAt)
|
address, err := w.ImportPrivateKey(wif, importedAt)
|
||||||
|
@ -927,7 +921,7 @@ func TestImportScript(t *testing.T) {
|
||||||
createHeight := int32(100)
|
createHeight := int32(100)
|
||||||
createdAt := &BlockStamp{Height: createHeight}
|
createdAt := &BlockStamp{Height: createHeight}
|
||||||
w, err := NewWallet("banana wallet", "A wallet for testing.",
|
w, err := NewWallet("banana wallet", "A wallet for testing.",
|
||||||
[]byte("banana"), netParams, createdAt, keypoolSize)
|
[]byte("banana"), tstNetParams, createdAt, keypoolSize)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error("Error creating new wallet: " + err.Error())
|
t.Error("Error creating new wallet: " + err.Error())
|
||||||
return
|
return
|
||||||
|
@ -1198,7 +1192,7 @@ func TestChangePassphrase(t *testing.T) {
|
||||||
const keypoolSize = 10
|
const keypoolSize = 10
|
||||||
createdAt := &BlockStamp{}
|
createdAt := &BlockStamp{}
|
||||||
w, err := NewWallet("banana wallet", "A wallet for testing.",
|
w, err := NewWallet("banana wallet", "A wallet for testing.",
|
||||||
[]byte("banana"), netParams, createdAt, keypoolSize)
|
[]byte("banana"), tstNetParams, createdAt, keypoolSize)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error("Error creating new wallet: " + err.Error())
|
t.Error("Error creating new wallet: " + err.Error())
|
||||||
return
|
return
|
||||||
|
|
Loading…
Reference in a new issue