使用Nodejs部署智能合約

使用nodejs部署智能合約

實(shí)現(xiàn)智能合約的方式很多種,可以用truffle框架來實(shí)現(xiàn)祥楣,編譯,部署汉柒。
這里介紹一種簡單的使用nodejs來實(shí)現(xiàn)误褪,編譯,部署的方法碾褂。
創(chuàng)建一個(gè)nodejs項(xiàng)目兽间,實(shí)現(xiàn)一個(gè)簡單的智能合約。

mkdir sm && cd sm
npm init
mkdir contracts && cd contracts
vi BaseToken.sol

//BaseToken.sol
contract Token{
    address public owner;
    mapping (address => uint) public balances;
    event Sent(address from, address to, uint amount)
    function Token(){
        owner = msg.sender;
        balances[owner] = 100000000;
    }
    function send(address receiver, uint amount){
        if (balances[msg.sender] < amount) return;
        balances[msg.sender] -= amount;
        balances[receiver] += amount;
        Sent(msg.sender, receiver, amount);
    }
}

這個(gè)合約實(shí)現(xiàn)了一個(gè)造幣和轉(zhuǎn)幣的邏輯正塌。
我們的合約是運(yùn)行在evm上面的字節(jié)碼嘀略,solidity是靜態(tài)語言,需要通過編譯器生成evm的字節(jié)碼乓诽。


vi compile.js

// compile.js
const fs = require('fs')
const solc = require('solc')
//編譯合約
let source = fs.readFileSync("./contracts/BaseToken.sol", 'utf8')
console.log('compiling contract...');
let compiledContract = solc.compile(source);
console.log('done');

for (let contractName in compiledContract.contracts) {
    var bytecode = compiledContract.contracts[contractName].bytecode;
    var abi = JSON.parse(compiledContract.contracts[contractName].interface);
}
console.log(bytecode)

調(diào)用node compile.js,對(duì)BaseToken進(jìn)行編譯帜羊,生成字節(jié)碼。web3中提供了一個(gè)部署合約的接口鸠天,使用如下讼育,

let gasEstimate = web3.eth.estimateGas({data: '0x' + bytecode});
console.log('gasEstimate: ' + gasEstimate)


let MyContract = web3.eth.contract(abi);

console.log('deploying contract...');


let myContractReturned = MyContract.new([], {
  from: address,
  data: '0x' + bytecode,
  gas: gasEstimate+50000
}, function(err, myContract){
  if(!err){
    if(!myContract.address){
      console.log(`myContract.transactionHash = ${myContract.transactionHash}`);
    }else{
      console.log(`myContract.address = ${myContract.address}`); // the contract address
      global.contractAddress = myContract.address;
    }
}else{
    console.log(err);
}
});

利用編譯生成的abi和bytecode,創(chuàng)建一個(gè)合約對(duì)象稠集,然后進(jìn)行發(fā)布奶段,等待著異步執(zhí)行的方法輸出合約地址contractAddress,這樣就完成了部署剥纷。不過這種方式有一個(gè)問題痹籍,就是在發(fā)布合約時(shí),你的私鑰處于聯(lián)網(wǎng)狀態(tài)晦鞋,
處于安全策略词裤,我們需要盡量避免私鑰在聯(lián)網(wǎng)狀態(tài)刺洒。

以太坊上部署合約是向空地址發(fā)送一個(gè)附有字節(jié)碼的簽名交易,其中發(fā)送者就是這個(gè)合約的擁有者吼砂。因此我們只需要將合約構(gòu)建成一筆交易逆航,我們在無網(wǎng)狀態(tài)下對(duì)這筆交易進(jìn)行簽名,然后將簽名發(fā)送到以太坊網(wǎng)絡(luò)中渔肩。這樣能夠降低我們私鑰被泄漏的風(fēng)險(xiǎn)因俐。
對(duì)合約的簽名方法如下:

var Tx = require('ethereumjs-tx')
const rawTx = {
    nonce: '0x6', //這個(gè)是你的地址的交易次數(shù)+1,0開始
    gasPrice: '0x12a05f200',
    gasLimit: '0x493e0',
    data: bytecode,
    from: address,
    to: ""
};
const tx = new Tx(rawTx);
tx.sign(privateKey);
const serializedTx = tx.serialize();
console.log(serializedTx.toString('hex'))

以上對(duì)一個(gè)合約簽名周偎,這里需要注意的問題是抹剩,to的地址需要是,空地址蓉坎。
完成簽名之后澳眷,我們把這筆交易發(fā)送出去就好,最簡單的方法就是使用etherscan的發(fā)送Tx的方式蛉艾,一旦發(fā)送完成钳踊,部署完成,就可以看到合約地址勿侯。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拓瞪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子助琐,更是在濱河造成了極大的恐慌祭埂,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兵钮,死亡現(xiàn)場離奇詭異蛆橡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)掘譬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門泰演,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人屁药,你說我怎么就攤上這事粥血“爻” “怎么了酿箭?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長趾娃。 經(jīng)常有香客問我缭嫡,道長,這世上最難降的妖魔是什么抬闷? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任妇蛀,我火速辦了婚禮耕突,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘评架。我一直安慰自己眷茁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布纵诞。 她就那樣靜靜地躺著祥山,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上麻裁,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天惠啄,我揣著相機(jī)與錄音反浓,去河邊找鬼。 笑死南窗,一個(gè)胖子當(dāng)著我的面吹牛揍很,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播矾瘾,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼女轿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了壕翩?” 一聲冷哼從身側(cè)響起蛉迹,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎放妈,沒想到半個(gè)月后北救,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡芜抒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年珍策,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宅倒。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡攘宙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拐迁,到底是詐尸還是另有隱情蹭劈,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布线召,位于F島的核電站铺韧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏缓淹。R本人自食惡果不足惜哈打,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一塔逃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧料仗,春花似錦湾盗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至肺孵,卻和暖如春匀借,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背平窘。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國打工吓肋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瑰艘。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓是鬼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親紫新。 傳聞我的和親對(duì)象是個(gè)殘疾皇子均蜜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 簡介 不管你們知不知道以太坊(Ethereum blockchain)是什么,但是你們大概都聽說過以太坊芒率。最近在新...
    Lilymoana閱讀 3,892評(píng)論 1 22
  • 一囤耳、區(qū)塊鏈 1. 分布式去中心化 比特幣設(shè)計(jì)的初衷就是要避免依賴中心化的機(jī)構(gòu),沒有發(fā)行機(jī)構(gòu)偶芍,也不可能操縱發(fā)行數(shù)量充择。...
    Tenny1225閱讀 33,686評(píng)論 5 35
  • 本文翻譯自:https://github.com/ConsenSys/smart-contract-best-pr...
    tolak閱讀 4,951評(píng)論 4 21
  • 本文是對(duì)以太坊文檔 Ethereum Frontier Guide 和 Ethereum Homestead 的整...
    趁風(fēng)卷閱讀 9,519評(píng)論 0 16
  • #胡思亂想將改變我的未來# #論21世紀(jì)進(jìn)步女青年如何變得喪病# #精神境界超脫史# #大概是個(gè)神經(jīng)病吧# #小哥...
    兔角要發(fā)芽閱讀 215評(píng)論 0 0