Skip to content

Commit fae8e88

Browse files
authored
Merge pull request Consensys#8 from QuorumEngineering/storePrivacyMetadata
Store privacy metadata
2 parents 13964f3 + eeed058 commit fae8e88

File tree

3 files changed

+78
-45
lines changed

3 files changed

+78
-45
lines changed

core/state/state_object.go

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -364,13 +364,12 @@ func (self *stateObject) setStatePrivacyMetadata(metadata *PrivacyMetadata) erro
364364
key := make([]byte, 0, len(privacyMetadataPrefix)+len(self.address.Bytes()))
365365
key = append(privacyMetadataPrefix, self.address.Bytes()...)
366366

367-
var b bytes.Buffer
368-
e := gob.NewEncoder(&b)
369-
if err := e.Encode(metadata); err != nil {
367+
b, err := privacyMetadataToBytes(metadata)
368+
if err != nil {
370369
return err
371370
}
372-
self.db.ethdb.Put(key, b.Bytes())
373-
return nil
371+
err = self.db.ethdb.Put(key, b)
372+
return err
374373
}
375374

376375
func (self *stateObject) CodeHash() []byte {
@@ -394,12 +393,8 @@ func (self *stateObject) PrivacyMetadata() (*PrivacyMetadata, error) {
394393
if err != nil {
395394
return nil, err
396395
}
397-
var data *PrivacyMetadata
398-
d := gob.NewDecoder(bytes.NewBuffer(val))
399-
if err := d.Decode(&data); err != nil {
400-
return nil, err
401-
}
402-
return data, nil
396+
data, err := bytesToPrivacyMetadata(val)
397+
return data, err
403398
}
404399

405400
// Never called, but must be present to allow stateObject to be used
@@ -408,3 +403,21 @@ func (self *stateObject) PrivacyMetadata() (*PrivacyMetadata, error) {
408403
func (self *stateObject) Value() *big.Int {
409404
panic("Value on stateObject should never be called")
410405
}
406+
407+
func privacyMetadataToBytes(pm *PrivacyMetadata) ([]byte, error) {
408+
var b bytes.Buffer
409+
e := gob.NewEncoder(&b)
410+
if err := e.Encode(pm); err != nil {
411+
return nil, err
412+
}
413+
return b.Bytes(), nil
414+
}
415+
416+
func bytesToPrivacyMetadata(b []byte) (*PrivacyMetadata, error) {
417+
var data *PrivacyMetadata
418+
d := gob.NewDecoder(bytes.NewBuffer(b))
419+
if err := d.Decode(&data); err != nil {
420+
return nil, err
421+
}
422+
return data, nil
423+
}

core/state_transition.go

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package core
1818

1919
import (
2020
"errors"
21+
"fmt"
2122
"math"
2223
"math/big"
2324

@@ -206,9 +207,12 @@ func (st *StateTransition) TransitionDb() (ret []byte, usedGas uint64, failed bo
206207
hasPrivatePayload := false
207208
isPrivate := false
208209
publicState := st.state
210+
var snapshot int
209211
if msg, ok := msg.(PrivateMessage); ok && isQuorum && msg.IsPrivate() {
212+
snapshot = st.evm.StateDB.Snapshot()
210213
isPrivate = true
211214
data, extraPrivateMetadata, err = private.P.Receive(common.BytesToEncryptedPayloadHash(st.data))
215+
log.Trace("transisiton-retrievefrom tessera", "data", data, "hash", common.BytesToEncryptedPayloadHash(st.data), "metadata", extraPrivateMetadata)
212216
// Increment the public account nonce if:
213217
// 1. Tx is private and *not* a participant of the group and either call or create
214218
// 2. Tx is private we are part of the group and is a call
@@ -288,34 +292,37 @@ func (st *StateTransition) TransitionDb() (ret []byte, usedGas uint64, failed bo
288292
for _, addr := range actualACAddresses {
289293
actualPrivacyMetadata, err := evm.StateDB.GetStatePrivacyMetadata(addr)
290294
if err != nil {
291-
//TODO - issue with getting/decoding privacymetadata
295+
st.evm.StateDB.RevertToSnapshot(snapshot)
296+
return nil, 0, true, fmt.Errorf("vmerr=%s, err=%s", vmerr, err)
292297
}
293298
if actualPrivacyMetadata == nil {
294299
continue // public contracts don't have privacy metadata
295300
}
301+
296302
if extraPrivateMetadata.ACHashes.NotExist(actualPrivacyMetadata.CreationTxHash) {
303+
st.evm.StateDB.RevertToSnapshot(snapshot)
297304
log.Error("Participation check failed",
298305
"affectedContractAddress", addr.Hex(),
299306
"missingCreationTxHash", actualPrivacyMetadata.CreationTxHash)
300307
// TODO - check with Pete/Trung/Angela/Nam on how to properly ignore this txn
301-
return nil, 0, vmerr != nil, nil
308+
return nil, 0, true, vmerr
302309
}
303310
log.Trace("Get Privacy Metadata-affected", "privacyMetadata", actualPrivacyMetadata)
304311
}
305312
if !common.EmptyHash(extraPrivateMetadata.ACMerkleRoot) {
306313
log.Trace("Verify merkle root", "merkleRoot", extraPrivateMetadata.ACMerkleRoot)
307-
/*
308-
actualACMerkleRoot, err := evm.CalculateMerkleRoot()
309-
if err != nil {
310-
log.Error("Calculate Merkle Root failed", "error", err)
311-
return nil, 0, vmerr != nil, err
312-
}
313-
if actualACMerkleRoot != expectedACMerkleRoot {
314-
log.Error("Merkle Root check failed", "actual", actualACMerkleRoot, "expect", expectedACMerkleRoot)
315-
// TODO - check with Pete/Trung/Angela/Nam on how to properly ignore this txn
316-
return nil, 0, vmerr != nil, nil
317-
}
318-
*/
314+
actualACMerkleRoot, err := evm.CalculateMerkleRoot()
315+
if err != nil {
316+
st.evm.StateDB.RevertToSnapshot(snapshot)
317+
log.Error("Calculate Merkle Root failed", "error", err)
318+
return nil, 0, true, fmt.Errorf("vmerr=%s, err=%s", vmerr, err)
319+
}
320+
if actualACMerkleRoot != extraPrivateMetadata.ACMerkleRoot {
321+
st.evm.StateDB.RevertToSnapshot(snapshot)
322+
log.Error("Merkle Root check failed", "actual", actualACMerkleRoot, "expect", extraPrivateMetadata.ACMerkleRoot)
323+
// TODO - check with Pete/Trung/Angela/Nam on how to properly ignore this txn
324+
return nil, 0, true, vmerr
325+
}
319326
}
320327
}
321328

internal/ethapi/api.go

Lines changed: 33 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1746,24 +1746,31 @@ func handlePrivateTransaction(ctx context.Context, b Backend, tx *types.Transact
17461746
log.Info("sending private tx", "isRaw", isRaw, "data", common.FormatTerminalString(data), "privatefrom", privateTxArgs.PrivateFrom, "privatefor", privateTxArgs.PrivateFor, "psvsender", privateTxArgs.PrivateStateValidation, "messageCall", isMessageCall)
17471747
if isRaw {
17481748
hash = common.BytesToEncryptedPayloadHash(data)
1749-
/*
1750-
privatePayload, _, _, revErr := private.P.Receive<TODO need new API to retrieve payload>(data)
1751-
if revErr != nil {
1752-
return isPrivate, nil, revErr
1753-
}
1754-
var privateTx *types.Transaction
1755-
if tx.To() == nil {
1756-
privateTx = types.NewContractCreation(tx.Nonce(), tx.Value(), tx.Gas(), tx.GasPrice(), privatePayload)
1757-
} else {
1758-
privateTx = types.NewTransaction(tx.Nonce(), *tx.To(), tx.Value(), tx.Gas(), tx.GasPrice(), privatePayload)
1759-
}
1760-
creationTxEncryptedPayloadHashes, merkleRoot, err = simulateExecution(ctx, b, from, privateTx)
1761-
if err != nil {
1762-
return
1763-
}
1764-
*/
1765-
1766-
//TODO: how to send correct psv without simulation??
1749+
1750+
privatePayload, _, revErr := private.P.Receive(hash)
1751+
if revErr != nil {
1752+
return isPrivate, common.EncryptedPayloadHash{}, revErr
1753+
}
1754+
log.Trace("raw", "hash", hash, "privatepayload", privatePayload)
1755+
var privateTx *types.Transaction
1756+
if tx.To() == nil {
1757+
log.Trace("raw creation")
1758+
privateTx = types.NewContractCreation(tx.Nonce(), tx.Value(), tx.Gas(), tx.GasPrice(), privatePayload)
1759+
} else {
1760+
log.Trace("raw message call")
1761+
privateTx = types.NewTransaction(tx.Nonce(), *tx.To(), tx.Value(), tx.Gas(), tx.GasPrice(), privatePayload)
1762+
}
1763+
creationTxEncryptedPayloadHashes, merkleRoot, err = simulateExecution(ctx, b, from, privateTx)
1764+
1765+
log.Trace("raw-data returned from sim", "creationPayloadHashes", creationTxEncryptedPayloadHashes, "MR", merkleRoot, "err", err)
1766+
if err != nil {
1767+
return
1768+
}
1769+
1770+
if !isMessageCall && !privateTxArgs.PrivateStateValidation {
1771+
merkleRoot = common.Hash{}
1772+
}
1773+
17671774
data, err = private.P.SendSignedTx(hash, privateTxArgs.PrivateFor, &engine.ExtraMetadata{
17681775
ACHashes: creationTxEncryptedPayloadHashes,
17691776
ACMerkleRoot: merkleRoot,
@@ -1775,6 +1782,11 @@ func handlePrivateTransaction(ctx context.Context, b Backend, tx *types.Transact
17751782
if !isMessageCall && !privateTxArgs.PrivateStateValidation {
17761783
merkleRoot = common.Hash{}
17771784
}
1785+
1786+
log.Trace("privatetx", "creationtxs", creationTxEncryptedPayloadHashes)
1787+
if isMessageCall && len(creationTxEncryptedPayloadHashes) == 0 {
1788+
return isPrivate, common.EncryptedPayloadHash{}, errors.New("non-party to message call")
1789+
}
17781790
log.Trace("data returned from sim", "creationPayloadHashes", creationTxEncryptedPayloadHashes, "MR", merkleRoot, "err", err)
17791791
if err != nil {
17801792
return
@@ -1784,7 +1796,7 @@ func handlePrivateTransaction(ctx context.Context, b Backend, tx *types.Transact
17841796
ACMerkleRoot: merkleRoot,
17851797
})
17861798
}
1787-
log.Info("sent private tx", "isRaw", isRaw, "data", common.FormatTerminalString(data), "privatefrom", privateTxArgs.PrivateFrom, "privatefor", privateTxArgs.PrivateFor, "merkleroot", merkleRoot, "ismessagecall", isMessageCall, "error", err, "hash", hash)
1799+
log.Info("sent private tx", "isRaw", isRaw, "data", common.FormatTerminalString(data), "privatefrom", privateTxArgs.PrivateFrom, "privatefor", privateTxArgs.PrivateFor, "merkleroot", merkleRoot, "ismessagecall", isMessageCall, "error", err, "encryptedhahses", creationTxEncryptedPayloadHashes, "hash", hash)
17881800
if err != nil {
17891801
return isPrivate, common.EncryptedPayloadHash{}, err
17901802
}
@@ -1856,6 +1868,7 @@ func simulateExecution(ctx context.Context, b Backend, from common.Address, priv
18561868
affectedContractsHashes := make(common.EncryptedPayloadHashes)
18571869
addresses := evm.AffectedContracts()
18581870
psv := true
1871+
log.Trace("simulation", "affectedaddresses", addresses)
18591872
for _, addr := range addresses {
18601873
privacyMetadata, err := evm.StateDB.GetStatePrivacyMetadata(addr)
18611874
log.Debug("Found affected contract", "address", addr.Hex(), "privacyMetadata", privacyMetadata)
@@ -1881,7 +1894,7 @@ func simulateExecution(ctx context.Context, b Backend, from common.Address, priv
18811894
return nil, common.Hash{}, err
18821895
}
18831896
}
1884-
log.Trace("simulation end", "mr", merkleRoot)
1897+
log.Trace("simulation end", "mr", merkleRoot, "affectedhashes", affectedContractsHashes)
18851898
return affectedContractsHashes, merkleRoot, nil
18861899
}
18871900

0 commit comments

Comments
 (0)