Skip to content

603 multisig apply #623

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 38 commits into from
Mar 10, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
585f7bd
#603 initialize multisig service layer
andy-shi88 Feb 28, 2020
e3c3934
#603 implement apply confirmed
andy-shi88 Feb 28, 2020
c282bff
#603 add sender address in pending transaction
andy-shi88 Feb 28, 2020
2348f5f
#603 update multisignature.PendingTransaction schema
andy-shi88 Feb 28, 2020
8f2fb66
#603 delete multisig tx util
andy-shi88 Mar 5, 2020
604d3b6
#603 add sign command to support multisig development
andy-shi88 Mar 5, 2020
12b8e05
#603 add --sender-address flag for generating unsigned bytes
andy-shi88 Mar 5, 2020
37fc748
#604 add sender address to unsigned tx
andy-shi88 Mar 5, 2020
6de2040
#603 return raw error from execute transaction to enable sqlite error…
andy-shi88 Mar 5, 2020
3695419
#603 complete multisig implementation
andy-shi88 Mar 5, 2020
ae1e117
#603 fix tests
andy-shi88 Mar 5, 2020
739eb6e
#603 add latest flag to pending transaction
andy-shi88 Mar 5, 2020
51f8d2b
#603 update pending_transaction status on executed
andy-shi88 Mar 5, 2020
6ff37b7
#603 add latest flag to pending transaction
andy-shi88 Mar 5, 2020
67fe276
#603 add filter to pending transaction query
andy-shi88 Mar 6, 2020
f294095
#603 add latest flag to multisig-info and signatureInfo
andy-shi88 Mar 6, 2020
adb85ed
#603 add multisig-child flag to tx table
andy-shi88 Mar 6, 2020
ff5cbd6
#603 add multisig-child flag to tx table
andy-shi88 Mar 6, 2020
7bb1d03
#603 add multisig-child flag to tx model
andy-shi88 Mar 6, 2020
e024d59
#603 add latest field to all pending tables
andy-shi88 Mar 6, 2020
af50edb
#603 adjust query to handle latest flag
andy-shi88 Mar 6, 2020
0db4de7
#603 insert multisig-child transaction to transaction table
andy-shi88 Mar 6, 2020
e0320a4
#603 dfix test
andy-shi88 Mar 6, 2020
dae6919
#603 adjust cmd tools and crypto package to validate multisig signatu…
andy-shi88 Mar 9, 2020
eb90c5d
#603 fix example cmd
andy-shi88 Mar 9, 2020
3d72069
#603 fix conflicts
andy-shi88 Mar 9, 2020
7932bee
#603 update schema
andy-shi88 Mar 9, 2020
16781c0
#603 remove binary
andy-shi88 Mar 9, 2020
477762f
#603 convert address-Signature to format stringTostring
andy-shi88 Mar 9, 2020
8266de8
#603 fix query inconsistency
andy-shi88 Mar 9, 2020
b610272
#603 handle unsigned transaction execution status
andy-shi88 Mar 9, 2020
df61a13
#603 revert unnecessary change
andy-shi88 Mar 9, 2020
6100956
#603 handle submit multisig info execute multiple tx
andy-shi88 Mar 9, 2020
b3c5faa
#603 fix query inconsistency
andy-shi88 Mar 9, 2020
72d2945
#603 add multisig signature type
andy-shi88 Mar 9, 2020
0a35bf6
#603 add constant for multisig signature validation type;
andy-shi88 Mar 9, 2020
917022a
Merge branch 'develop' into 603-multisig-apply
andy-shi88 Mar 10, 2020
0351e68
#603 remove debug log
andy-shi88 Mar 10, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions api/service/transactionApiService.go
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,7 @@ func (ts *TransactionService) GetTransactions(
&tx.Signature,
&tx.Version,
&tx.TransactionIndex,
&tx.MultisigChild,
)
if err != nil {
if err != sql.ErrNoRows {
Expand Down
5 changes: 5 additions & 0 deletions api/service/transactionApiService_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -591,6 +591,7 @@ func (*mockQueryGetTransactionsSuccess) ExecuteSelect(qStr string, tx bool, args
[]byte{0, 0, 0, 0, 0, 0, 0},
1,
1,
false,
),
)
}
Expand Down Expand Up @@ -684,6 +685,7 @@ func TestTransactionService_GetTransactions(t *testing.T) {
Signature: []byte{0, 0, 0, 0, 0, 0, 0},
Version: 1,
TransactionIndex: 1,
MultisigChild: false,
},
},
},
Expand Down Expand Up @@ -737,6 +739,7 @@ func (*mockQueryGetTransactionSuccess) ExecuteSelect(
8,
[]byte{1, 2, 3, 4, 5, 6, 7, 8},
[]byte{0, 0, 0, 0, 0, 0, 0}, 1, 1,
false,
),
)
return db.Query("")
Expand All @@ -759,6 +762,7 @@ func (*mockQueryGetTransactionSuccess) ExecuteSelectRow(qstr string, tx bool, ar
8,
[]byte{1, 2, 3, 4, 5, 6, 7, 8},
[]byte{0, 0, 0, 0, 0, 0, 0}, 1, 1,
false,
),
)
return db.QueryRow(""), nil
Expand Down Expand Up @@ -837,6 +841,7 @@ func TestTransactionService_GetTransaction(t *testing.T) {
Signature: []byte{0, 0, 0, 0, 0, 0, 0},
Version: 1,
TransactionIndex: 1,
MultisigChild: false,
},
},
}
Expand Down
3 changes: 3 additions & 0 deletions cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import (
"strings"
"time"

"github.com/zoobc/zoobc-core/cmd/signature"

"github.com/spf13/cobra"
"github.com/spf13/viper"
"github.com/zoobc/zoobc-core/cmd/account"
Expand Down Expand Up @@ -73,6 +75,7 @@ func main() {
rootCmd.AddCommand(genesisblock.Commands())
rootCmd.AddCommand(rollback.Commands(sqliteDB))
rootCmd.AddCommand(parserCmd)
rootCmd.AddCommand(signature.Commands())
generateCmd.AddCommand(account.Commands())
generateCmd.AddCommand(transaction.Commands(sqliteDB))
generateCmd.AddCommand(block.Commands())
Expand Down
2 changes: 1 addition & 1 deletion cmd/readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ ofiness deviation starved"

### Account Generating multisig
```bash
go run main.go generate account multisig --addresses BCZnSfqpP5tqFQlMTYkDeBVFWnbyVK7vLr5ORFpTjgtN --addresses BCZD_VxfO2S9aziIL3cn_cXW7uPDVPOrnXuP98GEAUC7 --addresses BCZKLvgUYZ1KKx-jtF9KoJskjVPvB9jpIjfzzI6zDW0J —min-sigs 2 —nonce 3
go run main.go generate account multisig --addresses BCZnSfqpP5tqFQlMTYkDeBVFWnbyVK7vLr5ORFpTjgtN --addresses BCZD_VxfO2S9aziIL3cn_cXW7uPDVPOrnXuP98GEAUC7 --addresses BCZKLvgUYZ1KKx-jtF9KoJskjVPvB9jpIjfzzI6zDW0J —-min-sigs=2 --nonce=3
```

### Account Generate with spesific signature type
Expand Down
71 changes: 71 additions & 0 deletions cmd/signature/cmd.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package signature

import (
"encoding/hex"
"fmt"
"strconv"
"strings"

"github.com/zoobc/zoobc-core/common/model"

"github.com/zoobc/zoobc-core/common/crypto"
"golang.org/x/crypto/sha3"

"github.com/spf13/cobra"
)

var (
/*
Signer command line tools
*/
signerCmd = &cobra.Command{
Use: "sign",
Short: "sign provided data",
Long: "sign any provided data by using the --seed parameter",
}
)

func init() {
signerCmd.Flags().StringVar(&dataHex, "data-hex", "", "hex string of the data to sign")
signerCmd.Flags().StringVar(&dataBytes, "data-bytes", "", "data bytes separated by `, `. eg:"+
"--data-bytes='1, 222, 54, 12, 32'")
signerCmd.Flags().StringVar(&seed, "seed", "", "your secret phrase")
signerCmd.Flags().BoolVar(&hash, "hash", false, "turn this flag on to hash the data before signing")
}

func Commands() *cobra.Command {
signerCmd.Run = SignData
return signerCmd
}

func SignData(*cobra.Command, []string) {
var (
unsignedBytes []byte
hashedUnsignedBytes [32]byte
signature []byte
)
if dataHex != "" {
unsignedBytes, _ = hex.DecodeString(dataHex)
} else {
txByteCharSlice := strings.Split(dataBytes, ", ")
for _, v := range txByteCharSlice {
byteValue, err := strconv.Atoi(v)
if err != nil {
panic("failed to parse transaction bytes")
}
unsignedBytes = append(unsignedBytes, byte(byteValue))
}
}
if hash {
hashedUnsignedBytes = sha3.Sum256(unsignedBytes)
signature, _ = (&crypto.Signature{}).Sign(hashedUnsignedBytes[:], model.SignatureType_DefaultSignature, seed)
} else {
signature, _ = (&crypto.Signature{}).Sign(unsignedBytes, model.SignatureType_DefaultSignature, seed)
}
edUtil := crypto.NewEd25519Signature()
fmt.Printf("account-address:\t%v\n", edUtil.GetAddressFromSeed(seed))
fmt.Printf("transaction-bytes:\t%v\n", unsignedBytes)
fmt.Printf("transaction-hash:\t%v\n", hex.EncodeToString(hashedUnsignedBytes[:]))
fmt.Printf("signature-bytes:\t%v\n", signature)
fmt.Printf("signature-hex:\t%v\n", hex.EncodeToString(signature))
}
8 changes: 8 additions & 0 deletions cmd/signature/const.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package signature

var (
seed string
dataHex string
dataBytes string
hash bool
)
5 changes: 3 additions & 2 deletions cmd/transaction/cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ func init() {
txCmd.PersistentFlags().Int64Var(&fee, "fee", 1, "defines the fee of the transaction")
txCmd.PersistentFlags().BoolVar(&post, "post", false, "post generated bytes to [127.0.0.1:7000](default)")
txCmd.PersistentFlags().StringVar(&postHost, "post-host", "127.0.0.1:7000", "destination of post action")
txCmd.PersistentFlags().StringVar(&senderAddress, "sender-address", "", "transaction's sender address")
txCmd.PersistentFlags().Int32Var(
&senderSignatureType,
"sender-signature-type",
Expand Down Expand Up @@ -150,8 +151,8 @@ func init() {
"to be valid")
multiSigCmd.Flags().StringVar(&unsignedTxHex, "unsigned-transaction", "", "hex string of the unsigned transaction bytes")
multiSigCmd.Flags().StringVar(&txHash, "transaction-hash", "", "hash of transaction being signed by address-signature list (hex)")
multiSigCmd.Flags().StringSliceVar(&addressSignatures, "address-signatures", []string{}, "address-signature list "+
"--address-signatures='address1-signature1,address2-signature2'")
multiSigCmd.Flags().StringToStringVar(&addressSignatures, "address-signatures", make(map[string]string), "address:signature list "+
"--address1='signature1' --address2='signature2'")
}

// Commands set TXGeneratorCommandsInstance that will used by whole commands
Expand Down
3 changes: 2 additions & 1 deletion cmd/transaction/const.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ var (
fee int64
post bool
postHost string
senderAddress string
senderSignatureType int32

// Send money transaction
Expand Down Expand Up @@ -55,7 +56,7 @@ var (

// multiSignature
unsignedTxHex string
addressSignatures []string
addressSignatures map[string]string
txHash string
addresses []string
nonce int64
Expand Down
62 changes: 35 additions & 27 deletions cmd/transaction/generator.go
Original file line number Diff line number Diff line change
Expand Up @@ -239,22 +239,28 @@ func GenerateBasicTransaction(
timestamp, fee int64,
recipientAccountAddress string,
) *model.Transaction {
var senderAccountAddress string
switch model.SignatureType(senderSignatureType) {
case model.SignatureType_DefaultSignature:
senderAccountAddress = crypto.NewEd25519Signature().GetAddressFromSeed(senderSeed)
case model.SignatureType_BitcoinSignature:
var (
bitcoinSig = crypto.NewBitcoinSignature(crypto.DefaultBitcoinNetworkParams(), crypto.DefaultBitcoinCurve())
pubKey = bitcoinSig.GetPublicKeyFromSeed(senderSeed, crypto.DefaultBitcoinPublicKeyFormat())
err error
)
senderAccountAddress, err = bitcoinSig.GetAddressPublicKey(pubKey)
if err != nil {
fmt.Println("GenerateBasicTransaction-BitcoinSignature-Failed GetPublicKey")
var (
senderAccountAddress string
)
if senderSeed == "" {
senderAccountAddress = senderAddress
} else {
switch model.SignatureType(senderSignatureType) {
case model.SignatureType_DefaultSignature:
senderAccountAddress = crypto.NewEd25519Signature().GetAddressFromSeed(senderSeed)
case model.SignatureType_BitcoinSignature:
var (
bitcoinSig = crypto.NewBitcoinSignature(crypto.DefaultBitcoinNetworkParams(), crypto.DefaultBitcoinCurve())
pubKey = bitcoinSig.GetPublicKeyFromSeed(senderSeed, crypto.DefaultBitcoinPublicKeyFormat())
err error
)
senderAccountAddress, err = bitcoinSig.GetAddressPublicKey(pubKey)
if err != nil {
fmt.Println("GenerateBasicTransaction-BitcoinSignature-Failed GetPublicKey")
}
default:
panic("GenerateBasicTransaction-Invalid Signature Type")
}
default:
panic("GenerateBasicTransaction-Invalid Signature Type")
}

if timestamp <= 0 {
Expand Down Expand Up @@ -318,6 +324,9 @@ func GenerateSignedTxBytes(tx *model.Transaction, senderSeed string, signatureTy
tx.Fee += minimumFee

unsignedTxBytes, _ := transactionUtil.GetTransactionBytes(tx, false)
if senderSeed == "" {
return unsignedTxBytes
}
tx.Signature, _ = signature.Sign(
unsignedTxBytes,
model.SignatureType(signatureType),
Expand Down Expand Up @@ -388,7 +397,7 @@ func GeneratedMultiSignatureTransaction(
minSignature uint32,
nonce int64,
unsignedTxHex, txHash string,
addressSignatures, addresses []string,
addressSignatures map[string]string, addresses []string,
) *model.Transaction {
var (
signatures = make(map[string][]byte)
Expand All @@ -410,29 +419,28 @@ func GeneratedMultiSignatureTransaction(
return nil
}
}

if txHash != "" {
transactionHash, err := hex.DecodeString(txHash)
if err != nil {
return nil
}
for _, v := range addressSignatures {
asig := strings.Split(v, "-")
if len(asig) < 2 {
return nil
for k, v := range addressSignatures {
if k == "" {
sigType := util.ConvertUint32ToBytes(2)
signatures[k] = sigType
} else {
signature, err := hex.DecodeString(v)
if err != nil {
return nil
}
signatures[k] = signature
}
signature, err := hex.DecodeString(asig[1])
if err != nil {
return nil
}
signatures[asig[0]] = signature
}
signatureInfo = &model.SignatureInfo{
TransactionHash: transactionHash,
Signatures: signatures,
}
}

tx.TransactionType = util.ConvertBytesToUint32(txTypeMap["multiSignature"])
txBody := &model.MultiSignatureTransactionBody{
MultiSignatureInfo: multiSigInfo,
Expand Down
Binary file added cmd/zoomd
Binary file not shown.
2 changes: 2 additions & 0 deletions common/crypto/signature.go
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,8 @@ func (*Signature) VerifySignature(payload, signature []byte, accountAddress stri
)
}
return nil
case model.SignatureType_MultisigSignature: // multisig validation-only
return nil
default:
return blocker.NewBlocker(
blocker.ValidationErr,
Expand Down
12 changes: 10 additions & 2 deletions common/database/migration.go
Original file line number Diff line number Diff line change
Expand Up @@ -278,20 +278,23 @@ func (m *Migration) Init() error {
`,
`
CREATE TABLE IF NOT EXISTS "pending_transaction" (
"sender_address" TEXT, -- sender of transaction
"transaction_hash" BLOB, -- transaction hash of pending transaction
"transaction_bytes" BLOB, -- full transaction bytes of the pending transaction
"status" INTEGER, -- execution status of the pending transaction
"block_height" INTEGER, -- height when pending transaction inserted/updated
"latest" INTEGER, -- latest flag for pending transaction
PRIMARY KEY("transaction_hash", "block_height")
)
`,
`
CREATE TABLE IF NOT EXISTS "pending_signature" (
"transaction_hash" INTEGER, -- transaction hash of pending transaction being signed
"transaction_hash" BLOB, -- transaction hash of pending transaction being signed
"account_address" TEXT, -- account address of the respective signature
"signature" BLOB, -- full transaction bytes of the pending transaction
"block_height" INTEGER, -- height when pending signature inserted/updated
PRIMARY KEY("account_address", "transaction_hash")
"latest" INTEGER, -- latest flag for pending signature
PRIMARY KEY("account_address", "transaction_hash", "block_height")
)
`,
`
Expand All @@ -301,10 +304,15 @@ func (m *Migration) Init() error {
"nonce" INTEGER, -- full transaction bytes of the pending transaction
"addresses" TEXT, -- list of addresses / participants of the multisig account
"block_height" INTEGER, -- height when multisignature_info inserted / updated
"latest" INTEGER, -- latest flag for pending signature
PRIMARY KEY("multisig_address", "block_height")
)
`,
`
ALTER TABLE "transaction"
ADD COLUMN "multisig_child" INTEGER DEFAULT 0
`,
`
CREATE INDEX "node_registry_height_idx" ON "node_registry" ("height")
`,
`
Expand Down
Loading