Submitted by admin on 2016, December 21, 11:42 PM
Mix
IDE Mix旨在作为开发者帮你创建,排错和部署合约及去中心化应用(后端和前端的合约)
警告 – 有很多OS X上关于Mix的crash-at-boot 事件报告。这个事件是Heisenbug,我们已经跟踪了一两个月。我们现有的最佳变通方案是用排错配置,像这样:
1
cmake -DCMAKE_BUILD_TYPE=Debug ..
警告 – 正在研究一个Mix的替代物,叫做Remix。如果你在Mix经历了事件,在Remix更成熟之前,你最好寻找替代方案。
从创建一个新项目开始,它包括
合约
html 文件
JavaScript 文件
style 文件
image 文件
项目编辑器
你可以用项目来管理去中心化应用的创建和测试。项目会包括与后端和前端相关的数据以及和你的场景(区块链互动)相关的数据,用来排错和测试。相关文件 会被创建并自动保存到项目目录中。
创建一个新项目
去中心化应用的开发始于新项目的创建。在“编辑”菜单创建一个新项目。进入项目名称,比如 “等级”,选择项目文件路径。
编辑后端合约文件
一个新项目默认包含一个合约,“Contract”用于使用Solidity语言在区块链后端开发,“index.html”用于前端。查看Solidity教程或参考。 编辑空的默认合约“Contract”,比如
1 2 3 4 5 6
contract Rating { function setRating(bytes32 _key, uint256 _value) { ratings[_key] = _value; mapping (bytes32 => uint256) public ratings; } }
查看Solidity教程寻求帮助,以solidity编程语言开始。
保存变动
编辑前端html文件 选择默认index.html文件并输入以下代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
.... <script> function getRating () { var param = document . getElementById ( “ query ” ). value ; var res = contracts [ “ Rating ” ]. contract . ratings ( param ); document . getElementById ( “ queryres ” ). innerText = res ; } function setRating () { var key = document . getElementById ( "key" ). value ; var value = parseInt ( document . getElementById ( "value" ). value ); var res = contracts [ "Rating" ]. contract . setRating ( key , value ); } </script> </head> <body bgcolor= "#E6E6FA" > <h1> Ratings</h1> <div> Store: <input type= "string" id= "key" > <input type= "number" id= "value" > <button onclick= "setRating()" > Save</button> </div> <div> Query: <input type= "string" id= "query" onkeyup= 'getRating()' > <div id= "queryres" ></div> </div> </body> </html>
有可能添加很多合约文件和HTML, JavaScript, css文件
场景编辑器
场景可以用于检测合约和为合约排错。
一个场景就是一个本地区块链,区块可以在这里被挖矿而不需要工作量证明 –否则测试会很慢 ;)
一个场景包含一系列交易。通常,一个场景以去中心化应用的合约创建场景开始。 此外,进一步的交易会被添加测试并对去中心化应用排错。场景可以修正,例如,移除交易。注意如果要修正一个场景使之有效,需要进行重建。可以通过JS API用JS进行进一步测试。
万一打不开,可以点击F7或Windows > 展示右侧或主界面右上方的排错按钮来进入场景和排错器窗格。
创建和设置新场景
第一次启动Mix的时候,会创建一个空场景,比如,不包含任何交易。添加账户并命名为“MyAccount”,设置初始余额为1以太币。点击确认。将场景重命名为“Deploy”。
修正账户的初始以太币余额
实际上我们想做很多测试。编辑初始区块参数,将初始账户余额设置为1000 以太币。重建场景使它变得高效。
重建场景
每次交易被修正或账户被添加的时候,场景必须重建以修正使之高效。注意如果一个场景重建,网络前端(本地存储)可能也需要重置(Mix不会自动操作)。
创建交易
我们发送一些以太币给Bob。创建另一个名为“Bob”的账户,余额为0。在场景窗格创建一个新交易。点击“Add Tx…”,发送300以太币给Bob。添加一个区块。
改变和重新使用场景
创建一个新场景或从一个场景开始,和几个你先复制的交易
重命名场景
通过指定要被移除的交易来修正场景
重建场景
展示调用
一个合约调用就是一个功能调用。这不是交易, 因为合约调用不会改变状态。合约调用不是区块链的一部分,但是出于实用和用户体验设计的原因,在交易的同一功能层次展示调用很方便。JS图标提醒你这不是个交易而是个调用。要展示/隐藏调用,点击菜单里的场景 –> 展示调用。
状态查看器
这个面板区块在区块链面板下面,场景视图中。一旦区块链被运行,这个面板会展示区块链状态。
说到状态,我们意味着所有账户余额(包括合约和正常账户),存储(所有部署合约的全局变量)。这个面板的内容不是动态的,它取决于在区块链面板上选择的交易。这里展示的状态是执行所选择交易的状态结果。
在那种情况下,部署了2个合约,选择的(testCtr的部署)是最后一个。状态视图展示了TestCtr和BasicContract的存储。
交易浏览器
使用交易窗格
交易窗格使你能够探索交易接收,包括
要显示交易浏览器,点击每个交易右侧的倒三角图标,会扩展出交易详情:
然后你可以复制剪贴板上的交易内容,编辑当前交易(然后你要重新运行区块链), 或为交易排错。
JavaScript console
Mix将以下对象暴露在全局窗口的语境下
web3 – 以太坊JavaScript API
合约:合约对象集合。钥匙代表合约名称。值是包含以下属性的对象:
合约: 合约对象实例 (像在web3.eth.contract里一样创建)
地址: 上一个部署状态的合约地址(查看下面)
界面: 合约ABI
查看JavaScript API 参考了解更多信息。
用JS控制台添加交易和本地调用
如果合约名字是“Sample”,功能名字是“set”,有可能进行一个交易来调用 “set”,方法是写:
1
contracts["Sample"].contract.set(14)
如果调用可以进行,可以通过写以下命令完成:
1
contracts["Sample"].contract.get.call()
也有可能用web3对象的所有属性和功能: https://github.com/以太坊/wiki/wiki/JavaScript-API
交易排错器
Mix支持Solidity和组件级别合约代码排错。你可以在两个模式中切换,检索你所需要的相关信息。
在任何执行阶段,以下信息都可用:
虚拟机堆栈 – 查看黄皮书获取虚拟机操作指南描述 调用堆栈 – 合约调用到另一个合约时会生长。双击堆栈框架来查看机器在框架里的状态。 存储 – 与合约相关的存储数据 内存 – 分配到这个执行点的机器内存 调用数据– 交易或调用参数
进入排错模式
交易详情扩展后,你可以转换到排错视图,点击“交易排错”按钮。
在排错模式和单步调试交易之间切换
这里打开了Solidity排错模式。用菜单按钮(排错 –> 显示虚拟机代码)在Solidity和以太坊虚拟机排错模式之前转换
在solidity排错模式下单步调试交易
在以太坊虚拟机排错模式下单步调试交易
Dapps部署
这个功能能够让用户在主区块链将当前的项目作为去中心化应用部署。
这会部署合约和登记前端资源。
部署过程包括3步:
部署合约: 这一步会在主区块链部署合约。
打包Dapp: 这一步用于打包和上传前端资源。
注册: 要变成去中心化应用,以太坊浏览器(Mist或AlethZero)需要进入这个包裹。这一步会在资源存储的地方注册URL。
要部署去中心化应用,请遵守以下指令:
点击Deploy, Deploy to Network
这个模式对话框会显示三部分(参见以上):
“以太坊节点URL”是节点运行的位置,为了发起部署,一定会有一个节点在运行。
“选择部署场景”是强制步骤。Mix会执行选定场景里的交易(除与合约创建或合约调用不相关的所有交易)。Mix会在下面的面板上展示所有的交易和所有相关参数。
“使用的Gas”:取决于所选定的场景,Mix会展示使用的gas总量。
“部署账户”允许选择Mix会用于执行交易的账户。
“Gas价格”显示网络默认的gas价格。你也可以指定一个不同的值。
“部署成本”:取决于你想使用的以及选定场景的gas价格的值。这会显示部署所需的以太币数量。
“部署的合约”:没发生部署之前,这部分是空的。部署一完成,这部分就会被所有创建的合约地址填满。
“验证”:这会显示验证数量(在最后一个区块顶部生成的区块数量,最后一个区块包含最近的部署交易)。Mix跟踪所有的交易。如果有一个丢失(无效),它会展示在面板上。
“生成包裹”这一行为会创建一个新的文件夹并命名为“www”,这个文件夹会包含所有被映射到当前部署合约上的资源和脚本。为了发布去中心化应用,你需要把www文件夹托管在一个网络服务器(很快会被IPFS和SWARM代替)。库中默认是不存在web3.js的。如果你想要在网络浏览器使用去中心化应用,就需要把这个库加进来。
代码编辑器
这个编辑器提供代码编辑器的基本功能。
在Solidity或JavaScript模式下,可以用自动补全插件(Ctrl + Space).
增大/减小字体 (Ctrl +, Ctrl –)
在Solidity模式下,可以显示gas预估值(工具-> 显示Gas预估值)。这会把所有需要最小量gas的所有状态都加亮显示。如果需要的gas变得很重要,颜色会变红。它也会显示最大的交易执行费用(每个功能)。
以太坊 | 评论 :0
| Trackbacks :0
| 阅读 :764
Submitted by admin on 2016, December 21, 11:41 PM
去中心化应用
去中心化应用是可以使用户和供应商之间直接互动的服务(例如,连接某些市场上的买方和卖方,文件存储里的持有者和储存者)。以太坊去中心化应用典型地通过HTML/Javascript网络应用与用户互动,使用Javascript API与区块链通信。去中心化应用典型地在区块链上有自己的相关合约套件,用来编码商业逻辑,允许持久存储对共识要求严格的状态。记住由于以太坊网络上的运算天生冗余,执行的gas成本会比离链的私人执行成本更高。这就激励着去中心化应用开发者限制执行的代码数量和储存在区块链上的代码数量。
去中心化应用目录
使用以太坊的去中心化应用被编译到以下列表,在开发的不同阶段列出(概念,工作原型,实时/部署的)。如果你在开发去中心化应用, 考虑向这些列表添加入口:
Ðapps 的Ethercasts状态
Dappslist
Dappcentral – 去中心化应用的分类页面,带说明,代码验证和网络数据。
Dapps邮件列表 – 以太坊上的开发者邮件列表(停止使用)。
列表中提供的去中心化服务覆盖大范围的领域,包括金融,保险,预测市场,社交网络,运算和存储分配,赌博,市场,物联网,管理,合作,开发和游戏。
将来,去中心化应用可能会在去中心化应用浏览器里集成的dappstores中列出和分配。
去中心化应用浏览器
Mist – 由基金会开发的官方GUI去中心化应用浏览器,开发阶段。 Mist as Wallet dapp在试用中。
Syng – Jarrad Hope开发的移动以太坊浏览器(开发阶段) – 由DEVgrants支持
MetaMask – Aaron Kumavis Davis的浏览器内GUI。Github上的Epicenter Bitcoin访谈 – 由DEVgrants支持
AlethZero – C++ eth客户端GUI(停止使用)。
Supernova – (停止使用)。
开发者工具
去中心化应用开发需要理解Web3 Javascript API, the JSON RPC API和Solidity编程语言。
注意:有开发者工具帮助你开发、测试和部署去中心化应用,自动使用以下列出的资源。
Web3 JavaScript API – 想要和以太坊节点交互的时候,主要用到的JavaScript SDK。
JSON RPC API – 与节点交互的低级JSON RPC 2.0界面。这个API被Web3 JavaScript API使用。
Solidity Docs – Solidity是以太坊开发的智能合约语言,编译到以太坊虚拟机操作码。
测试网络 – 测试网络帮助开发者开发和测试以太坊代码及网络互动,不需花费主网络上自己的以太币。测试网络选项在下面列出。
去中心化应用开发资源。这会帮助你开发,排错和部署以太坊应用。
去中心化应用开发资源
示例
教程
Mix-IDE
Mix是官方以太坊IDE,它允许开发者在以太坊区块链创建和部署合约及去中心化应用。它包含一个Solidity源代码排错器。Mix
IDEs/Frameworks
下面是用于写以太坊去中心化应用的开发者框架和IDE。
Truffle – Truffle是以太坊的开发环境,测试框架和资产管道。
Dapple – Dapple是Solidity开发者工具以帮助建立和管理以太坊类似的区块链上复杂的合约体系。
Populus – Populus是用Python语言写的智能合约开发框架。
Eris-PM – Eris Package Manager部署并测试私有和公共链上的智能合约体系。
Embark – Embark是用JavaScript写的去中心化应用开发框架。
EtherScripter (已淘汰,停用)
韧性原始交易广播
以太坊控制台
以太坊节点的命令行控制台。
以太坊控制台通过IPC连接到在背景运行的以太坊节点(用eth和geth测试)并提供一个交互的javascript控制台,包括web3对象和管理员附件。
这里可以找到可用管理列表 以太坊节点控制指令
要使用这个控制台,你需要启动一个本地以太坊节点和可用的ipc沟通插口(数据目录中的geth.ipc文件)。开启一个节点后,ipc插口默认位于你的以太坊本地主目录。你也可以设置—test选项来使用特定节点测试指令。
然后你可以在控制台输入
这是—test模式节点指令的释义:
关于节点配置文件的更多信息。
底层服务
Whisper
什么是Whisper,用途是什么 – stackexchange问答
Gavin Wood: 嘘!Whisper – youtube上的DEVCON-1演讲视频
Whisper概览和dream API用途 –
ELI5
Swarm
Swarm是分布式存储平台以及内容分发服务,以太坊web 3堆栈自带的基层服务。Swarm的首要目标是提供足够去中心化和冗余的以太坊公共记录储存,尤其是储存和分配去中心化应用代码和数据,以及区块链数据。从经济观点看,它允许参与者有效集中储存和带宽资源,用以为所有参与者提供之前提到的服务。
从终端用户的观点看,Swarm和WWW并没有很大不同,除了上载并不是针对一个特定的服务商。目标是点对点存储,并提供抗DDOS、零故障、容错、抗审查的解决方案以及自我维护,这归功于一个使用点对点记账体系并允许以付款交换资源的内置激励体系。Swarm被设计为与以太坊devp2p多协议网络层次,为了域名解决方案的以太坊区块链,服务支付和内容可用性保险结合。
swarm 上的ÐΞVcon演讲
Viktor Trón, Daniel A. Nagy:Swarm – YouTube上的以太坊 ÐΞVcon-1演讲
Daniel A. Nagy:保持公共记录安全可用 – YouTube上的以太坊ÐΞVcon-0演讲
Code and status
在线和离线存储
以太坊定时器
作者: Piper Merriam
网站: alarm_main_website。
文档: alarm_documentation。
促使安排交易稍后发生的市场。提供unix中crontab或javascript 中的setTimeout类似的角色。 •以太坊提案中的去中心化cron服务 – 作者Peter Szilagyi
Ethereum Computation Market
作者: Piper Merriam
网站: computation_market_main_website。
文档: computation_market_main_website。
促使离线运算可验证执行的市场。允许每个昂贵的运算在以太坊虚拟机内使用,不必实际支付在链上执行它们的高额gas成本。
BTCRelay
BTCrelay
更多信息 (关于ETH/BTC双向peg,不需修正比特币代码)。
BTCrelay 审查
RANDAO
随机数: https://www.reddit.com/r/ethereum/comments/49yld7/eli5_how_does_a_service_like_szabodice_grab_a/
The EVM
以太坊虚拟机(EVM)是以太坊智能合约的执行环境。它不仅被沙箱化,而且实际上是完全隔离的,这意味着以太坊虚拟机内部运行的代码不可以访问网络,文件系统或其他进程。智能合约甚至对其他智能合约的访问权限都是有限的。
合约存在于区块链上,区块链是以太坊特定的二进制格式(以太坊虚拟机字节代码)。然而,合约典型地是用以太坊高级语言写成,用以太坊编译器编译成字节代码,最终用以太坊客户端上传到区块链。
参考资料:
文章中的列表对应的链接可以参考《Ethereum Homestead Documentation》第94页1.7.5 Dapps
以太坊 | 评论 :0
| Trackbacks :0
| 阅读 :885
Submitted by admin on 2016, December 21, 11:40 PM
什么是合约?
合约是代码(它的功能)和数据(它的状态)的集合,存在于以太坊区块链的特定地址。 合约账户能够在彼此之间传递信息,进行图灵完备的运算。合约依靠被称作以太坊虚拟机(EVM) 字节代码(以太坊特有的二进制格式)上的区块链运行。
合约很典型地用诸如Solidity等高级语言写成,然后编译成字节代码上传到区块链上。
另请参阅:
也存在其他语言, 尤其是Serpent和LLL,在此文本的以太坊高级语言章节会进一步阐述。去中心化应用开发资源列出了综合的开发环境,帮助你用这些语言开发的开发者工具,提供测试,和部署支持等功能。
以太坊高级语言
合约依靠被称作以太坊虚拟机(EVM) 字节代码(以太坊特有的二进制格式)上的区块链运行。然而,合约很典型地用诸如Solidity等高级语言写成,然后用以太坊虚拟机编译器编译成字节代码上传到区块链。
下面是开发者可以用来为以太坊写智能合约的高级语言。
Solidity
Solidity是和JavaScript相似的语言,你可以用它来开发合约并编译成以太坊虚拟机字节代码。
它目前是以太坊最受欢迎的语言。
Solidity文本 – Solidity是以太坊的旗舰高级语言,用于写合约。
Solidity在线实时编译器
标准合约API
有用的去中心化模式 – 用于去中心化应用开发的代码片段。
Serpent
Serpent是和Python类似的语言,可以用于开发合约编译成以太坊虚拟机字节代码。它力求简洁, 将低级语言在效率方面的优点和编程风格的操作简易相结合,同时合约编程增加了独特的领域特定功能。Serpent用LLL编译。
以太坊维基百科上的Serpent
Serpent以太坊虚拟机编译器
LLL
Lisp Like Language (LLL)是和Assembly类似的低级语言。它追求极简;本质上只是直接对以太坊虚拟机的一点包装。
Mutan (弃用)
Mutan是个静态类型,由Jeffrey Wilcke 开发设计的C类语言。它已经不再受到维护。
写合约
没有Hello World程序,语言就不完整。Solidity在以太坊环境内操作,没有明显的“输出”字符串的方式。我们能做的最接近的事就是用日志记录事件来把字符串放进区块链:
1 2 3 4
contract HelloWorld { event Print(string out); function() { Print("Hello, World!"); } }
每次执行时,这个合约都会在区块链创建一个日志入口,印着“Hello,World!”参数。
另请参阅:
Solidity docs里有更多写Solidity代码的示例和指导。
编译合约
solidity合约的编译可以通过很多机制完成。
通过命令行使用solc编译器。
在geth或eth提供的javascript控制台使用web3.eth.compile.solidity (这仍然需要安装solc 编译器)。
在线Solidity实时编译器。
建立solidity合约的Meteor dapp Cosmo。
Mix IDE。
以太坊钱包。
注意:关于solc和编译Solidity合约代码的更多信息可在此查看。
在geth设置solidity编译器
如果你启动了geth节点,就可以查看哪个编译器可用。
1 2
> web3.eth.getCompilers(); ["lll", "solidity", "serpent"]
这一指令会返回到显示当前哪个编译器可用的字符串。
注意:solc编译器和cpp- ethereum一起安装。或者,你可以自己创建。
如果你的solc可执行文件不在标准位置,可以用—solc标志为solc可执行文件指定一个定制路线。
1
$ geth --solc /usr/local/bin/solc
或者你可以通过控制台在执行期间设置这个选项:
1 2 3 4
> admin.setSolc("/usr/local/bin/solc") solc, the solidity compiler commandline interface Version: 0.2.2-02bb315d/.-Darwin/appleclang/JIT linked to libethereum-1.2.0-8007cef0/.-Darwin/appleclang/JIT path: /usr/local/bin/solc
编译一个简单合约
让我们编译一个简单的合约源:
1
> source = "contract test { function multiply(uint a) returns(uint d) { return a * 7; } }"
这个合约提供了一个单一方法multiply,它和一个正整数a调用并返回到a * 7 。
你准备在geth JS控制台用eth.compile.solidity()编译solidity代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
> contract = eth.compile.solidity(source).test { code: '605280600c6000396000f3006000357c01000000000000000000000000000000000000000000000000000000 info: { language: 'Solidity', languageVersion: '0', compilerVersion: '0.9.13', abiDefinition: [{ constant: false, inputs: [{ name: 'a', type: 'uint256' } ], name: 'multiply', outputs: [{ name: 'd', type: 'uint256' } ], type: 'function' } ], userDoc: { methods: { } }, developerDoc: { methods: { } }, source: 'contract test { function multiply(uint a) returns(uint d) { return a * 7; } }' } }
注意:编译器通过RPC因此也能通过web3.js,对浏览器内任何通过RPC/IPC连接到geth的Ðapp可用。
下面的例子会向你展示如何通过JSON-RPC接合geth来使用编译器。
1 2
$ geth --datadir ~/eth/ --loglevel 6 --logtostderr=true --rpc --rpcport 8100 --rpccorsdomain ' * ' --mine console 2>> ~/eth/eth.log $ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_compileSolidity","params":["contract test {
单源编译器输出会给出你合约对象,每个都代表一个单独的合约。eth.compile.solidity 的实际返还值是合约名字到合约对象的映射。由于合约名字是test,eth.compile.solidity(source).test会给出包含下列领域的测试合约对:
Code 编译的以太坊虚拟机字节代码
Info 从编译器输出的额外元数据
Source 源代码
Language 合约语言 (Solidity,Serpent,LLL)
LanguageVersion 合约语言版本
compilerVersion 用于编译这个合约的solidity编译器版本。
abiDefinition 应用的二进制界面定义
userDoc 用户的NatSpec Doc。
developerDoc 开发者的NatSpec Doc。
编译器输出的直接结构化(到code和info)反映了两种非常不同的部署路径。编译的以太坊虚拟机代码和一个合约创建交易被发送到区块,剩下的(info)在理想状态下会存活在去中心化云上,公开验证的元数据则执行区块链上的代码。
如果你的源包含多个合约,输出会包括每个合约一个入口,对应的合约信息对象可以用作为属性名称的合约名字检索到。你可以通过检测当前的GlobalRegistrar代码来试一下:
1
contracts = eth.compile.solidity(globalRegistrarSrc)
创建和部署合约
开始这一章节之前,确保你有解锁的账户和一些资金。 你现在会在区块链上创建一个合约,方法是用上一章节的以太坊虚拟机代码作为数据给空地址发送交易。
注意:用在线Solidity实时编译器或Mix IDE程序会更容易完成。
1 2 3 4
var primaryAddress = eth.accounts[0] var abi = [{ constant: false, inputs: [{ name: 'a', type: 'uint256' } ] var MyContract = eth.contract(abi) var contract = MyContract.new(arg1, arg2, ..., {from: primaryAddress, data: evmByteCodeFromPrevio
所有的二进制数据都以十六进制的格式序列化。十六进制字符串总会有一个十六进制前缀0x。
注意:注意arg1, arg2, …是合约构造函数参数,以备它要接受参数。如果合约不需要构造函数参数,就可以忽略这些参数。
值得指出的是,这一步骤需要你支付执行。一旦交易成功进入到区块,你的账户余额(你作为发送方放在from领域)会根据以太坊虚拟机的gas规则被扣减。一段时间以后,你的交易会在一个区块中出现,确认它带来的状态是共识。你的合约现在存在于区块链上。 以不同步的方式做同样的事看起来是这样:
1 2 3
MyContract.new([arg1, arg2, ...,]{from: primaryAccount, data: evmCode}, function(err, contract) { if (!err && contract.address) console.log(contract.address); });
与合约交互
与合约交互典型的做法是用诸如eth.contract()功能的抽象层,它会返回到javascript对象,和所有可用的合约功能一起,作为可调用的javascript功能。 描述合约可用功能的标准方式是ABI定义。这个对象是一个字符串,它描述了调用签名和每个可用合约功能的返回值。
1 2
var Multiply7 = eth.contract(contract.info.abiDefinition); var myMultiply7 = Multiply7.at(address);
现在ABI中具体说明的所有功能调用都在合约实例中可用。你可以用两种方法中的一种来调用这些合约实例上的方法。
1 2 3 4
> myMultiply7.multiply.sendTransaction(3, {from: address}) "0x12345" > myMultiply7.multiply.call(3) 21
当用sendTransaction被调用的时候,功能调用通过发送交易来执行。需要花费以太币来发送,调用会永久记录在区块链上。用这种方式进行的调用返回值是交易散表。
当用call被调用的时候,功能在以太坊虚拟机被本地执行,功能返回值和功能一起返回。用这种方式进行的调用不会记录在区块链上,因此也不会改变合约内部状态。这种调用方式被称为恒定功能调用。以这种方式进行的调用不花费以太币。
如果你只对返回值感兴趣,那么你应该用call 。如果你只关心合约状态的副作用,就应该用sendTransaction。
在上面的例子中,不会产生副作用,因此sendTransaction只会烧gas,增加宇宙的熵。
合约元数据
在之前的章节,我们揭示了怎样在区块链上创建合约。现在我们来处理剩下的编译器输出,合约元数据或者说合约信息。 当与不是你创建的合约交互时,你可能会想要文档或者查看源代码。合约作者被鼓励提供这样的可见信息,他们可以在区块链上登记或者借助第三方服务,比如说EtherChain。管理员API为所有选择登记的合约提供便利的方法来获取这个捆绑。
1 2 3 4
// get the contract info for contract address to do manual verification var info = admin.getContractInfo(address) // lookup, fetch, decode var source = info.source; var abiDef = info.abiDefinition
这项工作的潜在机制是:
合约信息被可以公开访问的URI上传到可辨认的地方
任何人都可以只知道合约地址就找到是什么URI
仅通过2个步骤的区块链注册就可以实现这些要求。第一步是在被称作HashReg的合约中用内容散表注册合约代码(散表)。第二步是在UrlHint合约用内容散表注册一个url。这些注册合约是Frontier版本的一部分,已经参与到Homestead中。
要知道合约地址来查询url,获取实际合约元数据信息包,使用这一机制就足够了。
如果你是个尽职的合约创建者,请遵循以下步骤:
将合约本身部署到区块链
获取合约信息json文件
将合约信息json文件部署到你选择的任意url
注册代码散表 –>内容散表 –> url
JS API通过提供助手把这个过程变得非常容易。 调用admin.register从合约中提取信息,在指定文件中写出json序列,运算文件的内容散表,最终将这个内容散表注册到合约代码散表。一旦将那个文件部署到任意url,你就能用admin.registerUrl来注册url 和你区块链上的内容散表(注意一旦固定的内容选址模式被用作文件商店,url-hint不再必要了。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
source = "contract test { function multiply(uint a) returns(uint d) { return a * 7; } }" // compile with solc contract = eth.compile.solidity(source).test // create contract object var MyContract = eth.contract(contract.info.abiDefinition) // extracts info from contract, save the json serialisation in the given file, contenthash = admin.saveInfo(contract.info, "~/dapps/shared/contracts/test/info.json") // send off the contract to the blockchain MyContract.new({from: primaryAccount, data: contract.code}, function(error, contract){ if(!error && contract.address) { // calculates the content hash and registers it with the code hash in `HashReg` // it uses address to send the transaction. // returns the content hash that we use to register a url admin.register(primaryAccount, contract.address, contenthash) // here you deploy ~/dapps/shared/contracts/test/info.json to a url admin.registerUrl(primaryAccount, hash, url) } });
测试合约和交易
你通常需要低级的测试策略,为交易和合约排除故障。这一章节介绍了一些你可以用到的排错工作和做法。为了测试合约和交易而不产生实际的后果,你最好在私有区块链上测试。这可以通过配置一个替代网络ID (选择一个特别的数字)和/或不能用的端点来实现。推荐做法是,为了测试你用一个替代数据目录和端口 ,这样就不会意外地和实时运行的节点冲突(假定用默认运行。在虚拟机排错模式开启geth,推荐性能分析和最高的日志冗余级别 :
1
geth --datadir ~/dapps/testing/00/ --port 30310 --rpcport 8110 --networkid 4567890 --nodiscover -
提交交易之前,你需要创建私有测试链。参阅测试网络。
1 2 3 4 5 6
// create account. will prompt for password personal.newAccount(); // name your primary account, will often use it primary = eth.accounts[0]; // check your balance (denominated in ether) balance = web3.fromWei(eth.getBalance(primary), "ether");
1 2 3 4 5 6 7 8 9 10
// assume an existing unlocked primary account primary = eth.accounts[0]; // mine 10 blocks to generate ether // starting miner miner.start(4); // sleep for 10 blocks (this can take quite some time). admin.sleepBlocks(10); // then stop mining (just not to burn heat in vain) miner.stop(); balance = web3.fromWei(eth.getBalance(primary), "ether");
创建交易之后,你可以用下面的命令来强制运行:
1 2 3
miner.start(1); admin.sleepBlocks(1); miner.stop();
你可以用以下命令查看即将发生的交易:
1 2 3 4 5 6
// shows transaction pool txpool.status // number of pending txs eth.getBlockTransactionCount("pending"); // print all pending txs eth.getBlock("pending", true).transactions
如果你提交合约创建交易,可以检查想要的代码是否实际上嵌入到当前的区块链:
1 2 3 4
txhash = eth.sendTansaction({from:primary, data: code}) //... mining contractaddress = eth.getTransactionReceipt(txhash); eth.getCode(contractaddress)
下一篇文章我们将会介绍《以太坊连载(23):如何部署、调用智能合约》
以太坊 | 评论 :0
| Trackbacks :0
| 阅读 :948
Submitted by admin on 2016, December 21, 11:40 PM
外部账户 vs 合约账户
以太坊中有两种类型的账户
它们的区别在Serenity版本中可能会消失。
外部账户(EOA)
外部账户
有以太币余额,
可以发送交易(以太币交易或引发合约代码),
由私钥控制,
没有相关代码。
合约账户
合约
有以太币余额,
有相关代码,
代码执行由从其他合约接收的交易或消息(调用)触发,
执行的时候—执行任意复杂的操作(图灵完备的)—操控它自己的永久存储,例如,可以有自己的持久状态—可以调用其他合约
以太坊区块链上的所有行为都由外部账户引发的交易调动。每次合约账户接收到交易时,它的代码都按照输入参数的指示执行,作为交易的一部分发送。合约代码由参与到网络的每个节点上的以太坊虚拟机执行,作为验证新区块的一部分。
这个执行需要是完全确定性的,它唯一的语境是区块链上区块的位置和所有可见的数据。区块链上的区块代表时间单位,区块链本身是时间维度,代表在链上区块指定的离散的时间点上状态的整个历史。
所有的以太币余额和价值都以wei为单位命名:1个以太币是1e18 wei。
注意:以太坊中的“合约”不应该被看做是要“实现”或“遵守”的事物;它更像是在以太坊执行环境中生存的“自治代理”,被消息或交易“戳到”的时候,总会执行特定的代码片段,并且对自己的以太币余额和钥匙/价值商店有直接的控制,以储存永久状态。
什么是交易?
“交易”这个术语用在以太坊中来指代签署的数据包,数据包存储着要从外部账户发送到区块链上另一账户的消息。
交易包括:
消息接收人,
一个签字,用以确认发送方身份,证明通过区块链向接收者发送消息的意图,
VALUE域—从发送方向接收方转移的wei的数量,
可选数据域,包括发送到合约的消息,
一个STARTGAS值,代表交易执行允许采取的运算步骤的最大数量,
一个GASPRICE值,代表发送人愿意支付的gas费用。一个gas单位对应着一个原子指令执行,比如运算步骤。
什么是消息?
合约能够向其他合约发送“消息”。消息是虚拟的事物,永远不能序列化,只存在于以太坊执行环境中。他们可以被想象为功能调用。
消息包括:
消息发送方(内含的)
消息接收方
VALUE域—和发送到合约地址的消息一起转移的wei数量,
可选数据域,即发送到合约的实际数据
一个STARTGAS值,限制了消息可以触发的代码执行的gas最大值。
本质上来说,一个消息就像一个交易,只不过消息是由合约而不是由外在因素创造的。当正在执行代码的合约执行CALL或DELEGATECALL 操作码时,消息就产生了。和交易一样,消息可能会导致接收方账户运行代码。因此,就像和外在因素建立关系一样,合约也能以同样的方式和其他合约建立关系。
什么是gas?
以太坊虚拟机(EVM)是以太坊区块链上的可执行环境。 每个参与到网络的节点运行EVM,作为区块验证协议的一部分。他们检查列在区块上的、他们验证的交易,运行EVM内部交易触发的代码。每个网络上的完整节点进行同样的运算,储存相同的值。很明显以太坊并不是关于运算效率的优化。它类似的进程是多余的。它的目的是提供一个有效的方式,在系统状态上不需要信任的第三方、准则或暴力垄断就能达成共识。但重要的是他们不是为了优化运算而存在。事实上,合约执行在节点之间被多余地重复,自然使之更昂贵,通常会鼓励人们如果能在链外操作运算,就不在区块链里进行。
运行去中心化应用(dapp)时,它和区块链互动来阅读和修正状态,但是去中心化应用会很典型地只把业务逻辑和对共识至关重要的状态放在区块链上。
当消息或交易触发结果执行时,每个指令在每个网络节点被执行。这有一个代价:每个执行的操作都有特定的成本,以一定量的gas单元表现。
Gas是交易发送方需要为每个以太坊区块链上发生的操作所支付的执行花费。这个名字gas的灵感来自这样一个观点,这笔花费就像加密燃料,驱使智能合约产生。Gas从执行代码的矿工处购买以获得以太币。Gas和以太币被故意分开,因为gas单位与具备自然成本的运算单位一致,而以太币的价格通常会由于市场力量产生波动。二者由自由市场调和:gas价格实际上由矿工决定,矿工可以拒绝以低于最低限度的gas价格进行交易。为了获得gas,你只需要向账户中添加以太币。以太坊客户端会自动为你的以太币购买gas,数量是你指定的交易最大支出。
在合约或交易执行的每个运算步骤,以太坊协议都要收费,以防止以太坊网络上发生蓄意攻击或滥用。每个交易都必须包含一个gas限度和每gas愿意支付的花费。矿工可以选择是否将交易包括在内和收集花费。如果交易产生的、用于运算步骤的gas总量,包括原始消息和可能引发的子消息,少于或等于gas限额,那么交易就会进行。如果gas总量超过gas限额,那么所有的变化都复原,但是交易仍然有效,矿工仍然可以收集花费。未用于交易执行的、所有多余的gas都会以以太币的形式偿还给发送方。不必担心超支,因为只会对你消费的gas收费。这意味着以高于预估的gas限额发送交易也是有效和安全的。
估算交易成本
交易花费的以太币总量基于两个因素:
gasUsed 是交易消费的gas总量
gasPrice 交易中指定的一个gas单元的价格(换算成以太币)
总成本= gasUsed * gasPrice
gasUsed
以太坊虚拟机上的每个操作都会被指派消费的gas数量。gasUsed是所有执行的操作所需的gas总额。有个电子表格可以看到背后的一些统计。
对于估算gasUsed,可以用estimate Gas API但是有些警告说明。
gasPrice
用户建构并签署交易,每个用户可以说明自己想要的gasPrice,可以是零。然而Frontier发布的以太坊客户端默认gasPrice是0.05e12 wei。由于矿工会使收入最优化,如果大部分交易都以0.05e12 wei 的gasPrice提交,就很难说服矿工接受价格更低或为0的交易。
示例交易成本
我们来做一个只添加2个数字的合约。EVM OPCODE ADD消费3 gas。
大概的成本,以默认gas价格计算 (2016年1月)是:
3 * 0.05e12 = 1.5e11 wei
1以太币是1e18 wei,总成本就是0.00000015以太币。
这是个简化的计算,因为忽略了一些成本,比如将2个数字转移给合约的成本,在他们可以被添加之前。
question
gas费用
gas成本计算器
以太坊Gas价格
账户交互示例 — 投注合约
之前提到过,有两种类型的账户:
外部账户 (EOA):由私钥控制的账户,如果你有和外部账户相关的私钥,就能从账户发送以太币和消息。
合约: 有自己代码的账户,受代码控制。
以太坊默认的执行环境是没有生命的,什么都不会发生,每个账户的状态保持相同。但是,每个用户都可以通过从外部账户发送交易来触发行动,启动以太坊。如果交易的目的地是其他外部账户,交易可能会转移一些以太币,否则什么也不会做。但如果目的地是个合约, 反之合约会激活,自动运行代码。
代码有能力读/写自己的内部存储(一个将32字节钥匙映射到32字节价值的数据库),阅读存储的接收消息,给其他合约发送消息,转而触发执行。一旦执行停止,合约发送的消息所触发的所有的子执行都会停止(这些都以决定好的同步的顺序发生,比如,子调用在父调用进一步之前完全完成),执行环境立即再次停止,直到被下一个交易唤醒。
合约通常服务于四个目的:
保持数据库代表着对其他合约或外部世界有用的东西;一个例子是合约激励货币,另一个例子是合约在特定的组织里记录会员。
作为某种具有更复杂访问政策的外部账户,被称为“前向合约”,典型地只在特定条件下,把进来的消息转发给到指定目的地;例如,前向合约可能会等到指定3个私钥中的2个都确认了特定的消息之后才会进行转发(例如,多重签名)。更复杂的前向合约基于要发送的消息会有不同的条件。最简单的一个功能使用案例就是撤回限制,在一些更复杂的访问政策中难以驾驭。钱包合约就是个很好的例子。
在多个用户之间管理一个正在进行的合约或关系。例子包括金融合约,有特定中介的第三方保管合约,或一些保险。也可以是开放合约,一方对其他方的随时参与保持开放;一个例子是自动给提交数学问题有效解决方案或是证明提供了一些运算资源的人发奖金的合约。
给其他合约提供功能,本质上作为软件库。 合约通过被交替叫做“调用”或“发送消息”的活动进行互动。“消息”是包含一定量以太币,任何大小的数据字节串,发送方和接收方地址的事物。合约接收消息时,可以选择返还一些数据,消息本来的发送方可以立即使用。 这样发送消息就和调用一个功能一样。
因为合约有这样的作用,我们期望合约可以彼此互动。举个例子,设想一个情景,Alice和Bob赌100 Gav币,明年旧金山的温度不会超过35ºC。但是Alice非常有安全意识,她的第一个账户使用的前向合约,只有在3个私钥中的2个都批准的情况下才可以发送消息。Bob偏执于量子加密图形,他使用的前向合约,只传递有Lamport签名和传统ECDSA的消息(但是因为他很老派,所以更偏向于用基于SHA256的Lamport签名版本,以太坊不直接支持)。
投注合约本身需要从一些合约中取得旧金山天气的数据,当它想要实际发送Gav币给Alice或Bob时,也需要和Gav币合约交谈(或者,更准确地说,Alice或Bob的前向合约)。因次我们可以这样表示账户之间的关系:
Bob 想最终决定赌注的时候,就会发生以下的步骤:
交易被发出,触发消息从Bob的外部账户发送到他的前向合约。
Bob的前向合约给合约发送消息散表和Lamport签名,发挥Lamport签名确认库的作用。
Lamport签名确认库看到Bob想要基于SHA256的Lamport签名,于是给SHA256库多次发调用来确认签名。
Lamport签名确认库一旦回到1,表明签名已确认,他就会给代表赌注的合约发送消息。
赌注合约检查提供旧金山天气的合约,查看天气如何。
赌注合约看到对消息的回应显示天气高于35ºC,就会给Gav币合约发送消息,将Gav币从它的账户转移到Bob的前向合约。
注意Gav币在Gav币合约的数据库中作为一个整体“储存”;第6步语境中“账户”的意思只是说在Gav币合约储存中有数据入口,有钥匙可以进入赌注合约的地址和余额值。接收到消息后,Gav币合约值上减少,与Bob前向账户对应的入口值增加。 我们可以在下表看到这些步骤:
离线签署交易
[可以把这一部分加到常见问题,指向turb以太坊向导的ethkey章节]
Resilience Raw Transaction Broadcaster
以太坊 | 评论 :0
| Trackbacks :0
| 阅读 :763
Submitted by admin on 2016, December 21, 11:39 PM
CPU挖掘
你可以用电脑的中央处理器(CPU)挖以太币。自从GPU矿工的效率高出两个数量级,它就不再盈利了。然而你可以用CPU挖掘在Morden测试网或私有链上挖矿,以便创建你测试合约和交易所需要的以太币, 而无需花费实时网络上的真实以太币。
注意:测试网以太币除了用于测试目的外没有其他价值(查看测试网络)。
使用geth
用geth启动以太坊节点时,并不是默认挖掘。在CPU挖掘模式开启,你会用—mine命令行选项。-minerthreads参数可以用于设置平行于挖掘线程的数量(默认为处理器核心的总数)。
1
geth --mine --minerthreads=4
你也可以在执行期间用控制台开启或停止CPU挖掘。miner.start取一个矿工线程数量的可选参数。
1 2 3 4
> miner.start(8) true > miner.stop() true
注意挖掘真实以太币只有在你与网络同步时才有意义(由于你是在共识区块顶部挖矿)。因此以太区块链下载器/同步器会延迟挖掘直到同步完成,此后挖掘自动开始,除非你用miner.stop()取消挖矿。
为了赚取以太币,你必须有etherbase(或coinbase)地址集。这个etherbase默认为你的第一个账户。如果你没有etherbase地址,geth –mine就不会开启。
你可以在命令行重新设置etherbase:
1 2
geth --etherbase 1 --mine 2>> geth.log // 1 is index: second account by creation order OR geth --etherbase '0xa4d8e9cae4d04b093aac82e6cd355b6b963fb7ff' --mine 2>> geth.log
你也可以在控制台重新设置etherbase:
1
miner.setEtherbase(eth.accounts[2])
注意你的etherbase不必是本地账户地址,只要是现存的就可以。
有一个给你挖掘过的区块添加额外数据的选项(只有32字节)。按照惯例,它被解释为统一码字符串,你可以设置短期虚荣标签。
1 2 3 4 5 6 7 8 9 10 11 12 13
miner.setExtra("ΞTHΞSPHΞΞ") ... debug.printBlock(131805) BLOCK(be465b020fdbedc4063756f0912b5a89bbb4735bd1d1df84363e05ade0195cb1): Size: 531.00 B TD: 643485290485 { NoNonce: ee48752c3a0bfe3d85339451a5f3f411c21c8170353e450985e1faab0a9ac4cc Header: [ ... Coinbase: a4d8e9cae4d04b093aac82e6cd355b6b963fb7ff Number: 131805 Extra: ΞTHΞSPHΞΞ ... }
你可以用miner.hashrate检查散表率,结果用H/s表示(每秒散表操作)。
1 2
> miner.hashrate 712000
成功挖掘一些区块以后,你可以检查etherbase账户中的以太币余额。现在假定你的etherbase是个本地账户:
1 2
> eth.getBalance(eth.coinbase).toNumber(); '34698870000000'
为了花费你赚的gas来交易,你需要解锁账户。
1 2 3
> personal.unlockAccount(eth.coinbase) Password true
你可以在控制台上用以下代码片段,检查哪个区块被特殊的矿工(地址)挖掘过:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
function minedBlocks(lastn, addr) { addrs = []; if (!addr) { addr = eth.coinbase } limit = eth.blockNumber - lastn for (i = eth.blockNumber; i >= limit; i--) { if (eth.getBlock(i).miner == addr) { addrs.push(i) } } return addrs } // scans the last 1000 blocks and returns the blocknumbers of blocks mined by your coinbase // (more precisely blocks the mining reward for which is sent to your coinbase). minedBlocks(1000, eth.coinbase); //[352708, 352655, 352559]
请注意,发现一个区块但是不能把它变成典型链会经常发生。这意味着你在当地把挖过的区块包括在内,当前的状态会显示归于你账户的挖矿奖励,然而不久后,会发现更好的链,我们转换到不包含你区块的链,因而不会记入任何挖矿奖励。因此很有可能矿工监控coinbase余额的时候会发现,它发生了相当程度的浮动。
以太坊 | 评论 :0
| Trackbacks :0
| 阅读 :876
Submitted by admin on 2016, December 21, 11:32 AM
Application Backend
存在的目的:
后端应用程序服务支持应用程序关联到移动设备或者浏览器
关键角色:
1)通过成员服务管理末端使用者和注册者
2)启动交易请求,发送请求到末端
Owned by
Solution provider, Network Proprietor
NVP节点
存在的目的:
构建交易并且将它们发送到VP节点,peer节点保存了一份所有交易的副本以便于solution providers能够在本地查询它们
关键角色:
1.管理或者维护通过成员服务发行的用户证书
2.构建交易并且将交易转发到VP节点
3.维护一个本地账本,允许application owner查询当地的信息
Owned by:
Solution Provider, Network Auditor
VP节点
存在的目的:
创建并且确认交易事物,并且维护chaincode的状态
关键角色:
1)管理并且维护被成员服务发布的用户证书
2)创建交易
3)在区块链网络上和其他VP节点一起执行交易
4)维护本地账本副本
5)参与共识并且更新账本
Owned by:
Network proprietor, Solution provider
membership(在未来的1.0版本中将变成cop)
存在的目的:
末端用户或者组织的身份发行与管理
关键角色:
1)发行登记证书给各个末端使用者或者组织
2)发行交易证书到关联的各个末端使用者
3)发行TSL证书确保在HyperLedger Fabric之间通信
4)发行链特别的Key
Owned by: Third Party service provider
注:目前我们使用的HyperLedger fabric是0.6版本,与将要发布的1.0版本相比较,Fabric有以下变动:
1)HyperLedger Fabric v1.0 membersrvc模块将独立出来成为新的COP模块。
COP将为Hyperledger fabric提供一个类似警方的安全功能
COP的代码将比membership servicev0.6版本更短更简单
2)HyperLedger Fabric v1.0将更具有安全性和扩展性,COP的独立出来将更使基于HyperLedger Fabric改造更简单。
3)交易加密方面也将比v0.6版本加强很多,例如供应链, FOREX market, 健康医疗方面交易更加安全
区块链 | 评论 :0
| Trackbacks :0
| 阅读 :824
Submitted by admin on 2016, December 21, 11:32 AM
一、配置Swagger-UI
1.你可以使用本地的node.js服务来运行rest-api,确保你本机已经安转node.js,如果没有安装,请安转一个
2.命令行下安转node.js
------npm install http-server -g
3.在你本机上启动http-server运行rest-api
------cd /opt/gopath/src/github.com/hyperledger/fabric/core/rest
-------http-server -a 0.0.0.0 -p 5554 --cors
4.浏览器中输入下面语句,确保能成功连接
------http://localhost:5554/rest_api.json
5.使用命令行下载 Swagger-UI包
------git clone https://github.com/swagger-api/swagger-ui.git
6.到 /swagger-ui/dist 下用浏览器打开index.html
7.启动没有连接到leader or validator的peer节点
----cd /opt/gopath/src/github.com/hyperledger/fabric
-----build/bin/peer node start
8.测试
----cd /opt/gopath/src/github.com/hyperledger/fabric/core/rest
----go test -v -run TestServerOpenchain_API_GetBlockCount
二、Node.Js应用程序
构建并且安装 fabric core.
cd /opt/gopath/src/github.com/hyperledger/fabric
make peer
在本地仅仅运行一个节点 (不是一个完整的网络) :
build/bin/peer node start
配置一个测试区块链数据结构通过vagrant来运行测试接下来重启peer进程.
cd /opt/gopath/src/github.com/hyperledger/fabric/core/rest
go test -v -run TestServerOpenchain_API_GetBlockCount
在本地电脑上启动http-server来运行rest_api.json服务.
npm install http-server -g
cd /opt/gopath/src/github.com/hyperledger/fabric/core/rest
http-server -a 0.0.0.0 -p 5554 --cors
下载和解压 Sample_1.zip
unzip Sample_1.zip -d Sample_1
cd Sample_1
如果没有默认的URL地址就在openchain.js文件中更新api_url变量以搭配合适的URL
Update the api_url variable within openchain.js to the appropriate URL if it is not already the default
var api_url = 'http://localhost:5554/rest_api.json';
运行Node.js app
node ./openchain.js
区块链 | 评论 :0
| Trackbacks :0
| 阅读 :869
Submitted by admin on 2016, December 21, 11:31 AM
一、安装docker
1、docker要求Linux内核版本不低于 3.10
>>检查Linux的内核版本,如果内核版本太低,升级内核
>>查看内核的版本命令uname -a
2、根据不同的Ubuntu版本安装docker
>>查看Ubuntu版本命令lsb_release -a
3、对于16.04的Ubuntu版本安装
>>sudo apt-get install docker-engine
4、启动
>>sudo systemctl enable docker
>>sudo systemctl start docker
二、从docker上拉取镜像
1、检验docker是否安装好
>>docker
2、从docker上拉镜像
>>docker pull hyperledger/fabric-peer:latest
>>docker pull hyperledger/fabric-membersrvc:latest
3、校验镜像是否拉取完成
>>docker images
三、安装docker-compose项目
1、安装pip工具
>>pip工具会依赖Python,而Ubuntu下默认已经安转好Python2.7
>>apt-get install python_pip
2、安转docker compose项目
>>sudo pip install -U docker-compose
3、校验docker compose是否安装好
>> docker-compose -h
四、安装并配置nsenter工具
方法一、
>>wget https://www.kernel.org/pub/linux/utils/util-linux/v2.29/util-linux-2.29.tar.xz; tar xJvf util-linux-2.29.tar.xz
>>cd util-linux-2.29
>> ./configure --without-ncurses && make nsenter
>>sudo cp nsenter /usr/local/bin
方法二、建议下载 .bashrc_docker,并将内容放到 .bashrc 中
>>wget -P ~ https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker;
>>echo "[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker" >> ~/.bashrc; source ~/.bashrc
五、启动节点
1、在root的Home目录下创建Docker -compose.yml并写入一下内容
membersrvc: image: hyperledger/fabric-membersrvc ports: - "7054:7054" command: membersrvc vp0: image: hyperledger/fabric-peer ports: - "7050:7050" - "7051:7051" - "7053:7053" environment: - CORE_PEER_ADDRESSAUTODETECT =true - CORE_VM_ENDPOINT =unix: ///var /run/docker .sock - CORE_LOGGING_LEVEL =DEBUG - CORE_PEER_ID =vp0 - CORE_PEER_PKI_ECA_PADDR =membersrvc: 7054 - CORE_PEER_PKI_TCA_PADDR =membersrvc: 7054 - CORE_PEER_PKI_TLSCA_PADDR =membersrvc: 7054 - CORE_SECURITY_ENABLED =true - CORE_SECURITY_ENROLLID =test_vp0 - CORE_SECURITY_ENROLLSECRET =MwYpmSRjupbT links: - membersrvc command: sh -c "sleep 5; peer node start --peer-chaincodedev"
2、通过docker-compose up运行已近配置好的节点
六、进入容器
1、docker -ps 找到要进入的容器的CONTAINER ID
2、用docker-pid指令获取需要进入容器的PID
>>echo PID=(docker-pid b4378c920828)
3、借助PID进入容器
>>sudo nsenter --target 10981 --mount --uts --ipc --net --pid
七、测试环境是否搭建好
1、选择源码中的一个例子chaincode机型编译
>>cd$GOPATH/src/github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
>>go build
2、注册和运行chaincode
>>CORE_CHAINCODE_ID_NAME=mycc CORE_PEER_ADDRESS=0.0.0.0:7051 ./chaincode_example02
3、另起一个终端,进入容器的方式和“六”一样,以WebAppAdmin的形式登录到节点上
>>peer network login WebAppAdmin -p DJY27pEnl16d
4、执行下面的代码,在另外一个终端里面会看到执行结果
安全模式
部署交易
>>CORE_SECURITY_ENABLED=true CORE_SECURITY_PRIVACY=true peer chaincode deploy -u WebAppAdmin -n mycc -c '{"Function":"init", "Args": ["a","100", "b", "200"]}'
调用交易
>>CORE_SECURITY_ENABLED=true CORE_SECURITY_PRIVACY=true peer chaincode invoke -u WebAppAdmin -l golang -n mycc -c '{"Function": "invoke", "Args": ["a", "b", "10"]}'
查询交易
>>CORE_SECURITY_ENABLED=true CORE_SECURITY_PRIVACY=true peer chaincode query -u WebAppAdmin -l golang -n mycc -c '{"Function": "query", "Args": ["b"]}'
区块链 | 评论 :0
| Trackbacks :0
| 阅读 :803