DERO Homomorphic Encryption Testnet Release3
This commit is contained in:
parent
b11e41663a
commit
6667a7cbfa
@ -347,6 +347,13 @@ func (chain *Blockchain) Add_Complete_Block(cbl *block.Complete_Block) (err erro
|
|||||||
return errormsg.ErrAlreadyExists, false
|
return errormsg.ErrAlreadyExists, false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for k := range chain.Tips {
|
||||||
|
if block_hash == k {
|
||||||
|
block_logger.Debugf("block already in chain skipping it ")
|
||||||
|
return errormsg.ErrAlreadyExists, false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// only 3 tips allowed in block
|
// only 3 tips allowed in block
|
||||||
if len(bl.Tips) >= 4 {
|
if len(bl.Tips) >= 4 {
|
||||||
rlog.Warnf("More than 3 tips present in block %s rejecting", block_hash)
|
rlog.Warnf("More than 3 tips present in block %s rejecting", block_hash)
|
||||||
@ -677,11 +684,12 @@ func (chain *Blockchain) Add_Complete_Block(cbl *block.Complete_Block) (err erro
|
|||||||
}
|
}
|
||||||
|
|
||||||
// any blocks which have not changed their topo will be skipped using graviton trick
|
// any blocks which have not changed their topo will be skipped using graviton trick
|
||||||
|
skip := true
|
||||||
for i := int64(0); i < int64(len(full_order)); i++ {
|
for i := int64(0); i < int64(len(full_order)); i++ {
|
||||||
|
|
||||||
// check whether the new block is at the same position at the last position
|
// check whether the new block is at the same position at the last position
|
||||||
current_topo_block := i + base_topo_index
|
current_topo_block := i + base_topo_index
|
||||||
if current_topo_block < chain.Store.Topo_store.Count() {
|
if skip && current_topo_block < chain.Store.Topo_store.Count() {
|
||||||
toporecord, err := chain.Store.Topo_store.Read(current_topo_block)
|
toporecord, err := chain.Store.Topo_store.Read(current_topo_block)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
@ -690,6 +698,8 @@ func (chain *Blockchain) Add_Complete_Block(cbl *block.Complete_Block) (err erro
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
skip = false // if one block processed, process every higher block
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO we must run smart contracts and TXs in this order
|
// TODO we must run smart contracts and TXs in this order
|
||||||
@ -825,8 +835,10 @@ func (chain *Blockchain) Add_Complete_Block(cbl *block.Complete_Block) (err erro
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
chain.process_miner_transaction(bl_current.Miner_TX, bl_current.Height == 0, balance_tree, fees_collected)
|
chain.process_miner_transaction(bl_current.Miner_TX, bl_current.Height == 0, balance_tree, fees_collected)
|
||||||
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
rlog.Debugf("this block is a side block block height %d blid %s ", chain.Load_Block_Height(full_order[i]), full_order[i])
|
rlog.Debugf("this block is a side block block height %d blid %s ", chain.Load_Block_Height(full_order[i]), full_order[i])
|
||||||
|
|
||||||
@ -1270,12 +1282,13 @@ func (chain *Blockchain) isblock_SideBlock(blid crypto.Hash) bool {
|
|||||||
return chain.isblock_SideBlock_internal(blid, block_topoheight, block_height)
|
return chain.isblock_SideBlock_internal(blid, block_topoheight, block_height)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// todo optimize/ run more checks
|
||||||
func (chain *Blockchain) isblock_SideBlock_internal(blid crypto.Hash, block_topoheight int64, block_height int64) (result bool) {
|
func (chain *Blockchain) isblock_SideBlock_internal(blid crypto.Hash, block_topoheight int64, block_height int64) (result bool) {
|
||||||
if block_topoheight == 0 {
|
if block_topoheight == 0 {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
counter := int64(0)
|
counter := int64(0)
|
||||||
for i := block_topoheight - 1; i >= 0 && counter < 3*config.STABLE_LIMIT; i-- {
|
for i := block_topoheight - 1; i >= 0 && counter < 16*config.STABLE_LIMIT; i-- {
|
||||||
counter++
|
counter++
|
||||||
toporecord, err := chain.Store.Topo_store.Read(i)
|
toporecord, err := chain.Store.Topo_store.Read(i)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -1552,20 +1565,25 @@ func (chain *Blockchain) buildReachability(blid crypto.Hash) map[crypto.Hash]boo
|
|||||||
|
|
||||||
// this is part of consensus rule, 2 tips cannot refer to their common parent
|
// this is part of consensus rule, 2 tips cannot refer to their common parent
|
||||||
func (chain *Blockchain) VerifyNonReachability(bl *block.Block) bool {
|
func (chain *Blockchain) VerifyNonReachability(bl *block.Block) bool {
|
||||||
|
return chain.verifyNonReachabilitytips(bl.Tips)
|
||||||
|
}
|
||||||
|
|
||||||
reachmaps := make([]map[crypto.Hash]bool, len(bl.Tips), len(bl.Tips))
|
// this is part of consensus rule, 2 tips cannot refer to their common parent
|
||||||
for i := range bl.Tips {
|
func (chain *Blockchain) verifyNonReachabilitytips(tips []crypto.Hash) bool {
|
||||||
reachmaps[i] = chain.buildReachability(bl.Tips[i])
|
|
||||||
|
reachmaps := make([]map[crypto.Hash]bool, len(tips), len(tips))
|
||||||
|
for i := range tips {
|
||||||
|
reachmaps[i] = chain.buildReachability(tips[i])
|
||||||
}
|
}
|
||||||
|
|
||||||
// bruteforce all reachability combinations, max possible 3x3 = 9 combinations
|
// bruteforce all reachability combinations, max possible 3x3 = 9 combinations
|
||||||
for i := range bl.Tips {
|
for i := range tips {
|
||||||
for j := range bl.Tips {
|
for j := range tips {
|
||||||
if i == j { // avoid self test
|
if i == j { // avoid self test
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, ok := reachmaps[j][bl.Tips[i]]; ok { // if a tip can be referenced as another's past, this is not a tip , probably malicious, discard block
|
if _, ok := reachmaps[j][tips[i]]; ok { // if a tip can be referenced as another's past, this is not a tip , probably malicious, discard block
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -100,8 +100,13 @@ func (chain *Blockchain) Create_new_miner_block(miner_address address.Address, t
|
|||||||
if len(bl.Tips) >= 3 {
|
if len(bl.Tips) >= 3 {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
if !chain.verifyNonReachabilitytips(append([]crypto.Hash{tips[i]}, bl.Tips...) ) { // avoid any tips which fail reachability test
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if len(bl.Tips) == 0 || (len(bl.Tips)>=1 && chain.Load_Height_for_BL_ID(bl.Tips[0]) >= chain.Load_Height_for_BL_ID(tips[i]) && chain.Load_Height_for_BL_ID(bl.Tips[0]) - chain.Load_Height_for_BL_ID(tips[i]) <= config.STABLE_LIMIT/2) {
|
||||||
bl.Tips = append(bl.Tips, tips[i])
|
bl.Tips = append(bl.Tips, tips[i])
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//fmt.Printf("miner block placing tips %+v\n", bl.Tips)
|
//fmt.Printf("miner block placing tips %+v\n", bl.Tips)
|
||||||
height := chain.Calculate_Height_At_Tips(bl.Tips) // we are 1 higher than previous highest tip
|
height := chain.Calculate_Height_At_Tips(bl.Tips) // we are 1 higher than previous highest tip
|
||||||
|
@ -38,6 +38,10 @@ type storetopofs struct {
|
|||||||
topomapping *os.File
|
topomapping *os.File
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s TopoRecord)String() string {
|
||||||
|
return fmt.Sprintf("blid %x state version %d height %d",s.BLOCK_ID[:],s.State_Version, s.Height)
|
||||||
|
}
|
||||||
|
|
||||||
func (s *storetopofs) Open(basedir string) (err error) {
|
func (s *storetopofs) Open(basedir string) (err error) {
|
||||||
s.topomapping, err = os.OpenFile(filepath.Join(basedir, "topo.map"), os.O_RDWR|os.O_CREATE, 0700)
|
s.topomapping, err = os.OpenFile(filepath.Join(basedir, "topo.map"), os.O_RDWR|os.O_CREATE, 0700)
|
||||||
return err
|
return err
|
||||||
|
@ -463,7 +463,7 @@ var txpool_template string = `{{define "txpool"}}
|
|||||||
|
|
||||||
<table class="center" style="width:80%">
|
<table class="center" style="width:80%">
|
||||||
<tr>
|
<tr>
|
||||||
<td>age [h:m:s]</td>
|
<td>height built</td>
|
||||||
<td>transaction hash</td>
|
<td>transaction hash</td>
|
||||||
<td>fee</td>
|
<td>fee</td>
|
||||||
<td>ring size</td>
|
<td>ring size</td>
|
||||||
@ -473,7 +473,7 @@ var txpool_template string = `{{define "txpool"}}
|
|||||||
|
|
||||||
{{range .mempool}}
|
{{range .mempool}}
|
||||||
<tr>
|
<tr>
|
||||||
<td></td>
|
<td>{{.HeightBuilt}}</td>
|
||||||
<td><a href="/tx/{{.Hash}}">{{.Hash}}</a></td>
|
<td><a href="/tx/{{.Hash}}">{{.Hash}}</a></td>
|
||||||
<td>{{.Fee}}</td>
|
<td>{{.Fee}}</td>
|
||||||
<td>{{.Ring_size}}</td>
|
<td>{{.Ring_size}}</td>
|
||||||
|
@ -113,7 +113,7 @@ var Mainnet = CHAIN_CONFIG{Name: "mainnet",
|
|||||||
}
|
}
|
||||||
|
|
||||||
var Testnet = CHAIN_CONFIG{Name: "testnet", // testnet will always have last 3 bytes 0
|
var Testnet = CHAIN_CONFIG{Name: "testnet", // testnet will always have last 3 bytes 0
|
||||||
Network_ID: uuid.FromBytesOrNil([]byte{0x59, 0xd7, 0xf7, 0xe9, 0xdd, 0x48, 0xd5, 0xfd, 0x13, 0x0a, 0xf6, 0xe0, 0x22, 0x00, 0x00, 0x00}),
|
Network_ID: uuid.FromBytesOrNil([]byte{0x59, 0xd7, 0xf7, 0xe9, 0xdd, 0x48, 0xd5, 0xfd, 0x13, 0x0a, 0xf6, 0xe0, 0x23, 0x00, 0x00, 0x00}),
|
||||||
P2P_Default_Port: 40401,
|
P2P_Default_Port: 40401,
|
||||||
RPC_Default_Port: 40402,
|
RPC_Default_Port: 40402,
|
||||||
Wallet_RPC_Default_Port: 40403,
|
Wallet_RPC_Default_Port: 40403,
|
||||||
|
@ -20,4 +20,4 @@ import "github.com/blang/semver"
|
|||||||
|
|
||||||
// right now it has to be manually changed
|
// right now it has to be manually changed
|
||||||
// do we need to include git commitsha??
|
// do we need to include git commitsha??
|
||||||
var Version = semver.MustParse("3.0.0-10.DEROHE.alpha+20122020")
|
var Version = semver.MustParse("3.0.0-11.DEROHE.alpha+20122020")
|
||||||
|
@ -101,7 +101,7 @@ func (connection *Connection) Handle_ChainResponse(buf []byte) {
|
|||||||
rlog.Tracef(2, "Queuing block %x height %d %s", response.Block_list[i], response.Start_height+int64(i), connection.logid)
|
rlog.Tracef(2, "Queuing block %x height %d %s", response.Block_list[i], response.Start_height+int64(i), connection.logid)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
logger.Warnf("We must have queued %x, but we skipped it at height %d", response.Block_list[i], response.Start_height+int64(i))
|
rlog.Tracef(3, "We must have queued %x, but we skipped it at height %d", response.Block_list[i], response.Start_height+int64(i))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -69,7 +69,7 @@ func Initialize_LookupTable(count int, table_size int) *LookupTable {
|
|||||||
for i := range t {
|
for i := range t {
|
||||||
t[i] = make([]uint64, table_size, table_size)
|
t[i] = make([]uint64, table_size, table_size)
|
||||||
|
|
||||||
bar := pb.New(TABLE_SIZE)
|
bar := pb.New(table_size)
|
||||||
if terminal {
|
if terminal {
|
||||||
bar.Start()
|
bar.Start()
|
||||||
}
|
}
|
||||||
|
@ -483,8 +483,9 @@ func (w *Wallet) GetEncryptedBalanceAtTopoHeight(topoheight int64, accountaddr s
|
|||||||
var result structures.GetEncryptedBalance_Result
|
var result structures.GetEncryptedBalance_Result
|
||||||
|
|
||||||
// Issue a call with a response.
|
// Issue a call with a response.
|
||||||
if err := rpc_client.Call("DERO.GetEncryptedBalance", structures.GetEncryptedBalance_Params{Address: accountaddr, TopoHeight: topoheight}, &result); err != nil {
|
if err = rpc_client.Call("DERO.GetEncryptedBalance", structures.GetEncryptedBalance_Params{Address: accountaddr, TopoHeight: topoheight}, &result); err != nil {
|
||||||
fmt.Printf("Call failed: %v", err)
|
rlog.Errorf("Call failed: %v", err)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// fmt.Printf("encrypted_balance %+v\n", result)
|
// fmt.Printf("encrypted_balance %+v\n", result)
|
||||||
@ -568,7 +569,7 @@ func (w *Wallet) random_ring_members() {
|
|||||||
|
|
||||||
// Issue a call with a response.
|
// Issue a call with a response.
|
||||||
if err := rpc_client.Call("DERO.GetRandomAddress", nil, &result); err != nil {
|
if err := rpc_client.Call("DERO.GetRandomAddress", nil, &result); err != nil {
|
||||||
fmt.Printf("Call failed: %v", err)
|
rlog.Errorf("GetRandomAddress Call failed: %v", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
//fmt.Printf("ring members %+v\n", result)
|
//fmt.Printf("ring members %+v\n", result)
|
||||||
@ -613,7 +614,7 @@ func (w *Wallet) SyncHistory() (balance uint64) {
|
|||||||
|
|
||||||
// Issue a call with a response.
|
// Issue a call with a response.
|
||||||
if err := rpc_client.Call("DERO.GetBlockHeaderByTopoHeight", structures.GetBlockHeaderByTopoHeight_Params{TopoHeight: uint64(w.account.Entries[i].TopoHeight)}, &result); err != nil {
|
if err := rpc_client.Call("DERO.GetBlockHeaderByTopoHeight", structures.GetBlockHeaderByTopoHeight_Params{TopoHeight: uint64(w.account.Entries[i].TopoHeight)}, &result); err != nil {
|
||||||
fmt.Printf("Call failed: %v", err)
|
rlog.Errorf("GetBlockHeaderByTopoHeight Call failed: %v", err)
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -232,7 +232,7 @@ func (w *Wallet) Show_Transfers(available bool, in bool, out bool, pool bool, fa
|
|||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if out && !e.Incoming {
|
if out && !(e.Incoming || e.Coinbase) {
|
||||||
if payment_id && len(e.PaymentID) >= 8 {
|
if payment_id && len(e.PaymentID) >= 8 {
|
||||||
entries = append(entries, e)
|
entries = append(entries, e)
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user