Pages:
Author

Topic: More Genesis Block Discussion - page 3. (Read 33958 times)

member
Activity: 111
Merit: 10
April 18, 2014, 03:22:01 AM
#67
newbie
Activity: 15
Merit: 0
April 18, 2014, 03:17:48 AM
#66
I have the following problem - when I compile daemon based on fehcoin (with pszTimestamp, block.nTime etc. changes) and I run it, I get empty nNonce:
Code:
Loading block index...
CBlock(hash=c18a2e48349763b42b90ac00881abee846203b789a2d86aacb2cd2aa5161c66f, ver=1, hashPrevBlock=0000000000000000000000000000000000000000000000000000000000000000, hashMerkleRoot=25cc2e3283b86f225057d0eaa0eaa0003b891de79828f59bb4fc0b290ab897e2, nTime=1388419211, nBits=1f00ffff, nNonce=0, vtx=1, vchBlockSig=)
  Coinbase(hash=25cc2e3283, nTime=1375995262, ver=1, vin.size=1, vout.size=1, nLockTime=0)
    CTxIn(COutPoint(0000000000, 4294967295), coinbase 04ffff001d020f272957687920776f756c6420796f75206e65656420426974207768656e20796f7520686176652053776167)
    CTxOut(empty)
  vMerkleTree: 25cc2e3283
block.GetHash() == c18a2e48349763b42b90ac00881abee846203b789a2d86aacb2cd2aa5161c66f
block.hashMerkleRoot == 25cc2e3283b86f225057d0eaa0eaa0003b891de79828f59bb4fc0b290ab897e2
block.nTime = 1388419211
block.nNonce = 0

block.nNonce = 0 Why is this happening?
member
Activity: 111
Merit: 10
April 15, 2014, 04:21:21 AM
#65
Hello,

You can use this Code to find Genesis Block for N-Scrypt, Insert it before ///debug print comment which would be near hashMerkleRoot and compile ^_^:

Code:
              if (true &&block.GetHash() != hashGenesisBlock)
              {
                  printf("Searching for genesis block...\n");
                  // This will figure out a valid hash and Nonce if you're
                  // creating a different genesis block:
                  uint256 hashTarget = CBigNum().SetCompact(block.nBits).getuint256();
                  uint256 thash;

                  unsigned long int scrypt_scratpad_size_current_block = ((1 << (GetNfactor(block.nTime) + 1)) * 128 ) + 63;
                  char scratchpad[scrypt_scratpad_size_current_block];

                  loop
                  {
                 // Generic scrypt
                      scrypt_N_1_1_256_sp_generic(BEGIN(block.nVersion), BEGIN(thash), scratchpad, GetNfactor(block.nTime));

                      if (thash <= hashTarget)
                      {
                     printf ("found it!\n");
                          break;
                      }
                      if ((block.nNonce & 0xFFF) == 0)
                      {
                          printf("nonce %08X: hash = %s (target = %s)\n", block.nNonce, thash.ToString().c_str(), hashTarget.ToString().c_str());
                      }
                      ++block.nNonce;
                      if (block.nNonce == 0)
                      {
                          printf("NONCE WRAPPED, incrementing time\n");
                          ++block.nTime;
                      }
                  }
               }
full member
Activity: 644
Merit: 101
April 09, 2014, 12:08:57 PM
#64

I think this is the best way to handle it. Teaching people to fish that is.

Haha... you are part of some jealous assh#ole herd, I see assh## like you never help anyone & can't stand anyone else helping out as well.



If anyone needs help with genesis please contact me, I will help out for free.
legendary
Activity: 996
Merit: 1013
April 08, 2014, 04:10:45 PM
#63
apple_talk:
replied to your pm


btw, found X11 relate gen code, not sure if this is valid...


Why not try and see?  Grin
sr. member
Activity: 473
Merit: 250
"Proof-of-Asset Protocol"
April 08, 2014, 03:42:48 PM
#62
did not work, it failed.

Worked for me. What error report?

PM you error message yesterday.

btw, found X11 relate gen code, not sure if this is valid...

Code:
if (true && block.GetHash() != hashGenesisBlock)
        {
            printf("Searching for genesis block...\n");
            uint256 hashTarget = CBigNum().SetCompact(block.nBits).getuint256();
            uint256 thash;

            loop
            {
                thash = block.GetHash();
                if (thash <= hashTarget)
                    break;
                if ((block.nNonce & 0xFFF) == 0)
                {
                    printf("nonce %08X: hash = %s (target = %s)\n", block.nNonce, thash.ToString().c_str(), hashTarget.ToString().c_str());
                }
                ++block.nNonce;
                if (block.nNonce == 0)
                {
                    printf("NONCE WRAPPED, incrementing time\n");
                    ++block.nTime;
                }
            }
            printf("block.nTime = %u \n", block.nTime);
            printf("block.nNonce = %u \n", block.nNonce);
            printf("block.nVersion = %u \n", block.nVersion);
            printf("block.GetHash = %s\n", block.GetHash().ToString().c_str());
        }
        //// debug print
        uint256 hash = block.GetHash();
        printf("%s\n", hash.ToString().c_str());
        printf("%s\n", hashGenesisBlock.ToString().c_str());
        printf("%s\n", block.hashMerkleRoot.ToString().c_str());
        assert(block.hashMerkleRoot == uint256("0x"));
legendary
Activity: 2198
Merit: 1014
Franko is Freedom
April 08, 2014, 08:09:07 AM
#61
Edit:

For the sake of possible future readers, rather than handing them a fully baked solution, I will just give outline of the procedure. Y'know. give man a fish / teach him to fish and so on...

So if you want to get a new genesis block out of Darkcoin that uses X11 or any coin at all that has been forked out of Bitcoin, here are the steps, most of which can be inferred from this thread also.

You need to change szTimesstamp and nTime. Zero the nonce, merkle root and old genesis block. Compile and run. Boom. Here's the genesis block and merkle root as they come from the printf statements in InitBlockIndex().

If you substitute them into the code, your gen block will be accepted, but you will run into this:
Code:
hash doesn't match nBits.

The code snippet (see above) that begins with
Code:
if (true && block.GetHash() != hashGenesisBlock)

will help you to find the right hash and nBits. You just need to read what it does. It is looping an algorithm and increasing nonce to find a block that satisfies the difficulty. I.e. it is mining. Is it running scrypt? No it isn't, this is X11, so get rid of all that. Where do you get the X11 algorithm? Take a look at the error message you're getting.

That should be enough...



I think this is the best way to handle it. Teaching people to fish that is.
legendary
Activity: 996
Merit: 1013
April 08, 2014, 02:07:18 AM
#60
did not work, it failed.

Worked for me. What error report?
sr. member
Activity: 473
Merit: 250
"Proof-of-Asset Protocol"
April 08, 2014, 02:04:41 AM
#59
did not work, it failed.
sr. member
Activity: 473
Merit: 250
"Proof-of-Asset Protocol"
April 07, 2014, 09:24:19 PM
#58
appreciate  Smiley
I will try it shortly.
legendary
Activity: 996
Merit: 1013
April 07, 2014, 07:00:46 PM
#57
Edit:

For the sake of possible future readers, rather than handing them a fully baked solution, I will just give outline of the procedure. Y'know. give man a fish / teach him to fish and so on...

So if you want to get a new genesis block out of Darkcoin that uses X11 or any coin at all that has been forked out of Bitcoin, here are the steps, most of which can be inferred from this thread also.

You need to change szTimesstamp and nTime. Zero the nonce, merkle root and old genesis block. Compile and run. Boom. Here's the genesis block and merkle root as they come from the printf statements in InitBlockIndex().

If you substitute them into the code, your gen block will be accepted, but you will run into this:
Code:
hash doesn't match nBits.

The code snippet (see above) that begins with
Code:
if (true && block.GetHash() != hashGenesisBlock)

will help you to find the right hash for nBits. You just need to read what it does. It is looping an algorithm and increasing nonce to find a block that satisfies the difficulty. I.e. it is mining. Is it running scrypt? No it isn't, this is X11, so get rid of all that. Where do you get the X11 algorithm? Take a look at the error message you're getting.

That should be enough...

sr. member
Activity: 473
Merit: 250
"Proof-of-Asset Protocol"
April 07, 2014, 05:10:25 PM
#56
Ok. I had yet another look at this. I thought scrypt-n is one of the  x11 algorithms but apparently it is not.. Embarrassed
Because of that, the genesis block-producing code that you posted will not work, as it is for "standard scrypt".

When I have little more time I'll see if I can figure it out.

But first let's be clear; are you after X11 or scrypt-N coin?


X11

btw, I used the existing code... copied working X11 hash/root/timestamp from another coin, it worked like charm. So it is just the matter of script generating that needs update.

legendary
Activity: 996
Merit: 1013
April 07, 2014, 05:00:38 PM
#55
Ok. I had yet another look at this. I thought scrypt-n is one of the  x11 algorithms but apparently it is not.. Embarrassed
Because of that, the genesis block-producing code that you posted will not work, as it is for "standard scrypt".

When I have little more time I'll see if I can figure it out.

But first let's be clear; are you after X11 or scrypt-N coin?




sr. member
Activity: 473
Merit: 250
"Proof-of-Asset Protocol"
April 07, 2014, 03:08:49 PM
#54
It looks like InitBlockIndex() is the same in Darkcoin, so you could try running that and see if you get the values.

Got same result using darkcoin as well.

their must be easy way to change the python scrypt in include X11 info as well.
legendary
Activity: 996
Merit: 1013
April 07, 2014, 01:50:53 PM
#53
It looks like InitBlockIndex() is the same in Darkcoin, so you could try running that and see if you get the values.
sr. member
Activity: 473
Merit: 250
"Proof-of-Asset Protocol"
April 07, 2014, 01:39:00 PM
#52
Now something like
https://github.com/evan82/darkcoin/blob/master/src/main.cpp
uses same setup as well?

sr. member
Activity: 473
Merit: 250
"Proof-of-Asset Protocol"
April 07, 2014, 01:37:24 PM
#51
Try including scrypt.h

edit. I took a look at Vertcoin source, and there you have

main.cpp 4745:
Code:
unsigned long int scrypt_scratpad_size_current_block = ((1 << (GetNfactor(pblock->nTime) + 1)) * 128 ) + 63;
            
char scratchpad[scrypt_scratpad_size_current_block];

Looks like n-scrypt resizes scratchpad per block.
Your best bet is to study Vertcoin or some other similar coin and make changes accordingly.


use the above python script
got values & hash, updated main.cpp & checkpoint.cpp

removed genesis generating code from main.cpp
Compile the code.

Ran it...

root@PC:~/src# ./vicoind
vicoind: main.cpp:3050: bool InitBlockIndex(): Assertion `hash == hashGenesisBlock' failed.
Aborted (core dumped)


so I guess you are right, the scrypt does not support X11 scrypt coin. I looked at the code of the scrypt it is few lines, is it possible to modify it, maybe you can help out.


Code:
import hashlib, binascii, struct, array, os, time, sys, optparse
import scrypt

from construct import *


def main():
  options = get_args()

  # https://en.bitcoin.it/wiki/Difficulty
  bits = get_bits(options)
  target = get_target(options)

  input_script = create_input_script(options.timestamp)
  output_script = create_output_script(options.pubkey)

  # hash merkle root is the double sha256 hash of the transaction(s)
  tx = create_transaction(input_script, output_script)
  hash_merkle_root = hashlib.sha256(hashlib.sha256(tx).digest()).digest()
  print_block_info(options, hash_merkle_root)

  block_header = create_block_header(hash_merkle_root, options.time, bits, options.nonce)
  genesis_hash, nonce = generate_hash(block_header, options.scrypt, options.nonce, target)
  announce_found_genesis(genesis_hash, nonce)


def get_args():
  parser = optparse.OptionParser()
  parser.add_option("-t", "--time", dest="time", default=int(time.time()),
                   type="int", help="the (unix) time when the genesisblock is created")
  parser.add_option("-z", "--timestamp", dest="timestamp", default="The Times 03/Jan/2009 Chancellor on brink of second bailout for banks",
                   type="string", help="the pszTimestamp found in the coinbase of the genesisblock")
  parser.add_option("-n", "--nonce", dest="nonce", default=0,
                   type="int", help="the first value of the nonce that will be incremented when searching the genesis hash")
  parser.add_option("-s", "--scrypt", dest="scrypt", default=False, action="store_true",
                    help="calculate genesis block using scrypt")
  parser.add_option("-p", "--pubkey", dest="pubkey", default="04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f",
                   type="string", help="the pubkey found in the output script")

  (options, args) = parser.parse_args()
  return options


def get_bits(options):
  return 0x1e0ffff0 if options.scrypt else 0x1d00ffff


def get_target(options):
  return 0x0ffff0 * 2**(8*(0x1e - 3)) if options.scrypt else 0x00ffff * 2**(8*(0x1d - 3))


def create_input_script(psz_timestamp):
  script_prefix = '04ffff001d0104' + chr(len(psz_timestamp)).encode('hex')
  return (script_prefix + psz_timestamp.encode('hex')).decode('hex')


def create_output_script(pubkey):
  script_len = '41'
  OP_CHECKSIG = 'ac'
  return (script_len + pubkey + OP_CHECKSIG).decode('hex')


def create_transaction(input_script, output_script):
  transaction = Struct("transaction",
    Bytes("version", 4),
    Byte("num_inputs"),
    StaticField("prev_output", 32),
    UBInt32('prev_out_idx'),
    Byte('input_script_len'),
    Bytes('input_script', len(input_script)),
    UBInt32('sequence'),
    Byte('num_outputs'),
    Bytes('out_value', 8),
    Byte('output_script_len'),
    Bytes('output_script', 0x43),
    UBInt32('locktime'))

  tx = transaction.parse('\x00'*(127 + len(input_script)))
  tx.version = struct.pack('  tx.num_inputs = 1
  tx.prev_output = struct.pack('  tx.prev_out_idx = 0xFFFFFFFF
  tx.input_script_len = len(input_script)
  tx.input_script = input_script
  tx.sequence = 0xFFFFFFFF
  tx.num_outputs = 1
  tx.out_value = struct.pack('  tx.output_script_len = 0x43
  tx.output_script = output_script
  tx.locktime = 0
  return transaction.build(tx)


def create_block_header(hash_merkle_root, time, bits, nonce):
  block_header = Struct("block_header",
    Bytes("version",4),
    Bytes("hash_prev_block", 32),
    Bytes("hash_merkle_root", 32),
    Bytes("time", 4),
    Bytes("bits", 4),
    Bytes("nonce", 4))

  genesisblock = block_header.parse('\x00'*80)
  genesisblock.version = struct.pack('  genesisblock.hash_prev_block = struct.pack('  genesisblock.hash_merkle_root = hash_merkle_root
  genesisblock.time = struct.pack('  genesisblock.bits = struct.pack('  genesisblock.nonce = struct.pack('  return block_header.build(genesisblock)


# https://en.bitcoin.it/wiki/Block_hashing_algorithm
def generate_hash(data_block, is_scrypt, start_nonce, target):
  print 'Searching for genesis hash..'
  nonce = start_nonce
  last_updated = time.time()
  difficulty = float(0xFFFF) * 2**208 / target
  update_interval = int(1000000 * difficulty)

  while True:
    sha256_hash, header_hash = generate_hashes_from_block(data_block, is_scrypt)
    last_updated = calculate_hashrate(nonce, update_interval, difficulty, last_updated)
    if is_genesis_hash(header_hash, target):
      return (sha256_hash, nonce)
    else:
     nonce = nonce + 1
     data_block = data_block[0:len(data_block) - 4] + struct.pack('

def generate_hashes_from_block(data_block, is_scrypt):
  sha256_hash = hashlib.sha256(hashlib.sha256(data_block).digest()).digest()[::-1]
  header_hash = scrypt.hash(data_block,data_block,1024,1,1,32)[::-1] if is_scrypt else sha256_hash
  return sha256_hash, header_hash


def is_genesis_hash(header_hash, target):
  return int(header_hash.encode('hex_codec'), 16) < target


def calculate_hashrate(nonce, update_interval, difficulty, last_updated):
  if nonce % update_interval == update_interval - 1:
    now = time.time()
    hashrate = round(update_interval/(now - last_updated))
    generation_time = round(difficulty * pow(2, 32) / hashrate / 3600, 1)
    sys.stdout.write("\r%s hash/s, estimate: %s h"%(str(hashrate), str(generation_time)))
    sys.stdout.flush()
    return now
  else:
    return last_updated


def print_block_info(options, hash_merkle_root):
  print "algorithm: " + ("scrypt" if options.scrypt else "sha256")
  print "merkle hash: " + hash_merkle_root[::-1].encode('hex_codec')
  print "pszTimestamp: " + options.timestamp
  print "pubkey: " + options.pubkey
  print "time: " + str(options.time)
  print "bits: " + str(hex(get_bits(options)))


def announce_found_genesis(genesis_hash, nonce):
  print "genesis hash found!"
  print "nonce: " + str(nonce)
  print "genesis hash: " + genesis_hash.encode('hex_codec')


# GOGOGO!
main()
legendary
Activity: 996
Merit: 1013
April 07, 2014, 12:50:52 PM
#50
Try including scrypt.h

edit. I took a look at Vertcoin source, and there you have

main.cpp 4745:
Code:
unsigned long int scrypt_scratpad_size_current_block = ((1 << (GetNfactor(pblock->nTime) + 1)) * 128 ) + 63;
            
char scratchpad[scrypt_scratpad_size_current_block];

Looks like n-scrypt resizes scratchpad per block.
Your best bet is to study Vertcoin or some other similar coin and make changes accordingly.
sr. member
Activity: 473
Merit: 250
"Proof-of-Asset Protocol"
April 07, 2014, 11:52:35 AM
#49
Well you obviously need python implementation of scrypt...

Are trying to make your own coin? I strongly recommend that you learn a bit of c++
so that you know what kind of questions to ask when obstacles present themselves.

Especially since people might even invest their hard-earned money in the coin you have rolled.



yes I do have some experience & knowledge in C++, perl. I know code is looking for declared global or local variable SCRYPT_SCRATCHPAD_SIZE,
legendary
Activity: 996
Merit: 1013
April 07, 2014, 11:44:18 AM
#48
Well you obviously need python implementation of scrypt...

Are trying to make your own coin? I strongly recommend that you learn a bit of c++
so that you know what kind of questions to ask when obstacles present themselves.

Especially since people might even invest their hard-earned money in the coin you have rolled.

Pages:
Jump to: