在搭建geth之前,我们先认识一些名词,以及了解其作用。
一.什么是终端
首先,我们先认识一下操作系统
官方说法是:管理计算机硬件与软件资源的计算机程序。
功能:操作系统需要处理如管理与配置内存,决定系统资源供需的优先次序,控制输入设备与输出设备,操作网络与管理文件系统等基本事务。
简单讲:,操作系统分为两个部分,一部分称作内核,另一部分成为用户交互界面。内核部分负责系统的全部逻辑操作,由海量命令组成,这一部分是系统运行的命脉,不与用户接触;交互界面则是开机之后所有我们所看到的东西,比如窗口,软件,应用程序等等等等。
那么若我们想对系统那要是我们想要对内核的某些操作逻辑做出一些修改,应该怎么办呢?看图可知,很明显我们就会使用终端这个工具来对我们的内核进行操作,换句话说:终端就是连接内核与交互界面的这座桥,它允许用户在交互界面上打开一个叫做「Terminal 终端」的应用程序,在其中输入命令,系统会直接给出反馈。
因为终端这座桥,实际允许用户间接控制系统内核,也就是系统的大脑,因此它理论上具备控制一切的权利。
比如windows系统的终端:
终端快捷键启动方式: win+r
注意:终端通常不支持鼠标,属于键盘操作
终端常用基础命令
- mkdir firename 创建文件
- ls 列出当前目录下所有文件
- cd firename 进入firename文件中
其他命令可以参考以下链接(以linux操作系统为例):http://t.csdnimg.cn/aGGSG
二.什么是geth
Geth 的全称叫做 Go-Ethereum ,是以太坊的客户端,我们可以使用它来管理以太坊账户,部署执行智能合约,还可以用它下载以太坊主链的交易数据。所以我们在创建以太坊节点之前,首先要进行geth的安装。
三.geth的安装
geth安装可以参考另一篇文章:http://t.csdnimg.cn/k1AfF
四.开发者环境准备
进入开发者模式
geth --dev console
在这个命令中:
–dev:启用开发者模式,开发者模式会使用 POA 共识,默认预分配一个开发者账户并且会自动开启挖矿。
console :进入控制台
五.在geth中部署合约
部署代码编辑
合约编译完成后产生会产生两个文件 ABI 和 Bytecode,我们在命令行中部署合约时需要使用到这两个文件中的内容。
ABI 文件:ABI 指应用二进制接口 Application Binary Interface(ABI) ,是从区块链外部与合约进行交互以及合约与合约间进行交互的一种标准方式。
Bytecode:是指合约的字节码,是以太坊虚拟机能识别的语言。
我们需要把编译后的代码进行一些修改,再进行部署。
在部署智能合约时,我们需要用到 Compilation Details 中的内容。在 Compilation Details 按钮下有两个选项:ABI 和 Bytecode,这是智能合约的编译结果:
我们可以点击它们前面的小按钮复制两个文件中的内容。
进行合约的部署与编译前,我们打开进入开发者模式
geth --dev console
完成之后,开始以下步骤:
步骤1:获取合约对象 new一个对象,获取使用ABI接口文件
命令 1: 下面的命令就用到了我们刚刚的编译结果 ABI 文件,web3.eth.contrat()中的内容就是合约编译结果中的 ABI 的内容。
var testContract = web3.eth.contract([
{
"constant": false,
"inputs": [
{
"name": "_msg",
"type": "string"
}
],
"name": "helloworld",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "say",
"outputs": [
{
"name": "",
"type": "string"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
}
]);
上述在命令行中执行,得到结果为undefined。
步骤2:部署合约 new一个对象,使用Bytecode文件
var simpletest = testContract.new( { from: web3.eth.accounts[0], data: '0x60606040526040805190810160405280600b81526020017f48656c6c6f20576f726c640000000000000000000000000000000000000000008152506000908051906020019061004f929190610060565b50341561005b57600080fd5b610105565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100a157805160ff19168380011785556100cf565b828001600101855582156100cf579182015b828111156100ce5782518255916020019190600101906100b3565b5b5090506100dc91906100e0565b5090565b61010291905b808211156100fe5760008160009055506001016100e6565b5090565b90565b6102e3806101146000396000f30060606040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680638a9794b914610051578063954ab4b2146100ae575b600080fd5b341561005c57600080fd5b6100ac600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190505061013c565b005b34156100b957600080fd5b6100c1610156565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101015780820151818401526020810190506100e6565b50505050905090810190601f16801561012e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b80600090805190602001906101529291906101fe565b5050565b61015e61027e565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156101f45780601f106101c9576101008083540402835291602001916101f4565b820191906000526020600020905b8154815290600101906020018083116101d757829003601f168201915b5050505050905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061023f57805160ff191683800117855561026d565b8280016001018555821561026d579182015b8281111561026c578251825591602001919060010190610251565b5b50905061027a9190610292565b5090565b602060405190810160405280600081525090565b6102b491905b808211156102b0576000816000905550600101610298565b5090565b905600a165627a7a723058206dbf494b8637e4fba3761efc0268793ebffa9d213b4a5003266811ae908342bc0029', gas: '4700000' }, function (e, contract){ console.log(e, contract); if (typeof contract.address !== 'undefined') { console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash); } })
显示 Contract mined!则智能合约部署成功,并返回了合约地址:
步骤3:调用函数
格式 合约名.函数名()