cicorias
3/15/2017 - 4:19 AM

Send raw ethereum tx

Send raw ethereum tx

Skip to content
This repository
Pull requests
Issues
Gist
 @cicorias
 Watch 81
  Unstar 610
 Fork 264 ethereum/web3.js
 Code  Issues 144  Pull requests 10  Projects 1  Wiki  Pulse  Graphs
New issue
How to create contract with sendRawTransaction #416
 Open	akktis opened this issue on Mar 23, 2016 · 2 comments
Assignees

No one assigned
Labels

None yet
Projects

None yet
Milestone

No milestone
Notifications

  Unsubscribe
You’re receiving notifications because you’re subscribed to this thread.
3 participants

@akktis @simondlr @jonathancross
@akktis
 
akktis commented on Mar 23, 2016
Hello Guys, I'm trying to create a contract with sendRawTransaction

I firstly try to use web3 + hooked-web3-provider + ethereumjs-accounts
on nodejs but i get some Error Invalid sender and some are OK but the transaction stuck in queued txpool, and sometime all it's ok, is just a bit crazy :s

so after that i decide to create the contract by my self.
so i directly inspire from : web3.js/lib/web3/contract.js to write de code behind.
but the result is that ask for much more gas

and when i compare my previous contract and the new one there are completely different
and the new one doesn't work.

so i think i'm very close to solution.

this is my code

// Dependencies
var Web3 = require('web3');
var Tx = require('ethereumjs-tx');
var ContractFactory = require('web3/lib/web3/contract');
var coder = require('web3/lib/solidity/coder');
var SolidityFunction = require('web3/lib/web3/function');
var SolidityEvent = require('web3/lib/web3/event');
var AllEvents = require('web3/lib/web3/allevents');

var Contract = function (eth, abi, address) {
    this._eth = eth;
    this.transactionHash = null;
    this.address = address;
    this.abi = abi;
};

var encodeConstructorParams = function (abi, params) {
    return abi.filter(function (json) {
        return json.type === 'constructor' && json.inputs.length === params.length;
    }).map(function (json) {
        return json.inputs.map(function (input) {
            return input.type;
        });
    }).map(function (types) {
        return coder.encodeParams(types, params);
    })[0] || '';
};

var addFunctionsToContract = function (contract) {
    contract.abi.filter(function (json) {
        return json.type === 'function';
    }).map(function (json) {
        return new SolidityFunction(contract._eth, json, contract.address);
    }).forEach(function (f) {
        f.attachToContract(contract);
    });
};

var addEventsToContract = function (contract) {
    var events = contract.abi.filter(function (json) {
        return json.type === 'event';
    });

    var All = new AllEvents(contract._eth._requestManager, events, contract.address);
    All.attachToContract(contract);

    events.map(function (json) {
        return new SolidityEvent(contract._eth._requestManager, json, contract.address);
    }).forEach(function (e) {
        e.attachToContract(contract);
    });
};

var checkForContractAddress = function(contract, callback){
    console.log('checkForContractAddress');
    var count = 0,
        callbackFired = false;

    // wait for receipt
    var filter = contract._eth.filter('latest', function(e){
        if (!e && !callbackFired) {
            count++;

            // stop watching after 50 blocks (timeout)
            if (count > 50) {

                filter.stopWatching();
                callbackFired = true;

                if (callback)
                    callback(new Error('Contract transaction couldn\'t be found after 50 blocks'));
                else
                    throw new Error('Contract transaction couldn\'t be found after 50 blocks');


            } else {

                contract._eth.getTransactionReceipt(contract.transactionHash, function(e, receipt){
                    if(receipt && !callbackFired) {

                        contract._eth.getCode(receipt.contractAddress, function(e, code){
                            /*jshint maxcomplexity: 6 */

                            if(callbackFired || !code)
                                return;

                            filter.stopWatching();
                            callbackFired = true;
                console.log('CODE', code);
                            if(code.length > 2) {

                                // console.log('Contract code deployed!');

                                contract.address = receipt.contractAddress;

                                // attach events and methods again after we have
                                addFunctionsToContract(contract);
                                addEventsToContract(contract);

                                // call callback for the second time
                                if(callback)
                                    callback(null, contract);

                            } else {
                                if(callback)
                                    callback(new Error('The contract code couldn\'t be stored, please check your gas amount.'));
                                else
                                    throw new Error('The contract code couldn\'t be stored, please check your gas amount.');
                            }
                        });
                    }
                });
            }
        }
    });
};

// Initialize connection
var web3 = new Web3();
web3.setProvider(new web3.providers.HttpProvider("http://localhost:8545"));

// Variables
var account = { address: '0x1502c42992450de0a5381692f84080000f043495',
     encrypted: true,
     locked: false,
     hash: '0e9de6cacecdc7ce22539401729d9a2bfe8a7a1410a19b9ec89195c6c1b6af74',
     private: 'a055f1bd991d2c0f5a21578ffb54b820e7b3846078da73cc3d2d0bf8e21cc9d7',
     public: '015f834aa98342b930be7d4076c23da88583d389bfe931c51f198450f73ac7286c61a3f36fd87406200d528c3502d02c9510239b3b3d7279627db63433af8b33' }

var current_poll = {
    "__v" : 0,
    "_id" : "56f071358a55eb1a326457fa",
    "address" : "0x1502c42992450de0f5381692f84080000f043195",
    "contract_address" : "0x8daff4ba058daea9e92a699ed66a7f4ad13b534c",
    "createdDate" : new Date("2016-03-21T22:35:15.675Z"),
    "isActive" : true,
    "isCreated" : true,
    "poll" : {
        "description" : "test 2eme vote",
        "limit_days" : 14,
        "limit_hours" : 1,
        "vote_limit" : 0,
        "vote_public" : true,
        "name" : "test 2eme vote",
        "region" : "56efcc28d20e4a2b207197e1",
        "options" : [ 
            "ops 1", 
            "ops 2", 
            "ops 3"
        ]
    }
}

var abi = [{
        "constant":false,
        "inputs":[],
        "name":"endPoll",
        "outputs":[{
                "name":"",
                "type":"bool"
        }],
        "type":"function"
},{
        "constant":true,
        "inputs":[],
        "name":"p",
        "outputs":[{
                "name":"owner",
                "type":"address"
        },{
                "name":"title",
                "type":"string"
        },{
                "name":"votelimit",
                "type":"uint256"
        },{
                "name":"options",
                "type":"string"
        },{
                "name":"deadline",
                "type":"uint256"
        },{
                "name":"status",
                "type":"bool"
        },{
                "name":"numVotes",
                "type":"uint256"
        }],
        "type":"function"
},{
        "constant":false,
        "inputs":[{
                "name":"choice",
                "type":"string"
        }],
        "name":"vote",
        "outputs":[{
                "name":"",
                "type":"bool"
        }],
        "type":"function"
},{
        "inputs":[{
                "name":"_options",
                "type":"string"
        },{
                "name":"_title",
                "type":"string"
        },{
                "name":"_votelimit",
                "type":"uint256"
        },{
                "name":"_deadline",
                "type":"uint256"
        }],
        "type":"constructor"
},{
        "anonymous":false,
        "inputs":[{
                "indexed":false,
                "name":"votechoice",
                "type":"string"
        }],
        "name":"NewVote",
        "type":"event"
}];


var cur_date = (new Date()).getTime();
var days = (current_poll.poll.limit_days) * 86400000;
var hours = (current_poll.poll.limit_hours) * 3600000;

var _deadline = cur_date + days + hours;
var _options = JSON.stringify(current_poll.poll.options);
var _votelimit = current_poll.poll.vote_limit;
var _title = current_poll.poll.name;

var contract = new Contract(web3.eth, abi);

var gasPrice = web3.eth.gasPrice;
var gasPriceHex = web3.toHex(gasPrice);
var nonce =  web3.eth.getTransactionCount(account.address) ;
var nonceHex = web3.toHex(nonce);


var options = {
    nonce: nonceHex,
    from: account.address,
    value: '0x00',
    data: '60606040526040516106f93803806106f9833981016040528080518201919060200180518201919060200180519060200190919080519060200190919050505b33600060005060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908302179055508360006000506003016000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100c557805160ff19168380011785556100f6565b828001600101855582156100f6579182015b828111156100f55782518260005055916020019190600101906100d7565b5b5090506101219190610103565b8082111561011d5760008181506000905550600101610103565b5090565b50508260006000506001016000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061017857805160ff19168380011785556101a9565b828001600101855582156101a9579182015b828111156101a857825182600050559160200191906001019061018a565b5b5090506101d491906101b6565b808211156101d057600081815060009055506001016101b6565b5090565b505081600060005060020160005081905550806000600050600401600050819055506001600060005060050160006101000a81548160ff0219169083021790555060006000600050600601600050819055505b505050506104c0806102396000396000f360606040526000357c0100000000000000000000000000000000000000000000000000000000900480638d99b2eb1461004f5780639ae8886a14610072578063fc36e15b146101d95761004d565b005b61005c600480505061042d565b6040518082815260200191505060405180910390f35b61007f6004805050610243565b604051808873ffffffffffffffffffffffffffffffffffffffff16815260200180602001878152602001806020018681526020018581526020018481526020018381038352898181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156101405780601f1061011557610100808354040283529160200191610140565b820191906000526020600020905b81548152906001019060200180831161012357829003601f168201915b50508381038252878181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156101c35780601f10610198576101008083540402835291602001916101c3565b820191906000526020600020905b8154815290600101906020018083116101a657829003601f168201915b5050995050505050505050505060405180910390f35b61022d6004808035906020019082018035906020019191908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509090919050506102b0565b6040518082815260200191505060405180910390f35b60006000508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806001016000509080600201600050549080600301600050908060040160005054908060050160009054906101000a900460ff16908060060160005054905087565b6000600060005060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158061032b57506001600060005060050160009054906101000a900460ff1614155b156103395760009050610428565b600160006000506006016000828282505401925050819055507f24bcf19562365f6510754002f8d7b818d275886315d29c7aa04785570b97a3638260405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600302600f01f150905090810190601f1680156103d45780820380516001836020036101000a031916815260200191505b509250505060405180910390a16000600060005060020160005054111561041f5760006000506002016000505460006000506006016000505410151561041e5761041c61042d565b505b5b60019050610428565b919050565b6000600060005060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561049557600090506104bd565b6000600060005060050160006101000a81548160ff02191690830217905550600190506104bd565b9056',
    gas: web3.toHex(1000000),
    gasPrice: gasPriceHex
}; // required!
var callback = function(err, contract) {
    console.log(arguments);
}

// parse arguments
var args = [
    _options,
    _title,
    _votelimit,
    _deadline
];

var bytes = encodeConstructorParams(abi, args);
options.data += bytes;

var tx = new Tx(options);
var privateKey = new Buffer(account.private, 'hex')
tx.sign(privateKey);

var serializedTx = tx.serialize();

web3.eth.sendRawTransaction(serializedTx.toString('hex'), function (err, hash) {
    if (err) {
        callback(err);
    } else {
        // add the transaction hash
                contract.transactionHash = hash;

                // call callback for the first time
                callback(null, contract);

                checkForContractAddress(contract, callback);
    }
});
@simondlr
 
simondlr commented on May 20, 2016
@fbmx did you eventually solve this? Seems since Homestead, we've been getting invalid sender as well.
@jonathancross
 
jonathancross commented on May 29, 2016 • edited
I am seeing this "Invalid sender" error (probably thrown here) as well when using https://www.kraken.com/ether/ (based on web3.js) and https://www.myetherwallet.com (may not even seem to use web3.js). Some transactions go through, some not.

Users on reddit mentioning the same error message:
https://www.reddit.com/r/ethereum/comments/4cmzqx/issues_with_recovering_presale/

Seems this error may be caused by some malformed "from" address?
@cicorias
  
            
 
Write  Preview

Attach files by dragging & dropping or  selecting them.
 Styling with Markdown is supported
Comment
Contact GitHub API Training Shop Blog About
© 2017 GitHub, Inc. Terms Privacy Security Status Help