testchain: implement Sign function

Sign any data by all consensus nodes.
This commit is contained in:
Evgenii Stratonikov 2020-04-23 16:11:40 +03:00
parent 76a6937f32
commit 0f17402599
2 changed files with 18 additions and 19 deletions

View file

@ -71,17 +71,7 @@ func newBlock(cfg config.ProtocolConfiguration, index uint32, prev util.Uint256,
} }
_ = b.RebuildMerkleRoot() _ = b.RebuildMerkleRoot()
buf := io.NewBufBinWriter() b.Script.InvocationScript = testchain.Sign(b.GetSignedPart())
for i := 0; i < testchain.Size(); i++ {
pKey := testchain.PrivateKey(i)
b := b.GetSignedPart()
sig := pKey.Sign(b)
if len(sig) != 64 {
panic("wrong signature length")
}
emit.Bytes(buf.BinWriter, sig)
}
b.Script.InvocationScript = buf.Bytes()
return b return b
} }
@ -508,15 +498,8 @@ func signTx(bc *Blockchain, txs ...*transaction.Transaction) error {
} }
for _, tx := range txs { for _, tx := range txs {
data := tx.GetSignedPart() data := tx.GetSignedPart()
var invoc []byte
for i := 0; i < testchain.Size(); i++ {
priv := testchain.PrivateKey(i)
invoc = append(invoc, getInvocationScript(data, priv)...)
}
tx.Scripts = []transaction.Witness{{ tx.Scripts = []transaction.Witness{{
InvocationScript: invoc, InvocationScript: testchain.Sign(data),
VerificationScript: rawScript, VerificationScript: rawScript,
}} }}
} }

View file

@ -4,8 +4,10 @@ import (
"github.com/nspcc-dev/neo-go/pkg/crypto/hash" "github.com/nspcc-dev/neo-go/pkg/crypto/hash"
"github.com/nspcc-dev/neo-go/pkg/crypto/keys" "github.com/nspcc-dev/neo-go/pkg/crypto/keys"
"github.com/nspcc-dev/neo-go/pkg/encoding/address" "github.com/nspcc-dev/neo-go/pkg/encoding/address"
"github.com/nspcc-dev/neo-go/pkg/io"
"github.com/nspcc-dev/neo-go/pkg/smartcontract" "github.com/nspcc-dev/neo-go/pkg/smartcontract"
"github.com/nspcc-dev/neo-go/pkg/util" "github.com/nspcc-dev/neo-go/pkg/util"
"github.com/nspcc-dev/neo-go/pkg/vm/emit"
) )
// privNetKeys is a list of unencrypted WIFs sorted by public key. // privNetKeys is a list of unencrypted WIFs sorted by public key.
@ -78,3 +80,17 @@ func MultisigScriptHash() util.Uint160 {
func MultisigAddress() string { func MultisigAddress() string {
return address.Uint160ToString(MultisigScriptHash()) return address.Uint160ToString(MultisigScriptHash())
} }
// Sign signs data by all consensus nodes and returns invocation script.
func Sign(data []byte) []byte {
buf := io.NewBufBinWriter()
for i := 0; i < Size(); i++ {
pKey := PrivateKey(i)
sig := pKey.Sign(data)
if len(sig) != 64 {
panic("wrong signature length")
}
emit.Bytes(buf.BinWriter, sig)
}
return buf.Bytes()
}