9

Here's the setup I'm trying to use:

A genesis.json with the alloc field set to include code.

"alloc": {
    "0000000000000000000000000000000000000001": {
      "code": "6060604052608f8060106000396000f360606040526000357c0100000000000000000000000000000000000000000000000000000000900480634e70b1dc14604157806360fe47b114606257603f565b005b604c60048050506078565b6040518082815260200191505060405180910390f35b607660048080359060200190919050506081565b005b60006000505481565b806000600050819055505b5056"
    }
}

Then running geth and entering (with a default account set, unlocked, and loaded):

var getAndSetContract = eth.contract([{"constant":true,"inputs":[],"name":"num","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"val","type":"uint256"}],"name":"set","outputs":[],"type":"function"}])
var getAndSet = getAndSetContract.at("0000000000000000000000000000000000000001")
getAndSet.set(2, {gas: 1000000})
miner.start()
// a few blocks quickly roll in given this is on a private testing blockchain
miner.stop()
getAndSet.num()
Results in a final returned value of
3.054357634959941643970700719428062453954541146150392020568168920432276498019e+75
versus the desired
2

Here's the contract source:

contract getAndSet {
    uint public num;
    function set(uint val){
        num = val;
    }
}

This whole adventure started after coming across this line in the geth source: https://github.com/ethereum/go-ethereum/blob/290e851f57f5d27a1d5f0f7ad784c836e017c337/core/genesis.go#L56 I think I saw something about preloading contracts in the past, though I haven't been able to dig anything up. AFAIK I could be on a wild goose chase trying to make use of a half-implemented feature.

  • Have you tried with a higher address? Address 1 is for ecrecover (ethereum.stackexchange.com/questions/440/…) and you might be invoking it instead of your contract. – eth Aug 3 '16 at 10:38
  • I tried changing it to "1000000000000000000000000000000000000002", still doesn't work though the returned value changed to 4.3592315083973277133168013697365335412971280313784556186150828777023154946048e+76 – Jeffrey B. Petersen Aug 3 '16 at 12:55
  • web3.js usually needs '0x' and it might need to be added to getAndSetContract.at("0x... – eth Aug 3 '16 at 19:23
3

How did you build yor contract ? If you want to add a contract to genesis block you need to build it with solc --bin-runtime.

By default solc and ide like remix build return code that is used for creating the contract. This code returns the actual code that is stored in the blockchain

2

Your method does not return any value. Calling set() will return the transaction hash of the calling transaction. You also need to specify the account from which you are deploying the transaction:

getAndSet.set(2, {eth.accounts[0], gas: 1000000});

(make sure you have enough balance on that account).

  • I'm calling the generated constant function num() which returns the variable by the same name: solidity.readthedocs.io/en/latest/… – Jeffrey B. Petersen Aug 3 '16 at 12:37
  • Oh, I see. Have you tried specifying the account from which the contract deployment transaction is made? – Sebi Aug 3 '16 at 12:45
  • I have the default account set, the from field in the transaction object defaults to it – Jeffrey B. Petersen Aug 3 '16 at 12:53
  • Not always. I have run into this a few days ago. It's much safer to explicitly specify all fields. – Sebi Aug 3 '16 at 12:59
  • 1
    @JeffreyB.Petersen did you find a solution ?? – Vishal Sharma Dec 19 '17 at 9:52

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.