DERO-HE STARGATE Mainnet HardFork-2 Release48

This commit is contained in:
Captain 2022-03-04 15:05:04 +00:00
parent a9ad0089de
commit 3acbbee234
No known key found for this signature in database
GPG Key ID: 18CDB3ED5E85D2D4
12 changed files with 116 additions and 39 deletions

View File

@ -58,7 +58,6 @@ import "github.com/deroproject/graviton"
// this structure must be update while mutex
type Blockchain struct {
Store storage // interface to storage layer
Height int64 // chain height is always 1 more than block
Top_ID crypto.Hash // id of the top block
Pruned int64 // until where the chain has been pruned
MiniBlocks *block.MiniBlocksCollection // used for consensus
@ -210,6 +209,42 @@ func Blockchain_Start(params map[string]interface{}) (*Blockchain, error) {
logger.Info("Chain Pruned till", "topoheight", chain.Pruned)
}
// detect case if chain was corrupted earlier,so as it can be deleted and resynced
if chain.Pruned < globals.Config.HF1_HEIGHT && globals.IsMainnet() && chain.Get_Height() >= globals.Config.HF1_HEIGHT+1 {
toporecord, err := chain.Store.Topo_store.Read(globals.Config.HF1_HEIGHT + 1)
if err != nil {
panic(err)
}
var ss *graviton.Snapshot
ss, err = chain.Store.Balance_store.LoadSnapshot(toporecord.State_Version)
if err != nil {
panic(err)
}
var namehash_scid crypto.Hash
namehash_scid[31] = 1
sc_data_tree, err := ss.GetTree(string(namehash_scid[:]))
if err != nil {
panic(err)
}
if code_bytes, err := sc_data_tree.Get(dvm.SC_Code_Key(namehash_scid)); err == nil {
var v dvm.Variable
if err = v.UnmarshalBinary(code_bytes); err != nil {
panic("Unmarshal error")
}
if !strings.Contains(v.ValueString, "UpdateCode") {
logger.Error(nil, "Chain corruption detected")
logger.Error(nil, "You need to delete existing mainnet folder and resync chain again")
os.Exit(-1)
return nil, err
}
} else {
panic(err)
}
}
metrics.Version = config.Version.String()
go metrics.Dump_metrics_data_directly(logger, globals.Arguments["--node-tag"]) // enable metrics if someone needs them
@ -294,7 +329,6 @@ func (chain *Blockchain) Initialise_Chain_From_DB() {
// then downgrading to top-10 height
// then reworking the chain to get the tip
best_height := chain.Load_TOP_HEIGHT()
chain.Height = best_height
chain.Tips = map[crypto.Hash]crypto.Hash{} // reset the map
// reload top tip from disk
@ -302,7 +336,7 @@ func (chain *Blockchain) Initialise_Chain_From_DB() {
chain.Tips[top] = top // we only can load a single tip from db
logger.V(1).Info("Reloaded Chain from disk", "Tips", chain.Tips, "Height", chain.Height)
logger.V(1).Info("Reloaded Chain from disk", "Tips", chain.Tips, "Height", best_height)
}
// before shutdown , make sure p2p is confirmed stopped
@ -807,9 +841,9 @@ func (chain *Blockchain) Add_Complete_Block(cbl *block.Complete_Block) (err erro
if height > chain.Get_Height() || height == 0 { // exception for genesis block
//atomic.StoreInt64(&chain.Height, height)
height_changed = true
block_logger.Info("Chain extended", "new height", chain.Height)
block_logger.Info("Chain extended", "new height", height)
} else {
block_logger.Info("Chain extended but height is same", "new height", chain.Height)
block_logger.Info("Chain extended but height is same", "new height", height)
}
{
@ -916,15 +950,24 @@ func (chain *Blockchain) Add_Complete_Block(cbl *block.Complete_Block) (err erro
}
var meta dvm.SC_META_DATA // the meta contains metadata about SC
if bl_current.Height < uint64(globals.Config.HF2_HEIGHT) {
if err := meta.UnmarshalBinary(meta_bytes); err != nil {
panic(err)
}
if meta.DataHash, err = v.Hash(); err != nil { // encode data tree hash
panic(err)
}
sc_meta.Put(dvm.SC_Meta_Key(scid), meta.MarshalBinary())
} else {
if err := meta.UnmarshalBinaryGood(meta_bytes); err != nil {
panic(err)
}
if meta.DataHash, err = v.Hash(); err != nil { // encode data tree hash
panic(err)
}
sc_meta.Put(dvm.SC_Meta_Key(scid), meta.MarshalBinaryGood())
}
data_trees = append(data_trees, v)
/*fmt.Printf("will commit tree name %x \n", v.GetName())
@ -1039,7 +1082,7 @@ func (chain *Blockchain) Add_Complete_Block(cbl *block.Complete_Block) (err erro
// every 2000 block print a line
if chain.Get_Height()%2000 == 0 {
block_logger.Info(fmt.Sprintf("Chain Height %d", chain.Height))
block_logger.Info(fmt.Sprintf("Chain Height %d", chain.Get_Height()))
}
purge_count := chain.MiniBlocks.PurgeHeight(chain.Get_Stable_Height()) // purge all miniblocks upto this height

View File

@ -22,6 +22,7 @@ import _ "embed"
import "github.com/deroproject/graviton"
import "github.com/deroproject/derohe/dvm"
import "github.com/deroproject/derohe/globals"
import "github.com/deroproject/derohe/cryptography/crypto"
//go:embed hardcoded_sc/nameservice.bas
@ -34,35 +35,29 @@ var source_nameservice_updateable string
func (chain *Blockchain) install_hardcoded_contracts(cache map[crypto.Hash]*graviton.Tree, ss *graviton.Snapshot, balance_tree *graviton.Tree, sc_tree *graviton.Tree, height uint64) (err error) {
if height == 0 {
if _, _, err = dvm.ParseSmartContract(source_nameservice); err != nil {
logger.Error(err, "error Parsing hard coded sc")
panic(err)
return
}
var name crypto.Hash
name[31] = 1
if err = chain.install_hardcoded_sc(cache, ss, balance_tree, sc_tree, source_nameservice, name); err != nil {
panic(err)
return
}
}
return
}
if height == 21480 { // update SC at specific height
// it is updated at 0 height for testnets
if height == uint64(globals.Config.HF1_HEIGHT) { // update SC at specific height
if _, _, err = dvm.ParseSmartContract(source_nameservice_updateable); err != nil {
logger.Error(err, "error Parsing hard coded sc")
panic(err)
return
}
var name crypto.Hash
name[31] = 1
if err = chain.install_hardcoded_sc(cache, ss, balance_tree, sc_tree, source_nameservice_updateable, name); err != nil {
panic(err)
return
}
}

View File

@ -250,7 +250,6 @@ func (chain *Blockchain) process_transaction(changed map[crypto.Hash]*graviton.T
default:
panic("unknown transaction, do not know how to process it")
return 0
}
}
@ -277,7 +276,7 @@ func (chain *Blockchain) process_transaction_sc(cache map[crypto.Hash]*graviton.
defer func() {
if r := recover(); r != nil {
logger.V(1).Error(nil, "Recover while executing SC ", "txid", txhash, "error", r, "stack", fmt.Sprintf("%s", string(debug.Stack())))
logger.V(2).Error(nil, "Recover while executing SC ", "txid", txhash, "error", r, "stack", fmt.Sprintf("%s", string(debug.Stack())))
}
}()

View File

@ -446,6 +446,8 @@ func mineblock(tid int) {
var diff big.Int
var work [block.MINIBLOCK_SIZE]byte
time.Sleep(5*time.Second)
nonce_buf := work[block.MINIBLOCK_SIZE-5:] //since slices are linked, it modifies parent
runtime.LockOSThread()
threadaffinity()

View File

@ -678,7 +678,7 @@ restart_loop:
panic(err)
}
if r.BLOCK_ID != current_blid {
fmt.Printf("corruption due to XYZ r %+v , current_blid %s current_blid_height\n", r, current_blid, height)
fmt.Printf("corruption due to XYZ r %+v , current_blid %s current_blid_height %d\n", r, current_blid, height)
fix_commit_version, err := chain.ReadBlockSnapshotVersion(current_blid)
if err != nil {

View File

@ -85,6 +85,9 @@ type CHAIN_CONFIG struct {
RPC_Default_Port int
Wallet_RPC_Default_Port int
HF1_HEIGHT int64 // first HF applied here
HF2_HEIGHT int64 // second HF applie here
Dev_Address string // to which address the integrator rewatd will go, if user doesn't specify integrator address'
Genesis_Tx string
Genesis_Block_Hash crypto.Hash
@ -96,6 +99,8 @@ var Mainnet = CHAIN_CONFIG{Name: "mainnet",
RPC_Default_Port: 10102,
Wallet_RPC_Default_Port: 10103,
Dev_Address: "dero1qykyta6ntpd27nl0yq4xtzaf4ls6p5e9pqu0k2x4x3pqq5xavjsdxqgny8270",
HF1_HEIGHT: 21480,
HF2_HEIGHT: 29000,
Genesis_Tx: "" +
"01" + // version
@ -114,6 +119,8 @@ var Testnet = CHAIN_CONFIG{Name: "testnet", // testnet will always have last 3 b
Wallet_RPC_Default_Port: 40403,
Dev_Address: "deto1qy0ehnqjpr0wxqnknyc66du2fsxyktppkr8m8e6jvplp954klfjz2qqdzcd8p",
HF1_HEIGHT: 0, // on testnet apply at genesis
HF2_HEIGHT: 0, // on testnet apply at genesis
Genesis_Tx: "" +
"01" + // version

View File

@ -22,7 +22,7 @@ package config
// only version 2
var Mainnet_seed_nodes = []string{
"185.132.176.174:11011",
"190.2.135.218:11011",
"45.82.66.54:8080",
"185.107.69.12:11011",
"89.38.97.110:11011",
}

View File

@ -20,4 +20,4 @@ import "github.com/blang/semver/v4"
// right now it has to be manually changed
// do we need to include git commitsha??
var Version = semver.MustParse("3.4.130-0.DEROHE.STARGATE+26022022")
var Version = semver.MustParse("3.4.133-48.DEROHE.STARGATE+26022022")

View File

@ -56,6 +56,23 @@ func (meta *SC_META_DATA) UnmarshalBinary(buf []byte) (err error) {
return nil
}
// serialize the structure
func (meta SC_META_DATA) MarshalBinaryGood() (buf []byte) {
buf = make([]byte, 0, 33)
buf = append(buf, meta.Type)
buf = append(buf, meta.DataHash[:]...)
return
}
func (meta *SC_META_DATA) UnmarshalBinaryGood(buf []byte) (err error) {
if len(buf) != 1+32 {
return fmt.Errorf("input buffer should be of 33 bytes in length")
}
meta.Type = buf[0]
copy(meta.DataHash[:], buf[1:])
return nil
}
func SC_Meta_Key(scid crypto.Hash) []byte {
return scid[:]
}
@ -277,15 +294,6 @@ func Execute_sc_function(w_sc_tree *Tree_Wrapper, data_tree *Tree_Wrapper, scid
// reads SC, balance
func ReadSC(w_sc_tree *Tree_Wrapper, data_tree *Tree_Wrapper, scid crypto.Hash) (balance uint64, sc SmartContract, found bool) {
meta_bytes, err := w_sc_tree.Get(SC_Meta_Key(scid))
if err != nil {
return
}
var meta SC_META_DATA // the meta contains the link to the SC bytes
if err := meta.UnmarshalBinary(meta_bytes); err != nil {
return
}
var zerohash crypto.Hash
balance, _ = LoadSCAssetValue(data_tree, scid, zerohash)

25
dvm/sc_test.go Normal file
View File

@ -0,0 +1,25 @@
package dvm
import "time"
import "testing"
import "math/rand"
func TestSC_META_DATA(t *testing.T) {
rand.Seed(time.Now().UnixNano())
for i := 0; i < 256; i++ {
sctype := byte(i)
var meta, meta2 SC_META_DATA
for j := 0; j < 10000; j++ {
meta.Type = sctype
rand.Read(meta.DataHash[:])
ser := meta.MarshalBinaryGood()
if err := meta2.UnmarshalBinaryGood(ser[:]); err != nil {
t.Fatalf("marshallling unmarshalling failed")
}
if meta != meta2 {
t.Fatalf("marshallling unmarshalling failed")
}
}
}
}

View File

@ -1,3 +0,0 @@
21400 First HardFork

View File

@ -58,7 +58,8 @@ func (connection *Connection) dispatch_test_handshake() {
//scan our peer list and send peers which have been recently communicated
request.PeerList = get_peer_list_specific(Address(connection))
ctx, _ := context.WithTimeout(context.Background(), 4*time.Second)
ctx, cancel := context.WithTimeout(context.Background(), 4*time.Second)
defer cancel()
if err := connection.Client.CallWithContext(ctx, "Peer.Handshake", request, &response); err != nil {
connection.logger.V(4).Error(err, "cannot handshake")
connection.exit()