Skip to content

Commit

Permalink
Add chord address to signature chain elememt
Browse files Browse the repository at this point in the history
Signed-off-by: Yilun <zyl.skysniper@gmail.com>
  • Loading branch information
yilunzhang authored and dreamfly281 committed Jun 12, 2018
1 parent 89a8fe4 commit 82e3ba7
Show file tree
Hide file tree
Showing 11 changed files with 84 additions and 55 deletions.
1 change: 1 addition & 0 deletions net/node/relay.go
Expand Up @@ -75,6 +75,7 @@ func (node *node) SendRelayPacket(srcID, srcPubkey, destID, destPubkey, payload,
uint32(len(payload)),
&payloadHash256,
&prevHeaderHash,
srcID,
srcPubkey,
destPubkey,
signature,
Expand Down
2 changes: 1 addition & 1 deletion nknd.go
Expand Up @@ -120,7 +120,7 @@ func nknMain() error {
// if InitLedger return err, ledger.DefaultLedger is uninitialized.
defer ledger.DefaultLedger.Store.Close()

err = por.InitPorServer(account)
err = por.InitPorServer(account, ring)
if err != nil {
return errors.New("PorServer initialization error")
}
Expand Down
6 changes: 3 additions & 3 deletions por/porpackage.pb.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion por/porpackage_test.go
Expand Up @@ -21,9 +21,10 @@ func TestPorPackage(t *testing.T) {
toPk, _ := to.PubKey().EncodePoint(true)
relPk, _ := rel.PubKey().EncodePoint(true)

var srcID []byte
dataHash := common.Uint256{}
blockHash := common.Uint256{}
sc, err := NewSigChain(from, 1, dataHash[:], blockHash[:], toPk, relPk)
sc, err := NewSigChain(from, 1, dataHash[:], blockHash[:], srcID, toPk, relPk)
if err != nil {
t.Error("sigchain created failed")
}
Expand Down
19 changes: 13 additions & 6 deletions por/porserver.go
Expand Up @@ -8,31 +8,34 @@ import (

"github.com/nknorg/nkn/common"
"github.com/nknorg/nkn/core/transaction"
"github.com/nknorg/nkn/net/chord"
"github.com/nknorg/nkn/util/log"
"github.com/nknorg/nkn/vault"
)

type PorServer struct {
sync.RWMutex
account *vault.Account
ring *chord.Ring
pors map[uint32][]*PorPackage
}

var porServer *PorServer

func NewPorServer(account *vault.Account) *PorServer {
func NewPorServer(account *vault.Account, ring *chord.Ring) *PorServer {
ps := &PorServer{
account: account,
ring: ring,
pors: make(map[uint32][]*PorPackage),
}
return ps
}

func InitPorServer(account *vault.Account) error {
func InitPorServer(account *vault.Account, ring *chord.Ring) error {
if porServer != nil {
return errors.New("PorServer already initialized")
}
porServer = NewPorServer(account)
porServer = NewPorServer(account, ring)
return nil
}

Expand Down Expand Up @@ -78,16 +81,20 @@ func (ps *PorServer) Verify(sc *SigChain) error {
}

func (ps *PorServer) CreateSigChain(dataSize uint32, dataHash, blockHash *common.Uint256, destPubkey, nextPubkey []byte) (*SigChain, error) {
return NewSigChain(ps.account, dataSize, dataHash[:], blockHash[:], destPubkey, nextPubkey)
vnode, err := ps.ring.GetFirstVnode()
if err != nil {
return nil, err
}
return NewSigChain(ps.account, dataSize, dataHash[:], blockHash[:], vnode.Id, destPubkey, nextPubkey)
}

func (ps *PorServer) CreateSigChainForClient(dataSize uint32, dataHash, blockHash *common.Uint256, srcPubkey, destPubkey, signature []byte, sigAlgo SigAlgo) (*SigChain, error) {
func (ps *PorServer) CreateSigChainForClient(dataSize uint32, dataHash, blockHash *common.Uint256, srcID, srcPubkey, destPubkey, signature []byte, sigAlgo SigAlgo) (*SigChain, error) {
pubKey, err := ps.account.PubKey().EncodePoint(true)
if err != nil {
log.Error("Get account public key error:", err)
return nil, err
}
sigChain, err := NewSigChainWithSignature(dataSize, dataHash[:], blockHash[:], srcPubkey, destPubkey, pubKey, signature, sigAlgo)
sigChain, err := NewSigChainWithSignature(dataSize, dataHash[:], blockHash[:], srcID, srcPubkey, destPubkey, pubKey, signature, sigAlgo)
if err != nil {
log.Error("New signature chain with signature error:", err)
return nil, err
Expand Down
8 changes: 5 additions & 3 deletions por/porserver_test.go
Expand Up @@ -5,17 +5,19 @@ import (

"github.com/nknorg/nkn/common"
"github.com/nknorg/nkn/crypto"
"github.com/nknorg/nkn/net/chord"
"github.com/nknorg/nkn/vault"
)

func TestPorServer(t *testing.T) {
crypto.SetAlg("P256R1")
ring, _, err := chord.CreateNet()
from, _ := vault.NewAccount()
rel, _ := vault.NewAccount()
to, _ := vault.NewAccount()
pmFrom := NewPorServer(from)
pmRel := NewPorServer(rel)
pmTo := NewPorServer(to)
pmFrom := NewPorServer(from, ring)
pmRel := NewPorServer(rel, ring)
pmTo := NewPorServer(to, ring)
toPk, _ := to.PubKey().EncodePoint(true)
relPk, _ := rel.PubKey().EncodePoint(true)

Expand Down
22 changes: 14 additions & 8 deletions por/sigchain.go
Expand Up @@ -25,8 +25,13 @@ import (
// TODO: move sigAlgo to config.json
const sigAlgo = SigAlgo_ECDSA

func (sc *SigChainElem) SerializationUnsigned(w io.Writer) error {
err := serialization.WriteVarBytes(w, sc.NextPubkey)
func (sce *SigChainElem) SerializationUnsigned(w io.Writer) error {
err := serialization.WriteVarBytes(w, sce.Addr)
if err != nil {
return err
}

err = serialization.WriteVarBytes(w, sce.NextPubkey)
if err != nil {
return err
}
Expand Down Expand Up @@ -78,7 +83,7 @@ func (sc *SigChain) SerializationMetadata(w io.Writer) error {
return nil
}

func NewSigChainWithSignature(dataSize uint32, dataHash, blockHash, srcPubkey, destPubkey, nextPubkey, signature []byte, algo SigAlgo) (*SigChain, error) {
func NewSigChainWithSignature(dataSize uint32, dataHash, blockHash, srcID, srcPubkey, destPubkey, nextPubkey, signature []byte, algo SigAlgo) (*SigChain, error) {
sc := &SigChain{
DataSize: dataSize,
DataHash: dataHash,
Expand All @@ -87,8 +92,9 @@ func NewSigChainWithSignature(dataSize uint32, dataHash, blockHash, srcPubkey, d
DestPubkey: destPubkey,
Elems: []*SigChainElem{
&SigChainElem{
SigAlgo: algo,
Addr: srcID,
NextPubkey: nextPubkey,
SigAlgo: algo,
Signature: signature,
},
},
Expand All @@ -97,9 +103,8 @@ func NewSigChainWithSignature(dataSize uint32, dataHash, blockHash, srcPubkey, d
}

// first relay node starts a new signature chain which consists of meta data and the first element.
func NewSigChain(owner *vault.Account, dataSize uint32, dataHash, blockHash, destPubkey, nextPubkey []byte) (*SigChain, error) {
ownPk := owner.PubKey()
srcPubkey, err := ownPk.EncodePoint(true)
func NewSigChain(srcAccount *vault.Account, dataSize uint32, dataHash, blockHash, srcID, destPubkey, nextPubkey []byte) (*SigChain, error) {
srcPubkey, err := srcAccount.PubKey().EncodePoint(true)
if err != nil {
return nil, err
}
Expand All @@ -112,6 +117,7 @@ func NewSigChain(owner *vault.Account, dataSize uint32, dataHash, blockHash, des
DestPubkey: destPubkey,
Elems: []*SigChainElem{
&SigChainElem{
Addr: srcID,
SigAlgo: sigAlgo,
NextPubkey: nextPubkey,
},
Expand All @@ -135,7 +141,7 @@ func NewSigChain(owner *vault.Account, dataSize uint32, dataHash, blockHash, des
}

hash := sha256.Sum256(buff.Bytes())
signature, err := crypto.Sign(owner.PrivKey(), hash[:])
signature, err := crypto.Sign(srcAccount.PrivKey(), hash[:])
if err != nil {
return nil, err
}
Expand Down
67 changes: 38 additions & 29 deletions por/sigchain.pb.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 3 additions & 2 deletions por/sigchain.proto
Expand Up @@ -6,9 +6,10 @@ enum SigAlgo {
}

message SigChainElem {
SigAlgo SigAlgo = 1;
bytes Addr = 1;
bytes NextPubkey = 2;
bytes Signature = 3;
SigAlgo SigAlgo = 3;
bytes Signature = 4;
}

message SigChain {
Expand Down
3 changes: 2 additions & 1 deletion por/sigchain_test.go
Expand Up @@ -24,9 +24,10 @@ func TestSigChain(t *testing.T) {
relay2Pk, _ := relay2.PubKey().EncodePoint(true)

// test Sign & Verify
var srcID []byte
dataHash := common.Uint256{1, 2, 3}
blockHash := common.Uint256{4, 5, 6}
sc, err := NewSigChain(from, 1, dataHash[:], blockHash[:], toPk, relay1Pk)
sc, err := NewSigChain(from, 1, dataHash[:], blockHash[:], srcID, toPk, relay1Pk)
if err != nil || sc.Verify() != nil {
t.Error("[TestSigChain] 'from' create new SigChain in error")
}
Expand Down
3 changes: 2 additions & 1 deletion rpc/httpjson/interfaces.go
Expand Up @@ -615,11 +615,12 @@ func sigchaintest(s *RPCServer, params []interface{}) map[string]interface{} {
if err != nil {
return RpcResultInternalError
}
srcID := s.node.GetChordAddr()
encodedPublickKey, err := account.PubKey().EncodePoint(true)
if err != nil {
return RpcResultInternalError
}
sigChain, err := por.NewSigChain(account, 1, dataHash[:], blockHash[:], encodedPublickKey, encodedPublickKey)
sigChain, err := por.NewSigChain(account, 1, dataHash[:], blockHash[:], srcID, encodedPublickKey, encodedPublickKey)
if err != nil {
return RpcResultInternalError
}
Expand Down

0 comments on commit 82e3ba7

Please sign in to comment.