diff --git a/contracts/casper.go b/contracts/casper.go index e1b767c0ed3..a4c46c95ad9 100644 --- a/contracts/casper.go +++ b/contracts/casper.go @@ -17,7 +17,14 @@ package contracts import ( + "encoding/hex" "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/rlp" ) // Casper defines the casper contract interface @@ -29,3 +36,77 @@ type Casper interface { // GetCheckpointHashes returns the checkpoint hashes GetCheckpointHashes(*big.Int) ([32]byte, error) } + +const ( + gasPriceFund = 25000000000 + gasLimit = 90000 + gasLimitCasper = 5000000 +) + +// CasperInitializers return initial transactions to fund and deploy rlp, sighasher, purity_checker, casper contracts +func CasperInitializers(nonce uint64, senderKey string) ([]*types.Transaction, []common.Address, error) { + var addrs []common.Address + var txs []*types.Transaction + rlpDecoderHexTx := [3]string{ + // viper_rlp_decoder_tx + "f9035b808506fc23ac0083045f788080b903486103305660006109ac5260006109cc527f0100000000000000000000000000000000000000000000000000000000000000600035046109ec526000610a0c5260006109005260c06109ec51101515585760f86109ec51101561006e5760bf6109ec510336141558576001610a0c52610098565b60013560f76109ec51036020035260005160f66109ec510301361415585760f66109ec5103610a0c525b61022060016064818352015b36610a0c511015156100b557610291565b7f0100000000000000000000000000000000000000000000000000000000000000610a0c5135046109ec526109cc5160206109ac51026040015260016109ac51016109ac5260806109ec51101561013b5760016109cc5161044001526001610a0c516109cc5161046001376001610a0c5101610a0c5260216109cc51016109cc52610281565b60b86109ec5110156101d15760806109ec51036109cc51610440015260806109ec51036001610a0c51016109cc51610460013760816109ec5114156101ac5760807f01000000000000000000000000000000000000000000000000000000000000006001610a0c5101350410151558575b607f6109ec5103610a0c5101610a0c5260606109ec51036109cc51016109cc52610280565b60c06109ec51101561027d576001610a0c51013560b76109ec510360200352600051610a2c526038610a2c5110157f01000000000000000000000000000000000000000000000000000000000000006001610a0c5101350402155857610a2c516109cc516104400152610a2c5160b66109ec5103610a0c51016109cc516104600137610a2c5160b66109ec5103610a0c510101610a0c526020610a2c51016109cc51016109cc5261027f565bfe5b5b5b81516001018083528114156100a4575b5050601f6109ac511115155857602060206109ac5102016109005260206109005103610a0c5261022060016064818352015b6000610a0c5112156102d45761030a565b61090051610a0c516040015101610a0c51610900516104400301526020610a0c5103610a0c5281516001018083528114156102c3575b50506109cc516109005101610420526109cc5161090051016109005161044003f35b61000461033003610004600039610004610330036000f31b2d4f", + // sig_hasher_tx + "f9016d808506fc23ac0083026a508080b9015a6101488061000e6000396101565660007f01000000000000000000000000000000000000000000000000000000000000006000350460f8811215610038576001915061003f565b60f6810391505b508060005b368312156100c8577f01000000000000000000000000000000000000000000000000000000000000008335048391506080811215610087576001840193506100c2565b60b881121561009d57607f8103840193506100c1565b60c08112156100c05760b68103600185013560b783036020035260005101840193505b5b5b50610044565b81810360388112156100f4578060c00160005380836001378060010160002060e052602060e0f3610143565b61010081121561010557600161011b565b6201000081121561011757600261011a565b60035b5b8160005280601f038160f701815382856020378282600101018120610140526020610140f350505b505050505b6000f31b2d4f", + // purity_checker_tx + "f90467808506fc23ac00830583c88080b904546104428061000e60003961045056600061033f537c0100000000000000000000000000000000000000000000000000000000600035047f80010000000000000000000000000000000000000030ffff1c0e00000000000060205263a1903eab8114156103f7573659905901600090523660048237600435608052506080513b806020015990590160009052818152602081019050905060a0526080513b600060a0516080513c6080513b8060200260200159905901600090528181526020810190509050610100526080513b806020026020015990590160009052818152602081019050905061016052600060005b602060a05103518212156103c957610100601f8360a051010351066020518160020a161561010a57fe5b80606013151561011e57607f811315610121565b60005b1561014f5780607f036101000a60018460a0510101510482602002610160510152605e8103830192506103b2565b60f18114801561015f5780610164565b60f282145b905080156101725780610177565b60f482145b9050156103aa5760028212151561019e5760606001830360200261010051015112156101a1565b60005b156101bc57607f6001830360200261010051015113156101bf565b60005b156101d157600282036102605261031e565b6004821215156101f057600360018303602002610100510151146101f3565b60005b1561020d57605a6002830360200261010051015114610210565b60005b1561022b57606060038303602002610100510151121561022e565b60005b1561024957607f60038303602002610100510151131561024c565b60005b1561025e57600482036102605261031d565b60028212151561027d57605a6001830360200261010051015114610280565b60005b1561029257600282036102605261031c565b6002821215156102b157609060018303602002610100510151146102b4565b60005b156102c657600282036102605261031b565b6002821215156102e65760806001830360200261010051015112156102e9565b60005b156103035760906001830360200261010051015112610306565b60005b1561031857600282036102605261031a565bfe5b5b5b5b5b604060405990590160009052600081526102605160200261016051015181602001528090502054156103555760016102a052610393565b60306102605160200261010051015114156103755760016102a052610392565b60606102605160200261010051015114156103915760016102a0525b5b5b6102a051151561039f57fe5b6001830192506103b1565b6001830192505b5b8082602002610100510152600182019150506100e0565b50506001604060405990590160009052600081526080518160200152809050205560016102e05260206102e0f35b63c23697a8811415610440573659905901600090523660048237600435608052506040604059905901600090526000815260805181602001528090502054610300526020610300f35b505b6000f31b2d4f", + } + + key, err := crypto.HexToECDSA(senderKey) + if err != nil { + log.Error("Failed to parse the private key", "err", err) + return nil, nil, err + } + + signer := types.HomesteadSigner{} + for i := 0; i < len(rlpDecoderHexTx); i++ { + rawTx, err := hex.DecodeString(rlpDecoderHexTx[i]) + if err != nil { + log.Error("Failed to decode the raw transaction", "err", err) + return nil, nil, err + } + tx := &types.Transaction{} + rlp.DecodeBytes(rawTx, tx) + + sender, err := types.Sender(signer, tx) + if err != nil { + log.Error("Failed to get the sender", "err", err) + return nil, nil, err + } + // Save contract address + addrs = append(addrs, crypto.CreateAddress(sender, tx.Nonce())) + + // Create a fund tx to send value to the sender of contracts + amount := new(big.Int).Mul(new(big.Int).SetUint64(tx.Gas()), tx.GasPrice()) + amount.Add(amount, tx.Value()) + fundTx := types.NewTransaction(nonce, sender, amount, gasLimit, new(big.Int).SetUint64(gasPriceFund), []byte{}) + fundTx, err = types.SignTx(fundTx, signer, key) + if err != nil { + log.Error("Failed to sign the fund tx", "err", err) + return nil, nil, err + } + + txs = append(txs, fundTx, tx) + nonce++ + } + + // TODO: try to use binding code to deploy contract + // Casper deploy tx + casperRawTx := `600035601c52740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a05261010061377f6101403934156100a857600080fd5b606051602061377f60c03960c051806040519013585780919012156100cc57600080fd5b506060516020602061377f0160c03960c051806040519013585780919012156100f457600080fd5b506020604061377f0160c03960c051602051811061011157600080fd5b506020606061377f0160c03960c051602051811061012e57600080fd5b506020608061377f0160c03960c051602051811061014b57600080fd5b50606051602060e061377f0160c03960c0518060405190135857809190121561017357600080fd5b50610140516010556101605160115560016002556101805160165568056bc75e2d63100000600d60c052602060c020556000600455606051601054806101b857600080fd5b4305806040519013585780919012156101d057600080fd5b6012556101a0516018556101c051601955600060075560006008556101e051601b5561020051601c557f632a9a52ef120699847d16b5c0f45b7d5ff4404dd8054906681967edc6094fbf601d5561022051601e5561376756600035601c52740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a0526394113f78600051141561017b5734156100ac57600080fd5b60a051601554601254600b60c052602060c0200160c052602060c02060c052602060c0200154600754806100df57600080fd5b806402540be400830205905090508060805190135857809190121561010357600080fd5b60a0516015546003601254600b60c052602060c0200160c052602060c0200160c052602060c02001546008548061013957600080fd5b806402540be400830205905090508060805190135857809190121561015d57600080fd5b8082131561016b578061016d565b815b9050905060005260206000f3005b63843b0890600051141561022f576020600461014037341561019c57600080fd5b606051600435806040519013585780919012156101b857600080fd5b506402540be40060a051601254600d60c052602060c0200154600161014051600060c052602060c0200160c052602060c0200154818102811983838305141761020057600080fd5b6402540be40081059050905090508060805190135857809190121561022457600080fd5b0560005260206000f3005b633b812ec360005114156102a657341561024857600080fd5b6402540be40060a051601254600d60c052602060c0200154600754818102811983838305141761027757600080fd5b6402540be40081059050905090508060805190135857809190121561029b57600080fd5b0560005260206000f3005b63679dea62600051141561031d5734156102bf57600080fd5b6402540be40060a051601254600d60c052602060c020015460085481810281198383830514176102ee57600080fd5b6402540be40081059050905090508060805190135857809190121561031257600080fd5b0560005260206000f3005b63b2ae3f50600051141561034357341561033657600080fd5b60155460005260206000f3005b63cadbbfc160005114156103c057341561035c57600080fd5b6060516001606051601054601254028060405190135857809190121561038157600080fd5b038060405190135857809190121561039857600080fd5b61010043038112156103a957600080fd5b4381106103b557600080fd5b4060005260206000f3005b63de7f997560005114156103fc5734156103d957600080fd5b3033146103e557600080fd5b6000600854136000600754131660005260206000f3005b63d286bb82600051141561051657341561041557600080fd5b30331461042157600080fd5b601254610140526001606051600261014051038060405190135857809190121561044a57600080fd5b600b60c052602060c0200160c052602060c0200154156104d057600460605160018254018060405190135857809190121561048457600080fd5b815550600754600855600760a051600554825401806080519013585780919012156104ae57600080fd5b815550600654600555600060065561014051600454600960c052602060c02001555b60045461014051600a60c052602060c0200155600c541561050f57606051600161014051038060405190135857809190121561050b57600080fd5b6015555b6000600c55005b63fa650b2a600051141561056d57341561052f57600080fd5b30331461053b57600080fd5b6012546101405260605160135461014051038060405190135857809190121561056357600080fd5b60005260206000f3005b6370af50be600051141561077d57341561058657600080fd5b30331461059257600080fd5b60125461014052600260206101c0600463fa650b2a6101605261017c6000305af16105bc57600080fd5b6101c05113156101e0526101e051156020610260600463de7f99756102005261021c6000305af16105ec57600080fd5b6102605115171561060257600060005260206000f35b60a051601554606051600161014051038060405190135857809190121561062857600080fd5b600b60c052602060c0200160c052602060c02060c052602060c02001546007548061065257600080fd5b806402540be400830205905090508060805190135857809190121561067657600080fd5b6102805260a051601554600360605160016101405103806040519013585780919012156106a257600080fd5b600b60c052602060c0200160c052602060c0200160c052602060c0200154600854806106cd57600080fd5b806402540be40083020590509050806080519013585780919012156106f157600080fd5b6102a052610280516102a0518082131561070b578061070d565b815b905090506102c05260a051600260a051601a546102c051818102811983838305141761073857600080fd5b6402540be40081059050905090508060805190135857809190121561075c57600080fd5b058060805190135857809190121561077357600080fd5b60005260206000f3005b636526ed72600051141561086857341561079657600080fd5b3033146107a257600080fd5b601254610140526001600c556001600260605160016101405103806040519013585780919012156107d257600080fd5b600b60c052602060c0200160c052602060c020015560016001606051600161014051038060405190135857809190121561080b57600080fd5b600b60c052602060c0200160c052602060c0200155606051600161014051038060405190135857809190121561084057600080fd5b601455606051600161014051038060405190135857809190121561086357600080fd5b601355005b63d9d341b96000511415610a52576020600461014037341561088957600080fd5b30331461089557600080fd5b606051600435806040519013585780919012156108b157600080fd5b5060605160016402540be40060a051670de0b6b3a764000060a05160605160016101405103806040519013585780919012156108ec57600080fd5b600d60c052602060c02001546008546007548082121561090c578061090e565b815b90509050818102811983838305141761092657600080fd5b6402540be40081059050905090508060805190135857809190121561094a57600080fd5b058060805190135857809190121561096157600080fd5b05018060405190135857809190121561097957600080fd5b6101605260a0516404a817c80068056bc75e2d63100000610160510205806080519013585780919012156109ac57600080fd5b610180526101a060006014818352015b60a051600260a05160a05161018051806109d557600080fd5b68056bc75e2d63100000610160510205806080519013585780919012156109fb57600080fd5b610180510180608051901358578091901215610a1657600080fd5b0580608051901358578091901215610a2d57600080fd5b610180525b81516001018083528114156109bc575b50506101805160005260206000f3005b635dcffc176000511415610ddb5760206004610140373415610a7357600080fd5b60605160043580604051901358578091901215610a8f57600080fd5b5060605160105480610aa057600080fd5b430580604051901358578091901215610ab857600080fd5b6101605260605160016012540180604051901358578091901215610adb57600080fd5b61014051146101605161014051131516610af457600080fd5b6101405160125560a051601a5460a05160206101e060046370af50be6101805261019c6000305af1610b2557600080fd5b6101e0516402540be4000180608051901358578091901215610b4657600080fd5b0380608051901358578091901215610b5d57600080fd5b600e5560a05160a051601a546402540be4000180608051901358578091901215610b8657600080fd5b600e548181028119838383051417610b9d57600080fd5b6402540be400810590509050905080608051901358578091901215610bc157600080fd5b600f5560a051600e546060516001610140510380604051901358578091901215610bea57600080fd5b600d60c052602060c02001548181028119838383051417610c0a57600080fd5b6402540be400810590509050905080608051901358578091901215610c2e57600080fd5b61014051600d60c052602060c020015560206102c0600463de7f99756102605261027c6000305af1610c5f57600080fd5b6102c05115610d5e5760a051601b546020610360602463d9d341b96102e05261014051610300526102fc6000305af1610c9757600080fd5b6103605180610ca557600080fd5b806402540be4008302059050905080608051901358578091901215610cc957600080fd5b6103805260a05160a0516020610400600463fa650b2a6103a0526103bc6000305af1610cf457600080fd5b61040051601c548181028119838383051417610d0f57600080fd5b8090509050905080608051901358578091901215610d2c57600080fd5b610380510180608051901358578091901215610d4757600080fd5b601a556000601a5413610d5957600080fd5b610d84565b600060006004636526ed726102005261021c6000305af1610d7e57600080fd5b6000601a555b60006000600463d286bb826104205261043c6000305af1610da457600080fd5b60206104e0600463cadbbfc16104805261049c6000305af1610dc557600080fd5b6104e05161014051600160c052602060c0200155005b63f9609f0860005114156110915760406004610140376004356020518110610e0257600080fd5b506024356020518110610e1457600080fd5b5060605160105480610e2557600080fd5b430580604051901358578091901215610e3d57600080fd5b60125414610e4a57600080fd5b600060006004610180527fa1903eab000000000000000000000000000000000000000000000000000000006101a0526101806004806020846101e001018260208501600060046012f1505080518201915050610140516020826101e0010152602081019050806101e0526101e09050805160200180610260828460006004600a8704601201f1610ed957600080fd5b505060206103006102605161028060006019546207a120f1610efa57600080fd5b60206102e0526102e0602060006020835103811315610f1857600080fd5b0460200260200181015190501415610f2f57600080fd5b61016051600360c052602060c020015415610f4957600080fd5b601e54341215610f5857600080fd5b600254600060c052602060c0200160c052602060c02061014051815560a051601254600d60c052602060c020015480610f9057600080fd5b68056bc75e2d6310000034020580608051901358578091901215610fb357600080fd5b60018201556c0c9f2c9cd04674edea40000000600282015560605160026004540180604051901358578091901215610fea57600080fd5b60038201556101605160048201555060025461016051600360c052602060c0200155600260605160018254018060405190135857809190121561102c57600080fd5b815550600660a05160a051601254600d60c052602060c02001548061105057600080fd5b68056bc75e2d631000003402058060805190135857809190121561107357600080fd5b8254018060805190135857809190121561108c57600080fd5b815550005b6342310c32600051141561148557602060046101403734156110b257600080fd5b610420600435600401610160376104006004356004013511156110d457600080fd5b606051601054806110e457600080fd5b4305806040519013585780919012156110fc57600080fd5b6012541461110957600080fd5b6101608051602001806105a0828460006004600a8704601201f161112c57600080fd5b50506020610a006105a0516105c0600060185462030d40f161114d57600080fd5b60206109e0526109e060206000602083510381131561116b57600080fd5b046020026020018101519050610a4052611000610160610560610a608251602084016000735185d17c44699cecc3133114f8df70753b856709610aa0f150506080610a6051146111ba57600080fd5b610a6051610a60018060200151600082518060209013585780919012156111e057600080fd5b601f6101000a82048115176111f457600080fd5b606051816020036101000a83048060405190135857809190121561121757600080fd5b9050905090508152610a8051610a600180602001516000825180602090135857809190121561124557600080fd5b601f6101000a820481151761125957600080fd5b606051816020036101000a83048060405190135857809190121561127c57600080fd5b9050905090508160200152610aa051610a600180516020018083604001828460006004600a8704601201f16112b057600080fd5b5050506110005161148052611020516114a0526110408051602001806114c0828460006004600a8704601201f16112e657600080fd5b50506114a05160125412156112fa57600080fd5b60016000610a40516020826119000101526020810190506114c06104008060208461190001018260208501600060046078f150508051820191505080611900526119009050805160200180611d60828460006004600a8704601201f161135f57600080fd5b505060206121e0611d6051611d80600061148051600060c052602060c0200160c052602060c020546207a120f161139557600080fd5b60206121c0526121c06020600060208351038113156113b357600080fd5b046020026020018101519050146113c957600080fd5b606051600260045401806040519013585780919012156113e857600080fd5b600261148051600060c052602060c0200160c052602060c02001541361140d57600080fd5b6060516002600454018060405190135857809190121561142c57600080fd5b600261148051600060c052602060c0200160c052602060c0200155600660a051600161148051600060c052602060c0200160c052602060c02001548254038060805190135857809190121561148057600080fd5b815550005b6301b7af1860005114156115af57602060046101403734156114a657600080fd5b3033146114b257600080fd5b606051600435806040519013585780919012156114ce57600080fd5b50606051600260045401806040519013585780919012156114ee57600080fd5b600261014051600060c052602060c0200160c052602060c0200154131561154c57600560a051600161014051600060c052602060c0200160c052602060c02001548254038060805190135857809190121561154857600080fd5b8155505b6000600461014051600060c052602060c0200160c052602060c0200154600360c052602060c020015561014051600060c052602060c0200160c052602060c020600081556000600182015560006002820155600060038201556000600482015550005b63edea1480600051141561177657602060046101403734156115d057600080fd5b606051600435806040519013585780919012156115ec57600080fd5b506060516001600261014051600060c052602060c0200160c052602060c0200154018060405190135857809190121561162457600080fd5b600454121561163257600080fd5b6060516001600261014051600060c052602060c0200160c052602060c0200154018060405190135857809190121561166957600080fd5b600960c052602060c02001546101605260605160115461016051018060405190135857809190121561169a57600080fd5b60125412156116a857600080fd5b6402540be40060a05161016051600d60c052602060c0200154600161014051600060c052602060c0200160c052602060c020015481810281198383830514176116f057600080fd5b6402540be40081059050905090508060805190135857809190121561171457600080fd5b0561018052600060006000600061018051600461014051600060c052602060c0200160c052602060c02001546000f161174c57600080fd5b6000600060246301b7af186101a052610140516101c0526101bc6000305af161177457600080fd5b005b63579f38b26000511415611a70576040600461014037341561179757600080fd5b3033146117a357600080fd5b606051600435806040519013585780919012156117bf57600080fd5b50606051602435806040519013585780919012156117dc57600080fd5b50600361014051600060c052602060c0200160c052602060c0200154600960c052602060c020015461018052600161014051600060c052602060c0200160c052602060c0200160a0516402540be40061016051028254018060805190135857809190121561184957600080fd5b815550600361014051600060c052602060c0200160c052602060c02001546101a052600261014051600060c052602060c0200160c052602060c02001546101c0526004546101e05260605160016101e05103806040519013585780919012156118b157600080fd5b610200526101c0516101e051126101e0516101a051131516156118fb57600760a0516402540be4006101605102825401806080519013585780919012156118f757600080fd5b8155505b6101c0516102005112610200516101a0511315161561194157600860a0516402540be40061016051028254018060805190135857809190121561193d57600080fd5b8155505b60605160016101c051038060405190135857809190121561196157600080fd5b6101e051141561199857600560a0516402540be40061016051028254038060805190135857809190121561199457600080fd5b8155505b60605160026101c05103806040519013585780919012156119b857600080fd5b6101e05114156119ef57600660a0516402540be4006101605102825403806080519013585780919012156119eb57600080fd5b8155505b60006000600060006402540be40060a051600860a051601254600d60c052602060c0200154610160518181028119838383051417611a2c57600080fd5b8090509050905080608051901358578091901215611a4957600080fd5b0580608051901358578091901215611a6057600080fd5b05416000f1611a6e57600080fd5b005b63e9dc061460005114156123ec5760206004610140373415611a9157600080fd5b61042060043560040161016037610400600435600401351115611ab357600080fd5b6101608051602001806105a0828460006004600a8704601201f1611ad657600080fd5b50506020610a006105a0516105c0600060185462030d40f1611af757600080fd5b60206109e0526109e0602060006020835103811315611b1557600080fd5b046020026020018101519050610a40526110c0610160610620610a608251602084016000735185d17c44699cecc3133114f8df70753b856709610dc0f1505060c0610a605114611b6457600080fd5b610a6051610a6001806020015160008251806020901358578091901215611b8a57600080fd5b601f6101000a8204811517611b9e57600080fd5b606051816020036101000a830480604051901358578091901215611bc157600080fd5b90509050905081526020610a8051610a60015114611bde57600080fd5b610a8051610a8001518160200152610aa051610a6001806020015160008251806020901358578091901215611c1257600080fd5b601f6101000a8204811517611c2657600080fd5b606051816020036101000a830480604051901358578091901215611c4957600080fd5b9050905090508160400152610ac051610a6001806020015160008251806020901358578091901215611c7a57600080fd5b601f6101000a8204811517611c8e57600080fd5b606051816020036101000a830480604051901358578091901215611cb157600080fd5b9050905090508160600152610ae051610a600180516020018083608001828460006004600a8704601201f1611ce557600080fd5b5050506110c051611580526110e0516115a052611100516115c052611120516115e052611140805160200180611600828460006004600a8704601201f1611d2b57600080fd5b505060016000610a4051602082611a4001015260208101905061160061040080602084611a4001018260208501600060046078f150508051820191505080611a4052611a409050805160200180611ea0828460006004600a8704601201f1611d9257600080fd5b50506020612320611ea051611ec0600061158051600060c052602060c0200160c052602060c020546207a120f1611dc857600080fd5b602061230052612300602060006020835103811315611de657600080fd5b04602002602001810151905014611dfc57600080fd5b6001606051610100611580510780604051901358578091901215611e1f57600080fd5b600081131515611e37578060000360020a8204611e3e565b8060020a82025b90509050606051610100611580510580604051901358578091901215611e6357600080fd5b6115a05160046115c051600b60c052602060c0200160c052602060c0200160c052602060c0200160c052602060c02001541615611e9f57600080fd5b60206123c0600463cadbbfc16123605261237c6000305af1611ec057600080fd5b6123c0516115a05114611ed257600080fd5b60026115e051600b60c052602060c0200160c052602060c0200154611ef657600080fd5b600361158051600060c052602060c0200160c052602060c02001546123e052600261158051600060c052602060c0200160c052602060c0200154612400526115c051600a60c052602060c0200154612420526060516001612420510380604051901358578091901215611f6857600080fd5b61244052612400516124205112612420516123e05113151661246052612400516124405112612440516123e05113151661248052612480516124605117611fae57600080fd5b6001606051610100611580510780604051901358578091901215611fd157600080fd5b600081131515611fe9578060000360020a8204611ff0565b8060020a82025b9050905060605161010061158051058060405190135857809190121561201557600080fd5b6115a05160046115c051600b60c052602060c0200160c052602060c0200160c052602060c0200160c052602060c02001541760605161010061158051058060405190135857809190121561206857600080fd5b6115a05160046115c051600b60c052602060c0200160c052602060c0200160c052602060c0200160c052602060c02001556115e0516115c051600b60c052602060c0200160c052602060c02060c052602060c02001546124a0526115e05160036115c051600b60c052602060c0200160c052602060c0200160c052602060c02001546124c052612460511561215e576124a060a051600161158051600060c052602060c0200160c052602060c02001548251018060805190135857809190121561213157600080fd5b8152506124a0516115e0516115c051600b60c052602060c0200160c052602060c02060c052602060c02001555b61248051156121d1576124c060a051600161158051600060c052602060c0200160c052602060c0200154825101806080519013585780919012156121a157600080fd5b8152506124c0516115e05160036115c051600b60c052602060c0200160c052602060c0200160c052602060c02001555b6115e051601554146115c05160125414161561227c576402540be40060a051601a54600161158051600060c052602060c0200160c052602060c0200154818102811983838305141761222257600080fd5b6402540be40081059050905090508060805190135857809190121561224657600080fd5b056124e05260006000604463579f38b26125005261158051612520526124e0516125405261251c6000305af161227b57600080fd5b5b60026115c051600b60c052602060c0200160c052602060c02001541560a051600360a051600260085481810281198383830514176122b957600080fd5b80905090509050806080519013585780919012156122d657600080fd5b05806080519013585780919012156122ed57600080fd5b6124c051121560a051600360a0516002600754818102811983838305141761231457600080fd5b809050905090508060805190135857809190121561233157600080fd5b058060805190135857809190121561234857600080fd5b6124a05112151616156123dc57600160026115c051600b60c052602060c0200160c052602060c02001556115c0516014556012546115c051141561238c576001600c555b60605160016115e05101806040519013585780919012156123ac57600080fd5b6115c05114156123db57600160016115e051600b60c052602060c0200160c052602060c02001556115e0516013555b5b610160601d54815160208301a150005b63cc20f16b6000511415612c4d576040600461014037341561240d57600080fd5b6104206004356004016101803761040060043560040135111561242f57600080fd5b6104206024356004016105c03761040060243560040135111561245157600080fd5b610180805160200180610a00828460006004600a8704601201f161247457600080fd5b50506020610e60610a0051610a20600060185462030d40f161249557600080fd5b6020610e4052610e406020600060208351038113156124b357600080fd5b046020026020018101519050610ea052611520610180610620610ec08251602084016000735185d17c44699cecc3133114f8df70753b856709610dc0f1505060c0610ec0511461250257600080fd5b610ec051610ec00180602001516000825180602090135857809190121561252857600080fd5b601f6101000a820481151761253c57600080fd5b606051816020036101000a83048060405190135857809190121561255f57600080fd5b90509050905081526020610ee051610ec001511461257c57600080fd5b610ee051610ee001518160200152610f0051610ec0018060200151600082518060209013585780919012156125b057600080fd5b601f6101000a82048115176125c457600080fd5b606051816020036101000a8304806040519013585780919012156125e757600080fd5b9050905090508160400152610f2051610ec00180602001516000825180602090135857809190121561261857600080fd5b601f6101000a820481151761262c57600080fd5b606051816020036101000a83048060405190135857809190121561264f57600080fd5b9050905090508160600152610f4051610ec00180516020018083608001828460006004600a8704601201f161268357600080fd5b505050611520516119e05261156051611a005261158051611a20526115a0805160200180611a40828460006004600a8704601201f16126c157600080fd5b505060016000610ea051602082611e80010152602081019050611a4061040080602084611e8001018260208501600060046078f150508051820191505080611e8052611e8090508051602001806122e0828460006004600a8704601201f161272857600080fd5b505060206127606122e05161230060006119e051600060c052602060c0200160c052602060c020546207a120f161275e57600080fd5b60206127405261274060206000602083510381131561277c57600080fd5b0460200260200181015190501461279257600080fd5b6105c08051602001806127a0828460006004600a8704601201f16127b557600080fd5b50506020612c006127a0516127c0600060185462030d40f16127d657600080fd5b6020612be052612be06020600060208351038113156127f457600080fd5b046020026020018101519050612c40526115206105c0610620612c608251602084016000735185d17c44699cecc3133114f8df70753b856709610dc0f1505060c0612c60511461284357600080fd5b612c6051612c600180602001516000825180602090135857809190121561286957600080fd5b601f6101000a820481151761287d57600080fd5b606051816020036101000a8304806040519013585780919012156128a057600080fd5b90509050905081526020612c8051612c600151146128bd57600080fd5b612c8051612c8001518160200152612ca051612c60018060200151600082518060209013585780919012156128f157600080fd5b601f6101000a820481151761290557600080fd5b606051816020036101000a83048060405190135857809190121561292857600080fd5b9050905090508160400152612cc051612c600180602001516000825180602090135857809190121561295957600080fd5b601f6101000a820481151761296d57600080fd5b606051816020036101000a83048060405190135857809190121561299057600080fd5b9050905090508160600152612ce051612c600180516020018083608001828460006004600a8704601201f16129c457600080fd5b505050611520516132c052611560516132e05261158051613300526115a0805160200180613320828460006004600a8704601201f1612a0257600080fd5b505060016000612c40516020826137600101526020810190506133206104008060208461376001018260208501600060046078f150508051820191505080613760526137609050805160200180613bc0828460006004600a8704601201f1612a6957600080fd5b50506020614040613bc051613be060006132c051600060c052602060c0200160c052602060c020546207a120f1612a9f57600080fd5b602061402052614020602060006020835103811315612abd57600080fd5b04602002602001810151905014612ad357600080fd5b6132c0516119e05114612ae557600080fd5b612c4051610ea0511415612af857600080fd5b6000614080526132e051611a00511415612b1757600161408052612b4b565b611a20516133005112611a00516132e051131661330051611a2051126132e051611a005113161715612b4a576001614080525b5b61408051612b5857600080fd5b6020614120602463843b08906140a0526119e0516140c0526140bc6000305af1612b8157600080fd5b61412051614140526060516019614140510580604051901358578091901215612ba957600080fd5b61416052601760605160605160196060516018614140510280604051901358578091901215612bd757600080fd5b0580604051901358578091901215612bee57600080fd5b82540180604051901358578091901215612c0757600080fd5b8155506000600060246301b7af18614180526119e0516141a05261419c6000305af1612c3257600080fd5b600060006000600061416051336000f1612c4b57600080fd5b005b6334ef39f16000511415612c87573415612c6657600080fd5b60006000600060006017546016546000f1612c8057600080fd5b6000601755005b63253c8bd46000511415612cce5760206004610140373415612ca857600080fd5b6004356020518110612cb957600080fd5b50336016541415612ccc57610140516016555b005b63e395dc656000511415612d315760206004610140373415612cef57600080fd5b60605160043580604051901358578091901215612d0b57600080fd5b50600161014051600060c052602060c0200160c052602060c020015460005260206000f3005b6312b2a50a6000511415612d945760206004610140373415612d5257600080fd5b60605160043580604051901358578091901215612d6e57600080fd5b50600361014051600060c052602060c0200160c052602060c020015460005260206000f3005b63fc2d45406000511415612df75760206004610140373415612db557600080fd5b60605160043580604051901358578091901215612dd157600080fd5b50600261014051600060c052602060c0200160c052602060c020015460005260206000f3005b635302508f6000511415612e575760206004610140373415612e1857600080fd5b60605160043580604051901358578091901215612e3457600080fd5b5061014051600060c052602060c0200160c052602060c0205460005260206000f3005b637601d5636000511415612eba5760206004610140373415612e7857600080fd5b60605160043580604051901358578091901215612e9457600080fd5b50600461014051600060c052602060c0200160c052602060c020015460005260206000f3005b639abcf69c6000511415612f125760206004610140373415612edb57600080fd5b60605160043580604051901358578091901215612ef757600080fd5b5061014051600160c052602060c020015460005260206000f3005b63363258856000511415612f38573415612f2b57600080fd5b60025460005260206000f3005b63e46cec606000511415612f855760206004610140373415612f5957600080fd5b6004356020518110612f6a57600080fd5b5061014051600360c052602060c020015460005260206000f3005b63a0b286d66000511415612fab573415612f9e57600080fd5b60045460005260206000f3005b632c7e5aa26000511415612fd1573415612fc457600080fd5b60055460005260206000f3005b63a5fd35156000511415612ff7573415612fea57600080fd5b60065460005260206000f3005b62bc82df600051141561304e576020600461014037341561301757600080fd5b6060516004358060405190135857809190121561303357600080fd5b5061014051600960c052602060c020015460005260206000f3005b635320e5ba60005114156130a6576020600461014037341561306f57600080fd5b6060516004358060405190135857809190121561308b57600080fd5b5061014051600a60c052602060c020015460005260206000f3005b63f64927c3600051141561313057604060046101403734156130c757600080fd5b606051600435806040519013585780919012156130e357600080fd5b506060516024358060405190135857809190121561310057600080fd5b506101605161014051600b60c052602060c0200160c052602060c02060c052602060c020015460005260206000f3005b6348e821a960005114156131bd576040600461014037341561315157600080fd5b6060516004358060405190135857809190121561316d57600080fd5b506060516024358060405190135857809190121561318a57600080fd5b5061016051600361014051600b60c052602060c0200160c052602060c0200160c052602060c020015460005260206000f3005b6356b861a1600051141561325757606060046101403734156131de57600080fd5b606051600435806040519013585780919012156131fa57600080fd5b506060516044358060405190135857809190121561321757600080fd5b506101805161016051600461014051600b60c052602060c0200160c052602060c0200160c052602060c0200160c052602060c020015460005260206000f3005b63668d56fd60005114156132ba576020600461014037341561327857600080fd5b6060516004358060405190135857809190121561329457600080fd5b50600261014051600b60c052602060c0200160c052602060c020015460005260206000f3005b63625f375b600051141561331d57602060046101403734156132db57600080fd5b606051600435806040519013585780919012156132f757600080fd5b50600161014051600b60c052602060c0200160c052602060c020015460005260206000f3005b633f98cdef600051141561334357341561333657600080fd5b600c5460005260206000f3005b63a219390b600051141561339b576020600461014037341561336457600080fd5b6060516004358060405190135857809190121561338057600080fd5b5061014051600d60c052602060c020015460005260206000f3005b63ef5212dd60005114156133c15734156133b457600080fd5b600e5460005260206000f3005b636a5df9f460005114156133e75734156133da57600080fd5b600f5460005260206000f3005b6305fb1083600051141561340d57341561340057600080fd5b60105460005260206000f3005b63c3826907600051141561343357341561342657600080fd5b60115460005260206000f3005b63837a9bc7600051141561345957341561344c57600080fd5b60125460005260206000f3005b63634d0f77600051141561347f57341561347257600080fd5b60135460005260206000f3005b638370f33860005114156134a557341561349857600080fd5b60145460005260206000f3005b63ffb7619b60005114156134cb5734156134be57600080fd5b60155460005260206000f3005b63350d3fae60005114156134f15734156134e457600080fd5b601a5460005260206000f3005b63fba2b1b3600051141561351757341561350a57600080fd5b601b5460005260206000f3005b63199dfefa600051141561353d57341561353057600080fd5b601c5460005260206000f3005b5b61022961376703610229600039610229613767036000f30000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000000500000000000000000000000082a978b3f5962a5b0957d9ee9eef472ee55b42f1000000000000000000000000dffd41e18f04ad8810c83b14fd1426a82e625a7d0000000000000000000000009f56d05661285a8fcc0dbdb3c8070ad024030af3000000000000000000000000000000000000000000000000000000003b9aca0000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000005150ae84a8cdf00000` + input := common.FromHex(casperRawTx) + casperTx := types.NewContractCreation(nonce, nil, gasLimitCasper, new(big.Int).SetUint64(gasPriceFund), input) + casperTx, _ = types.SignTx(casperTx, signer, key) + txs = append(txs, casperTx) + sender, err := types.Sender(signer, casperTx) + if err != nil { + log.Error("Failed to get the sender of casper contract", "err", err) + return nil, nil, err + } + addrs = append(addrs, crypto.CreateAddress(sender, casperTx.Nonce())) + + return txs, addrs, nil +} diff --git a/contracts/casper/genesis.json b/contracts/casper/genesis.json new file mode 100644 index 00000000000..7894443e76a --- /dev/null +++ b/contracts/casper/genesis.json @@ -0,0 +1,28 @@ +{ + "config": { + "casperBlock": 0, + "eip150Block": 0 + }, + "nonce": "0x0000000000000056", + "difficulty": "0x2000", + "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "0x0000000000000000000000000000000000000000", + "timestamp": "0x00", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", + "gasLimit": "0x5f5e100", + "alloc": { + "0xf3e1139f77ad1c643b7f7f8271b08b7084e8b751": { + "balance": "5001002003004005006007008" + }, + "0x39ba083c30fce59883775fc729bbe1f9de4dee11": { + "balance": "1001002003004005006007008" + }, + "0xd7a3bd6c9ea32eff147d067f907ae6b22d436f91": { + "balance": "1001002003004005006007008" + }, + "0xea0f0d55ee82edf248ed648a9a8d213fba8b5081": { + "balance": "5125001002003004005006" + } + } +} diff --git a/core/genesis.go b/core/genesis.go index b6ead2250aa..4e251fe7f6d 100644 --- a/core/genesis.go +++ b/core/genesis.go @@ -28,8 +28,10 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/contracts" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/params" @@ -235,7 +237,7 @@ func (g *Genesis) ToBlock(db ethdb.Database) *types.Block { } } root := statedb.IntermediateRoot(false) - head := &types.Header{ + header := &types.Header{ Number: new(big.Int).SetUint64(g.Number), Nonce: types.EncodeNonce(g.Nonce), Time: new(big.Int).SetUint64(g.Timestamp), @@ -249,15 +251,36 @@ func (g *Genesis) ToBlock(db ethdb.Database) *types.Block { Root: root, } if g.GasLimit == 0 { - head.GasLimit = params.GenesisGasLimit + header.GasLimit = params.GenesisGasLimit } if g.Difficulty == nil { - head.Difficulty = params.GenesisDifficulty + header.Difficulty = params.GenesisDifficulty + } + + if g.Config != nil && g.Config.IsCasper(header.Number) { + // TODO: need to put in chain config, but how to ensure it's secure + casperPrivateKey := "a27df3e4f46e7792ea951d7abf853b5a5ac3226bacd57286b9df98324386532f" + + // Init casper transactions + txs, _, _ := contracts.CasperInitializers(0, casperPrivateKey) + // Add init balance to null sender address + nullSenderAddr := common.HexToAddress("56f8fa946c92a225444170f59fba81707c755161") + statedb.AddBalance(nullSenderAddr, new(big.Int).Exp(big.NewInt(10), big.NewInt(25), nil)) + + for _, tx := range txs { + _, used, err := ApplyTransaction(g.Config, nil, &g.Coinbase, new(GasPool).AddGas(g.GasLimit), statedb, header, tx, new(uint64), vm.Config{}) + if err != nil { + log.Info("Failed to apply transaction", "hash", tx.Hash().Hex(), "err", err) + } + + log.Info("Apply Casper tx", "hash", tx.Hash().Hex(), "used", used, "root", statedb.IntermediateRoot(false).Hex()) + } + header.Root = statedb.IntermediateRoot(false) } statedb.Commit(false) - statedb.Database().TrieDB().Commit(root, true) + statedb.Database().TrieDB().Commit(header.Root, true) - return types.NewBlock(head, nil, nil, nil) + return types.NewBlock(header, nil, nil, nil) } // Commit writes the block and state of a genesis specification to the database. diff --git a/params/config.go b/params/config.go index b00b280e158..313b65546ae 100644 --- a/params/config.go +++ b/params/config.go @@ -174,7 +174,7 @@ func (c *ChainConfig) IsHomestead(num *big.Int) bool { return isForked(c.HomesteadBlock, num) } -// IsDAO returns whether num is either equal to the DAO fork block or greater. +// IsDAOFork returns whether num is either equal to the DAO fork block or greater. func (c *ChainConfig) IsDAOFork(num *big.Int) bool { return isForked(c.DAOForkBlock, num) }