部署一个私链以太坊的智能合约

部署智能合约的步骤为:

  1. 启动一个以太坊节点 (例如geth或者testrpc)。
  2. 使用solc编译智能合约。 => 获得二进制代码。
  3. 将编译好的合约部署到网络。(这一步会消耗以太币,还需要使用你的节点的默认地址或者指定地址来给合约签名。) => 获得合约的区块链地址和ABI(合约接口的JSON表示,包括变量,事件和可以调用的方法)。(译注:作者在这里把ABI与合约接口弄混了。ABI是合约接口的二进制表示。)
  4. 用web3.js提供的JavaScript API来调用合约。
智能合约.png

Brew MacOS包管理器

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

安装go的环境

brew install go

安装 geth

npm install -g solc

Solidity以太坊智能合约语言

brew  install solidity

geth console会启动节点,geth attach是通过rpc或者ipc和已经启动的节点进行交互。所以二者的使用区别还是挺大的,在geth console里面可以使用所有模块的api,但是geth attach只能使用已经打开的模块的api,如果节点没有打开rpc geth attach甚至都不能连接上节点

修改创世Genesis.json


webwxgetmsgimg.jpg

1,启动一个以太坊节点

1,geth --datadir "./" --nodiscover console
2,user1 = eth.accounts[0]

"0xa4aa2105cc3e6b6a83faaaf72782d1e9a68e90ca"

> eth.getBalance(user1)

1.156e+21

> user2 = eth.accounts[1]

"0x33481f6d7b7f4ff430397913af1eaf582f3f4391"

> eth.getBalance(user2)

4000000000000000000

2,智能合约代码:

contract Multiply7 {
   event Print(uint);
   function multiply(uint input) returns (uint) {
      Print(input * 7);
      return input * 7;
   }
}

3,获得abiDefinition和bytecode,

通过https://remix.ethereum.org编译智能合约或者solc编译

合约1.png

合约2.png

我们先把合约代码压缩为一行.新建一个ssh session, 切换到geth用户环境su - geth, 然后输入:cat contracts/Token.sol | tr '\n' 空格'空格 '.

转义成字符串
http://www.bejson.com

 abi=[{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"multiply","outputs":[{"name":"d","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]
屏幕快照 2018-03-03 下午8.10.55.png

4,看黑板:字节码前加0x

bytecode="0x6060604052341561000f57600080fd5b60b18061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b60006007820290509190505600a165627a7a72305820e8baa72a4bd1ffe2e8fa51812e8d65fc7b145baf48382c4ae5039510fd35a6ff0029"

5,通过abiDefinition和bytecode实例化创建合约

var contract = eth.contract(abi);
var initializer = {from:web3.eth.accounts[0],data:bytecode,gas:300000};
personal.unlockAccount(user1,"jianghua")
var token = contract.new(initializer)
屏幕快照 2018-03-03 下午8.12.37.png

屏幕快照 2018-03-03 下午8.13.02.png

INFO [03-03|17:25:44] Submitted contract creation fullhash=0x7e1bd79681ee748b1057f123a9951652e67232c2624631a5531edb0bb629e88b contract=0x1BeEf17Dac85D369d41A9891276D58fC8F877A24

6,需要通过挖矿这一步骤,对合约地址进行确认

miner.start(4)
 admin.sleepBlocks(2)
      miner.stop()

到此为止,合约的布署已布署到了区块链上。

7,通过合约地址,实例化自己的合约,并进行调用

mycontract = contract.at(token.address)
屏幕快照 2018-03-03 下午8.10.09.png

{
abi: [{
constant: false,
inputs: [{...}],
name: "multiply",
outputs: [{...}],
payable: false,
stateMutability: "nonpayable",
type: "function"
}],
address: "0x1beef17dac85d369d41a9891276d58fc8f877a24",
transactionHash: null,
allEvents: function(),
multiply: function()
}

8,到这里,合约的布署与调用完成

mycontract.multiply.call(2)

到了这一步,我们可以得到自己合约的返回值14

9,预估手续费

web3.eth.estimateGas({data:bytecode})

10,检查合约是否部署成功

eth.getCode("0x1beef17dac85d369d41a9891276d58fc8f877a24")

"0x606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b60006007820290509190505600a165627a7a72305820e8baa72a4bd1ffe2e8fa51812e8d65fc7b145baf48382c4ae5039510fd35a6ff0029"

11,验证区块的内容

屏幕快照 2018-03-03 下午6.34.03.png
eth.getBlock(2550)

{
difficulty: 314416,
extraData: "0xd783010802846765746886676f312e31308664617277696e",
gasLimit: 4712388,
gasUsed: 99930,
hash: "0x57ca73b779ae13c542f0421fc81a272fc6ce938aab1951b412f8813b6dc5bc8e",
logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
miner: "0xa4aa2105cc3e6b6a83faaaf72782d1e9a68e90ca",
mixHash: "0xecee4f13a617954c9bfe19e14bdf00c6b0d006d16e19e7474faa8de49eb74bf9",
nonce: "0x39f04fd757c3fab6",
number: 2550,
parentHash: "0xcdfb7e8f78f86e942acfe5a9a1f1ef3637a77cd96ebf35f28e6880e40e94fa0c",
receiptsRoot: "0xea304d377e8d7db719679ecfb3900e0b6c18469512ac3ba1c74c754e54f73d9e",
sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
size: 830,
stateRoot: "0x69c10e0e14757623f279f8df6564659f1ac4cf25ab2ec559acedb964315804f7",
timestamp: 1520069708,
totalDifficulty: 589085710,
transactions: ["0x7e1bd79681ee748b1057f123a9951652e67232c2624631a5531edb0bb629e88b"],
transactionsRoot: "0xba26a1e628172e65320c9d9474148763c03bd16513fc63b425f781537d542aa9",
uncles: []
}

12,验证交易信息

屏幕快照 2018-03-03 下午6.33.37.png
eth.getTransaction("0x7e1bd79681ee748b1057f123a9951652e67232c2624631a5531edb0bb629e88b")

{
blockHash: "0x57ca73b779ae13c542f0421fc81a272fc6ce938aab1951b412f8813b6dc5bc8e",
blockNumber: 2550,
from: "0xa4aa2105cc3e6b6a83faaaf72782d1e9a68e90ca",
gas: 300000,
gasPrice: 0,
hash: "0x7e1bd79681ee748b1057f123a9951652e67232c2624631a5531edb0bb629e88b",
input: "0x6060604052341561000f57600080fd5b60b18061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b60006007820290509190505600a165627a7a72305820e8baa72a4bd1ffe2e8fa51812e8d65fc7b145baf48382c4ae5039510fd35a6ff0029",
nonce: 4,
r: "0x4a3d67e18204891de590b634ef34cdff373a199f0640fa5d11b91b4788ad8290",
s: "0x45467daa1b578c05e5b2c64b564a41a306d7e1ecc21ce1b472290b719fecc77c",
to: null,
transactionIndex: 0,
v: "0xfe7",
value: 0
}

合约的布署与调用验证无误,大功告成!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容