以太坊智能合约流程
① Truffle浠ュお鍧婂悎绾﹂儴缃叉暀绋嬫湁浜烘湁涔
Truffle灏辨槸涓栫晫绾т互澶鍧婂紑鍙戞嗘灦鍐呯疆鏅鸿兘銆佸悎绾︾紪璇戙佽繛鎺ャ佸紑鍙戝苟涓斾簩杩涘埗绠$悊蹇閫熷紑鍙戣嚜鍔ㄥ寲鍚堢害娴嬭瘯鑴氭湰銆佸彲鎵╁睍鎬х殑閮ㄧ讲骞朵笖杩佺Щ妗嗘灦閫傜敤浜庨儴缃插埌浠绘剰鏁伴噺鐨勫叕缃戝拰绉佺綉鐨勭綉缁滅$悊,涓哄悎绾﹂氫俊鎻愪緵浜や簰寮忔帶鍒跺彴鍒涘缓椤圭洰灏辨槸le浠ュお鍧婂悎绾﹂儴缃层俆ruffle init鐩褰曠粨鏋刢ontracts: 瀛樻斁鍚堢害migrations锛氬瓨鏀鹃儴缃茶剼鏈瑃est锛氭祴璇曟枃浠秚ruffle-config.js: 閰嶇疆鏂囦欢锛岄厤缃涓嶅悓缃戠粶鍒涘缓鍚堢害pragma solidity ^0.4.24;contract SimpleStorage{ uint storedData; function set(uint x) public{ storedData =x; } function get() public view returns (uint){ return storedData; }}缂栬瘧鍚堢害鐢熸垚 build/contract 缂栬瘧鏂囦欢truffle compile鎵ц岀紪璇戜箣鍚,浼氱敓鎴恇uild鏂囦欢澶,閲岄潰鍖呭惈 abi銆乥ytecode銆乶etwork閮ㄧ讲鑴氭湰const SimpleStorage = artifacts.require("SimpleStorage");mole.exports = function(deployer) { deployer.deploy(SimpleStorage);};閮ㄧ讲缃戠粶//浣犳墍瑕侀儴缃茬殑缃戠粶鐨勫悕瀛 ganacheNet: { host: "127.0.0.1", // Localhost (default: none) port: 7545, // Standard Ethereum port (default: none) network_id: "*", // Any network (default: none) },缁撴灉灞曠ずtruffle migrate --network ganacheNet姝ゆ椂浜ゆ槗宸茬粡浜х敓鍒癵anache閫氳繃 remix 娴嬭瘯at address 鐢 ganache 閲岄潰鐨刢reate addressGit銆
鎴戜滑閫氳繃浠ヤ笂鍏充簬Truffle浠ュお鍧婂悎绾﹂儴缃叉暀绋嬫湁浜烘湁涔堝唴瀹逛粙缁嶅悗,鐩镐俊澶у朵細瀵筎ruffle浠ュお鍧婂悎绾﹂儴缃叉暀绋嬫湁浜烘湁涔堟湁涓瀹氱殑浜嗚В,鏇村笇鏈涘彲浠ュ逛綘鏈夋墍甯鍔┿
② solidity 智能合约(3):使用truffle编译部署及测试合约
先找源码敲一遍,跑起来,后面慢慢讲怎么用solidity编写以太坊智能合约。
这个文件编写在 contracts 目录下
这个文件在 migrations 目录下
这个文件可以创建一个 test 目录,然后放进去,我这里直接放在了根目录,不太规范。
要编译Truffle项目里的合约,请切换到项目工程所在根目录,然后在终端中键入以下内容:
首次运行时,将编译所有合约。 在后续运行中,Truffle将仅编译自上次编译以来有更改的合约。如果我们想覆盖此行为,可以使用 --all 选项运行上面的命令。
编译的目标文件 Artifacts 将放在 build/contracts/ 目录中,相对于项目根目录(如果该目录不存在,将创建该目录。)
这些 Artifacts 是Truffle内部工作的组成部分,它们在成功部署应用程序中起着重要作用。 不要去编辑这些文件,因为这些文件将被合约编译和部署覆盖。
编译成功后
迁移脚本(JavaScript文件)可帮助我们将合约部署到以太坊网络。 这些文件负责暂存我们的部署任务,并且假设我们的部署需求会随着时间的推移而发生变化。 随着项目的发展,我们将创建新的迁移脚本,以进一步推动区块链的发展。 先前运行的部署记录通过特殊的 Migrations 迁移合约记录在链上,详细信息如下。
部署命令
要运行部署,请运行以下命令:
这将部署在项目的 migrations 目录中的所有迁移文件。 最简单的迁移只是一组管理部署脚本。 如果我们的迁移先前已成功运行,则 truffle migrate 将从上次运行的迁移开始执行,仅运行新创建的迁移。 如果不存在新的迁移, truffle migrate 将不会执行任何操作。 我们可以使用 --reset 选项从头开始运行所有迁移。 对于本地测试,确保在执行 migrate 之前安装并运行了 Ganache等 测试区块链。
测试脚本中输入数值 100 ,取出的数值为 64 (这个值是16进制格式,转为十进制就是 100 ).
③ 浠ュお浠e竵鎬庝箞鏍峰彂
浠ュお浠e竵鎬庝箞鍙戣
浠ュお浠e竵鏄鍩轰簬浠ュお鍧婏紙Ethereum锛夊尯鍧楅摼鍙戣岀殑锛屼互涓嬫槸浠ュお浠e竵鐨勫彂琛岃繃绋嬶細
鍒涘缓浠e竵鍚堢害锛氫互澶鍧婂厑璁哥敤鎴峰垱寤鸿嚜瀹氫箟鐨勪唬甯侊紝杩欓渶瑕佺紪鍐欐櫤鑳藉悎绾︺傛櫤鑳藉悎绾︽槸涓娈典唬鐮侊紝鎻忚堪浜嗕唬甯佺殑鍙戣岄噺銆佸悕绉般佺﹀彿銆佽浆绉昏勫垯绛変俊鎭銆傚垱寤烘櫤鑳藉悎绾﹂渶瑕佷娇鐢⊿olidity鎴栧叾浠栫紪绋嬭瑷锛屼娇鐢≧emix绛塈DE杩涜岀紪鍐欍佹祴璇曞拰閮ㄧ讲銆
閮ㄧ讲浠e竵鍚堢害锛氬綋鏅鸿兘鍚堢害缂栧啓瀹屾垚鍚庯紝闇瑕佸皢鍏堕儴缃插埌浠ュお鍧婂尯鍧楅摼涓娿傝繖涓杩囩▼闇瑕佷娇鐢ㄤ互澶鍧婇挶鍖咃紙濡侻etamask锛夎繛鎺ヤ互澶鍧婅妭鐐癸紝娑堣椾竴瀹氱殑Gas璐圭敤銆傞儴缃叉垚鍔熷悗锛岃ヤ唬甯佸氨琚鍒涘缓骞跺瓨鍌ㄥ湪浠ュお鍧婄綉缁滀腑銆
鍙戣屼唬甯侊細浠e竵鐨勫彂琛岄噺鍙浠ュ湪鏅鸿兘鍚堢害涓杩涜屽畾涔夈備竴鑸鏉ヨ达紝鍙戣屼唬甯侀渶瑕佷竴瀹氱殑鏉′欢锛屽傚畬鎴愭煇涓浠诲姟銆佽幏寰楁煇涓濂栧姳銆佹姇璧勭瓑銆傚傛灉瑕佸悜鍏浼楀彂琛屼唬甯侊紝鍙浠ラ氳繃ICO锛圛nitialCoinOffering锛夌瓑鏂瑰紡杩涜岋紝杩欓渶瑕佺紪鍐欎唬甯佺櫧鐨涔︺佸埗瀹氫唬甯侀攢鍞璁″垝绛夈
绠$悊浠e竵锛氫唬甯佺殑绠$悊鍖呮嫭璁剧疆浠e竵鐨勭﹀彿銆佸悕绉般佹婚噺銆佸皬鏁颁綅鏁扮瓑淇℃伅锛屼互鍙婄$悊浠e竵鐨勮浆绉汇侀攢姣併佸喕缁撶瓑鍔熻兘銆傝繖浜涚$悊鍔熻兘涔熸槸鍦ㄦ櫤鑳藉悎绾︿腑杩涜屽畾涔夌殑銆
鎬讳箣锛屼互澶浠e竵鐨勫彂琛岄渶瑕佺紪鍐欐櫤鑳藉悎绾﹀苟灏嗗叾閮ㄧ讲鍒颁互澶鍧婄綉缁滀腑锛岀劧鍚庡畾涔変唬甯佺殑鍙戣岄噺鍜岀$悊鍔熻兘锛屾渶鍚庨氳繃ICO鎴栧叾浠栨柟寮忓悜鍏浼楀彂琛屼唬甯併
④ 以太坊的智能合约
智能合约是运行在计算机里面的,用于保证让参与方执行承诺的代码,般情况下,普通合约上记录了甲方与乙方各方面的关系条款,并通常是通过法律强制执行或保护的,而“智能合约”则是用密码或密钥来执行关系。以更加直接的角度来理解的话,即“智能合约”的程序内容将同-开始大家一起设定好的那样百分百执行,并且零差错。
举个例子,以太坊用户可以使用智能合约在特定日期向朋友发送10个以太币。在这种情况下,用户可以操作创建一个合约,然后将程序推人该合约中进行特殊计算,以便它能够执行所需的命令。而以太坊就是专门把精力集中在这件事上的这么一个平台。
比特币是第一个支持“智能契约”的资源币种,因为网络的价值在于把价值或数据从一个点或人转移到另一个点或人身上。节点网络只在满足某些条件时才会进行验证,但是,比特币仅限于货币用例。相反,以大坊取代了比特币那种带有不小限制性的编程语言,取而代之的是一种允许开发人员编写自己程序的语言。以太坊允许开发人员编写他们自己的“智能契约”,即“自主代理”或“自治代理”,正如ETH白皮书所称的那样。该编程语言是“图灵完备”语言,这意味着它支持一组更广泛的计算指令。智能合约能做些什么呢?
1.“多签名”账户功能,只有在一定比例的人同意时才能使用资金。这个功能经常用在与众筹或募捐类似的活动中。
2.管理用户之间所签订的协议。例如,一方从另一方购买保险服务3.为其他合同提供实用程序。
4.存储有关应用程序的信息,如“域注册信息”或“会员信息记录”。概念有时候比较晦涩,我们举一个募捐的智能合约的例子来帮助理解:假设我们想向全网用户发起募捐,那就可以先定义一个智能账户,它有三个状态:当前募捐总量,捐款目标和被捐赠人的地址,然后给它定义两个函数:接收募捐函数和捐款函数。
接收募捐函数每次收到发过来的转账请求,先核对下发送者是否有足够多的钱(EVM会提供发送请求者的地址,程序可以通过地址获取到该人当前的区块链财务状况),然后每次募捐丽数调用时,都会比较下当前募捐总量跟捐款目标的比较,如果超过目标,就把当前收到的捐款全部发送到指定的被捐款人地址,否则的话,就只更新当前募捐总量状态值。
捐款函数将所有捐款发送到保存的被捐赠人地址,并且将当前捐款总量清零。每一个想要募捐的人,用自己的ETH地址向该智能账户发起一笔转账,并且指明了要调用接受其募捐函数。于是我们就有一个募捐智能合约了,人们可以往里面捐款,达到限额后钱会自动发送到指定账户,全世界的矿工都在为这个合约进行计算和担保,不再需要人去盯着看有没有被挪用,这就是智能合约的魅力所在。
⑤ 如何购买以太坊智能合约
可以兑换智能合约所代表的代币,来对智能合约进行投资。
其实就和你买进OKB的操作差不多,只要有BTC或者USDT这些币就够了,然后币币交易区挂单买进,当然你也可以去玩合约交易。
⑥ 一学就会,手把手教你用Go语言调用智能合约
智能合约调用是实现一个 DApp 的关键,一个完整的 DApp 包括前端、后端、智能合约及区块 链系统,智能合约的调用是连接区块链与前后端的关键。
我们先来了解一下智能合约调用的基础原理。智能合约运行在以太坊节点的 EVM 中。因此要 想调用合约必须要访问某个节点。
以后端程序为例,后端服务若想连接节点有两种可能,一种是双 方在同一主机,此时后端连接节点可以采用 本地 IPC(Inter-Process Communication,进 程间通信)机制,也可以采用 RPC(Remote Procere Call,远程过程调用)机制;另 一种情况是双方不在同一台主机,此时只能采用 RPC 机制进行通信。
提到 RPC, 读者应该对 Geth 启动参数有点印象,Geth 启动时可以选择开启 RPC 服务,对应的 默认服务端口是 8545。。
接着,我们来了解一下智能合约运行的过程。
智能合约的运行过程是后端服务连接某节点,将 智能合约的调用(交易)发送给节点,节点在验证了交易的合法性后进行全网广播,被矿工打包到 区块中代表此交易得到确认,至此交易才算完成。
就像数据库一样,每个区块链平台都会提供主流 开发语言的 SDK(Software Development Kit,软件开发工具包),由于 Geth 本身就是用 Go 语言 编写的,因此若想使用 Go 语言连接节点、发交易,直接在工程内导入 go-ethereum(Geth 源码) 包就可以了,剩下的问题就是流程和 API 的事情了。
总结一下,智能合约被调用的两个关键点是节点和 SDK。
由于 IPC 要求后端与节点必须在同一主机,所以很多时候开发者都会采用 RPC 模式。除了 RPC,以太坊也为开发者提供了 json- rpc 接口,本文就不展开讨论了。
接下来介绍如何使用 Go 语言,借助 go-ethereum 源码库来实现智能合约的调用。这是有固定 步骤的,我们先来说一下总体步骤,以下面的合约为例。
步骤 01:编译合约,获取合约 ABI(Application Binary Interface,应用二进制接口)。 单击【ABI】按钮拷贝合约 ABI 信息,将其粘贴到文件 calldemo.abi 中(可使用 Go 语言IDE 创建该文件,文件名可自定义,后缀最好使用 abi)。
最好能将 calldemo.abi 单独保存在一个目录下,输入“ls”命令只能看到 calldemo.abi 文件,参 考效果如下:
步骤 02:获得合约地址。注意要将合约部署到 Geth 节点。因此 Environment 选择为 Web3 Provider。
在【Environment】选项框中选择“Web3 Provider”,然后单击【Deploy】按钮。
部署后,获得合约地址为:。
步骤 03:利用 abigen 工具(Geth 工具包内的可执行程序)编译智能合约为 Go 代码。abigen 工具的作用是将 abi 文件转换为 Go 代码,命令如下:
其中各参数的含义如下。 (1)abi:是指定传入的 abi 文件。 (2)type:是指定输出文件中的基本结构类型。 (3)pkg:指定输出文件 package 名称。 (4)out:指定输出文件名。 执行后,将在代码目录下看到 funcdemo.go 文件,读者可以打开该文件欣赏一下,注意不要修改它。
步骤 04:创建 main.go,填入如下代码。 注意代码中 HexToAddress 函数内要传入该合约部署后的地址,此地址在步骤 01 中获得。
步骤 04:设置 go mod,以便工程自动识别。
前面有所提及,若要使用 Go 语言调用智能合约,需要下载 go-ethereum 工程,可以使用下面 的指令:
该指令会自动将 go-ethereum 下载到“$GOPATH/src/github.com/ethereum/go-ethereum”,这样还算 不错。不过,Go 语言自 1.11 版本后,增加了 mole 管理工程的模式。只要设置好了 go mod,下载 依赖工程的事情就不必关心了。
接下来设置 mole 生效和 GOPROXY,命令如下:
在项目工程内,执行初始化,calldemo 可以自定义名称。
步骤 05:运行代码。执行代码,将看到下面的效果,以及最终输出的 2020。
上述输出信息中,可以看到 Go 语言会自动下载依赖文件,这就是 go mod 的神奇之处。看到 2020,相信读者也知道运行结果是正确的了。