完整版ubuntu上搭建私链,编写智能合约,实现智能合约交互
捣鼓了几天总算是把智能合约部署到自己的ubuntu上,并用node.js进行调用协议,每笔交易用自己的token,可以进行必要时间进行追溯,完整使用区块链,由于solidity更新太快,很多交易的代码都必须改一些才能进行编译,好了,不好这么多这个了。
1、首先你需要拥有一台ubuntu服务器,我这里买的是阿里云的,配置问题,我提醒下,我买的8核16G内存的,挖矿还是比较牛的。 开始: 备选方案1 - 使用混编进行编译,然后复制粘贴进行部署使用https://ethereum.github.io/browser-solidity中的混音: 从Remix页面复制Web3部署说明: var untitled_testContract = web3.eth.contract([{"constant":true,"inputs":[],"name":"value","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"inputs":[],"payable":false,"type":"constructor"}]);var untitled_test = untitled_testContract.new( { from: web3.eth.accounts[0],data: '0x60606040523415600b57fe5b5b607b6000819055505b5b608f806100246000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633fa4f24514603a575bfe5b3415604157fe5b6047605d565b6040518082815260200191505060405180910390f35b600054815600a165627a7a72305820a4fac284b98d43538f802082b0db8c67ddd6d72df4e8d9fbccb4cec0e52ea0df0029',gas: '4700000' }, function (e, contract){ console.log(e, contract); if (typeof contract.address !== 'undefined') {console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash); } })
并将其粘贴到 > personal.unlockAccount(eth.accounts[0], "{top secret password}");true> var untitled_testContract = web3.eth.contract([{"constant":true,"inputs":[],"name":"value","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"inputs":[],"payable":false,"type":"constructor"}]);"0xe22dc29e3e05d3206d9636ae7cba87a2827e7b3ef28c6e8e6d2ad49a14ba3ce9"var untitled_test = untitled_testContract.new( { from: web3.eth.accounts[0], data: '0x60606040523415600b57fe5b5b607b6000819055505b5b608f806100246000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633fa4f24514603a575bfe5b3415604157fe5b6047605d565b6040518082815260200191505060405180910390f35b600054815600a165627a7a72305820a4fac284b98d43538f802082b0db8c67ddd6d72df4e8d9fbccb4cec0e52ea0df0029',gas: '4700000' }, function (e, contract){ console.log(e, contract); if (typeof contract.address !== 'undefined') {console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash); } })
方案2 - 使用Solidity编译器(Linux和OS / X,也许Windows使用Cygwin)$ more Test.sol pragma solidity ^0.4.8;contract Test { uint256 public value; function Test() { value = 123; }}
以.json格式编译Test.sol,将数据分配给JavaScript变量并将输出发送到文件中: $ echo "var testOutput=`solc --optimize --combined-json abi,bin,interface Test.sol`" > test.js$ cat test.jsvar testOutput={"contracts":{"Test.sol:Test":{"abi":"[{\"constant\":true,\"inputs\":[],\"name\":\"value\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"type\":\"constructor\"}]","bin":"60606040523415600b57fe5b5b607b6000819055505b5b608f806100246000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633fa4f24514603a575bfe5b3415604157fe5b6047605d565b6040518082815260200191505060405180910390f35b600054815600a165627a7a72305820d0e71d151634ac6ae7626860a17881104022e5cd6d3a088eb8f941d9aa8e3bd20029"}},"version":"0.4.9+commit.364da425.Darwin.appleclang"}
在 $ geth console...> loadScript("test.js")true> testOutput{ contracts: { Test.sol:Test: { abi: "[{\"constant\":true,\"inputs\":[],\"name\":\"value\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"type\":\"constructor\"}]", bin: "60606040523415600b57fe5b5b607b6000819055505b5b608f806100246000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633fa4f24514603a575bfe5b3415604157fe5b6047605d565b6040518082815260200191505060405180910390f35b600054815600a165627a7a72305820d0e71d151634ac6ae7626860a17881104022e5cd6d3a088eb8f941d9aa8e3bd20029" }}, version: "0.4.9+commit.364da425.Darwin.appleclang"}> testOutput.contracts{ abi: "[{\"constant\":true,\"inputs\":[],\"name\":\"value\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"type\":\"constructor\"}]",...> var testContract = web3.eth.contract(JSON.parse(testOutput.contracts["Test.sol:Test"].abi));undefined> personal.unlockAccount(eth.accounts[0], "{top secret password}");true> var test = testContract.new({ from: eth.accounts[0], data: "0x" + testOutput.contracts["Test.sol:Test"].bin, gas: 4700000}, function (e, contract) {console.log(e, contract); if (typeof contract.address !== 'undefined') { console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash); } });...
充值
personal.unlockAccount(eth.accounts[0])
token.issue.sendTransaction(eth.accounts[0], 100, {from: eth.accounts[0]});
miner.start(1)
miner.stop()
发送 token
token.transfer(eth.accounts[1], 30, {from: eth.accounts[0]})
miner.start(1)
miner.stop()
查看余额
token.getBalance()
var
Web3
=
require
(
'web3'
)
var
web3Admin =
require(
'web3admin')
如果是在node.js上使用web3调用的话,请看下面方法: var web3 = new Web3() setTimeout( function(){ web3Admin. extend( web3) }, 1000) //web3Admin.extend(web3);//扩展web3模块 web3. setProvider( new web3. providers. HttpProvider( "http://localhost:8545")); //调用智能合约 var abi = [ { "constant": false, "inputs": [ { "name": "account", "type": "address" }, { "name": "amount", "type": "uint256" } ], "name": "issue", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "name": "to", "type": "address" }, { "name": "amount", "type": "uint256" } ], "name": "transfer", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [ { "name": "account", "type": "address" } ], "name": "getBalance", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "inputs": [], "payable": false, "stateMutability": "nonpayable", "type": "constructor" }, { "anonymous": false, "inputs": [ { "indexed": false, "name": "account", "type": "address" }, { "indexed": false, "name": "amount", "type": "uint256" } ], "name": "Issue", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "name": "from", "type": "address" }, { "indexed": false, "name": "to", "type": "address" }, { "indexed": false, "name": "amount", "type": "uint256" } ], "name": "Transfer", "type": "event" } ]; var aAddress = "0x317b132862f95a8eaf44fb87059e1c5bd085e0ab"; var a = web3. eth. contract( abi). at( aAddress); //解锁 web3. personal.unlockAccount( web3. eth.coinbase, "long3737257", 15000); //发送代币给自己 var myMonery = a.issue. sendTransaction( web3. eth.accounts[ 0], 10000, { from: web3. eth.accounts[ 0]}); //查询余额 var balancese = a.getBalance( web3. eth.accounts[ 0]); console. log( balancese); //调用协议转账 var sends = a.transfer( eth.accounts[ 1], 30, { from: eth.accounts[ 0]}); 完成,你可以在本地上调用远程或者是本地的智能合约。是不是和简单,但是要做的话,如果是自己做的话会遇到很多问题,如果遇到问题可以跟我联系[email protected] |