美文网首页HiBlock区块链社区
众说区块链:智能合约在建材链上的落地实践

众说区块链:智能合约在建材链上的落地实践

作者: 宇宙永恒 | 来源:发表于2018-08-13 21:43 被阅读29次
    image

    上期《众说区块链》讨论的主题是“数字货币交易所”,围绕这个的相关主题,大家对这方面的相关话题展开了进一步的谈论。

    本期《众说区块链》讨论的主题是“智能合约在建材链上的落地实践”。吉祥老师结合自身,以建材链STO项目为主,详细介绍了项目背景、STO与建材的结合方式,开发环境准备,基于ERC20 编写智能合约,测试链的分类,及在Ropsten下搭建节点,将智能合约部署上去等干货。

    主题:智能合约在建材链上的落地实践

    时间:8月11日(周六)晚9点-11点

    主持人:佩瑶

    特约嘉宾:吉祥

    讨论实录

    @颜颜:大家好,本周六,HiBlock区块链社区特别栏目《众说区块链》准时和大家见面啦,我是主持人佩瑶,非常感谢大家对社区的支持。

    《众说区块链》由HiBlock区块链社区发起,每周六晚9点,在社群内组织一个区块链相关主题的讨论,在讨论过程中加深社区成员对区块链的理解。

    在这个数字加密货币百花齐放的时代,数字加密货币已经成为我们重要资产的组成部分。而智能合约的安全影响着数字加密货币的价值,如BEC因为智能合约出现漏洞,蒸发了60亿,如此可见智能合约安全的重要性。智能合约是运行在公链上的,那么公链出现安全问题,可能会导致智能合约无法正常运行,公链之于智能合约,就犹如Android之于App,底层的安全更重要。

    本次讲解以建材链STO项目为主,吉祥老师将详细介绍项目背景、STO与建材的结合方式,开发环境准备,基于ERC20 编写智能合约,测试链的分类,及在Ropsten下搭建节点,将智能合约部署上去。前端页面调用方式?以及开发过程中遇到的坑跟大家聊聊。

    接下来欢迎本期特约嘉宾 吉祥,带领大家一起聊聊建材链~~~

    知识干货

    @吉祥:今天跟大家聊聊 智能合约在建材链上的应用

    image image image

    STO(Stone Token)的核心目标:

    建立一个 去中心化的建材行业可靠规范可信的生态体系,连接每一个建材从业者,消费者可以追溯每一个建材的来源渠道及授权证明、时间等信息,建材从业者通过Token技术服务和管理,让建材数字资产便捷流通成为现实。

    项目背景:

    • 近年来,比特币和智能合约平台以太坊为代表的区块链技术高速发展,开创了一个革命性的新产业,发展出全新的商业和投资模式,对每个行业都呈现出不可估量的应用潜力,对于建材行业同样如此,并将深刻影响该行业的发展。

    • 基于区块链的优势 与 建材行业的痛点,两方形成互补,形成新型生态模式。

    为了有效激励生态建设者与参与者,实现生态的繁荣与增长,我们发行在建材生态圈内流通的原生通证 STO。

    产品方案:

    • 建材尤其是大宗交易,订货,交割问题。

    • 智能合约,解决卖家信用

    “假一赔十”,基于智能合约,自动进行赔付。用户无法真正信任建材供应商的广告。 基于触发的赔付条件,解决主管判断赔付标准的问题。因为区块链智能合约不能修改的特性,赔付过程将通过锁定在智能合约上的STO代币执行,从而保障了承诺的赔付必定会得到履行。

    • 建材二次使用转移问题

    ○ 共享经济:剩余建材共享,线上商城二次销售。

    • 建材溯源

    • 建材商城

    基于以太坊合约的代币

    • Tokens是具备权益凭证属性的区块链应用项目的代币,这些区块链应用项目都是在基础链上发展出来的,具有特定应用场景的DAPP或者智能合约等,Tokens是这些应用链的“代币”集合统称。我们可以理解成:凡是建立在基础链上面的应用项目,它们发行的代币(应用代币)属于Tokens,带有“权益凭证”的属性。

    • 关键字:代币、权益证明、通证

    • Token实现了资产的数字化和价值的流通

    • 区块链则为Token提供了必要的基础设施

    @吉祥:个人认为,区块链与行业的结合,与实物锚定才是王道,可溯源、区块链 积分 等,都是非常好的切入点

    二、开发环境搭建

    windows下开发环境:

    • Geth 工具 (命令行工具)

    • Node.js (javascript运行环境)

    ○ 安装后,提供 truffle、npm 运行环境

    ○ 框架-Truffle - 最为流行的智能合约开发、测试和部署框架。经常与 Ganache (也是由 Truffle 团队开发) 一起搭配使用。

    相关工具-Truffle boxes - 一些打包好的组件

    • Vscode (开发solidity的智能合约,轻量级代码编辑器)

    ○ Visual Studio Code - ,好多支持 solidity 的插件。

    ○ 语言-Solidity - 官方推荐以太坊智能合约开发语言,也是目前最为主流的智能合约语言。

    相关下载,搜索后进入官网,建议先在官网把相关文档过一遍

    https://nodejs.org/

    https://geth.ethereum.org/downloads/

    https://code.visualstudio.com/

    测试工具及环境:

    • Ganache

    • Etherum-Wallet 以太坊钱包

    • MateMask

    • Remix

    ○ 集成开发环境-Remix - 一个基于solidity语言的在线智能合约开发IDE,它提供从编译,调试到部署的全流程支持。

    • EtherScan

    ○ 浏览器-Etherscan - 最为流行的以太坊浏览器,用于查看交易信息和合约代码

    • gas 计算-EthGasStation - 估计交易费用和时间的网站

    • 常用以太坊交互代码库

    • Web3.js - 以太坊官方的 Java API

    • Eth.js - 优化过的 Web3.js

    三、基于ERC20 编写智能合约

    什么是智能合约

    • 智能合约就是区块链上一个包含合约代码和存储空间的虚拟账户。简单说,就是一个协议,会在区块链检测到某些特定数据条件下时触发。

    • 基于 消息和事件 进行触发合约执行

    合约工程创建,新建一个文件夹作为项目工作空间

    Truffle init

    在 vscode中项目的目录结构

    • Contracts solidity合约编写的目录

    • Migrations 存放部署合约脚本

    • Build 合约编译后生成的目录

    • Test 单元测试的目录

    • Truffile.js truffle 默认的配置文件

    合约执行过程

    • Truffle compile 智能合约进行编译,生成字节码,成功后会在项目目录中生成一个build的目录

    ○ 重新编译所有的代码 truffle compile --all

    • Truffile migrate 合约部署,

    ○ 重新部署合约 truffle migrate --reset

    image

    如何进行合约初始化

    这个初始化,指的是合约部署到区块链上后,代币名称、总发行量 等

    一般分两种,无参初始化和带参初始化

    例如我下面的这段,无参初始化,在构造函数中,就指明了代币所有者、发行总量等。如果想动态初始化,构造中加入参数,部署操作时,传入即可。

    image

    @吉祥:在这里,有没有疑问,这个初始化如何执行或者调用呢??

    如果熟悉C#,类中有 构造函数,在这个类初始化时,该构造函数就自动执行了。

    那在智能合约中,当合约部署到区块链上的时候,该构造的业务就执行了,不需要显示的去调用。

    image image image

    • 要在以太坊上进行操作,必需要有以太坊账户。当前有两类账户类型:

    • 外部账户,可简单认为是“人类用户”,有私钥和余额,交易发送前会用私钥先签名。例如 钱包。

    • 合约账户,合约部署之后,会随之对应有一个账户,由余额和相应的合约状态数据。它由外部消息来触发执行。触发源来自外部账户或其他合约账户。

    常见的编码套路有:

    • 对于支付,优先采用“取款”,而不是“转账”(即send或transfer),避免接收合约恶意fallback函数。

    • 对于支付,采用CDI模式,避免重入问题。即:

    ○ 检查 -> 更改本合约状态 ->支付。

    • 善用Modifier进行权限控制。

    • 使用mapping类型保存合约数据,甚至为了方便升级,单独分离出两类:

    ○ 数据合约,仅包含mapping,保留操作mapping的函数,客观上类似数据表。

    ○ 控制合约,仅包含逻辑控制,通过数据合约的接口操作数据。若逻辑有问题,只需升级本合约即可,数据仍然得以保留。

    智能合约的编写,要基于项目白皮书,按照实际的规范来。

    如果要把智能合约的安全等级 升一级,建议 基于 OpenZeppelin 进行重构,前提是业务一定要清

    OpenZeppelin ,简书和 git上可自行查阅

    openzeppelin-solidity,安全合约库

    来自 https://www.jianshu.com/p/d78353772029

    @吉祥:使用测试或者调试器与合约进行交互非常好,或者你也可以手动执行交易。 Truffle 提供了两种简单的方式与合约交互。

    • 入口:在vscode菜单中打开,点击 “集成终端”

    • Truffle console 一个可以和任何以太坊客户端交互的交互式控制台。

    • Truffle Develop 一个提供了本地私有开发链的交互式控制台。

    这里的 truffle develop ,是开发智能合约运行,最简便的方式,不需要考虑区块链环境。从本地就直接运行了一个私有链环境,这个链只能你本机能访问到,其它机子无法访问。

    image image

    @吉祥:这里使用Truffle Develop。这个是truffle内置的客户端,帮助你使用简单的命令来创建一个完整的区块链环境,没有安装要求。跟命令行版本的Ganache基本类似。唯一要注意的是在truffle develop里执行truffle命令的时候需要省略前面的“truffle”,比如“truffle compile”只需要敲“compile”就可以了。

    单元测试:

    默认生成的项目,在根目录有 test 文件夹,按照 编码格式,构建相应业务的检测。

    Truffle 提供了一个 自动化测试框架,分两种编码格式:

    在javascript中编写,测试从外部执行我们的合约

    在solidity 中编写,测试从内部执行我们的合约

    image

    测试链的选择:

    Ropsten 以太坊官方提供的测试网络,使用pow共识机制

    Kovan 使用权威证明的共识机制,简称poa

    Rinkeby 以太坊官方提供的测试网络,使用poa共识机制

    在 Ropsten测试链环境下:

    • 新建用户账户,搭建节点

    ○ Personal.newAccount()

    • 导入原有账户,搭建节点

    同步区块的方式:

    Full Node 全节点

    Lite Node 轻节点,只同步个人的账户信息,该模式不能挖矿

    Fast 同步区块头的模式,速度快一些

    查找帮助 Geth -h

    那有个疑问,什么是Geth呢?

    Geth 全称是 go-ethereum,看到这个,是不是清晰了一些,是以Go语言编写的以太坊客户端。

    image

    Geth 创建节点,同步区块,geth命令

    geth --unlock 0x3429ce9c987385aa144bef0b249dae1368cd87f9 --datadir testnet --testnet -syncmode "fast" --rpc --rpcport "8545" --rpcapi db,eth,net,web3,personal --port "30303" --rpccorsdomain "*" --ipcdisable --mine

    参数解读:

    --unlock 解锁账户

    --datadir 文件夹 将同步区块放在哪个文件夹下

    --testnet 默认在 Ropsten测试链

    --syncmode "fase" 同步区块模式,快速

    --rpc 表示开启HTTP-RPC服务

    --rpcport "8545" 指定HTTP-RPC服务监听端口号 (默认8545)

    --rpcapi 需要哪些api

    --port "30303" port端口

    --mine 默认启动挖矿

    执行上面的 geth 命令后,就开始同步区块,目的是把网络上的区块全部下载到本地,与网络同步最新状态。

    六、发布后获得 合约地址、ABI 等参数,在前端进行调用合约交互

    相关参数获取:

    • 测试链的机子ip 和 端口 (--rpcport "8545",该命令指定发布出去的端口)

    • 合约地址 在build 文件夹下面找对应的合约名称的文件

    • ABI信息 在build 文件夹下面找对应的合约名称的文件

    image

    @吉祥:我们前面说到过,测试链 执行合约,是需要消耗gas的,测试链服务端开启挖矿模式,就会慢慢获得gas,那么其它账户如何也能获得gas,进行相关业务操作?

    通过命令,从0号账户给 1号账户 ,转1个eth

    Eth.sendTransaction({from:eth.acounts[0], to:eth.accounts[1], value:web3.toWei(1,"ether") });

    toWei 代表把1个eth以太币,转换成 wei 单位,1eth=10 ** 18 wei;

    三种方式与区块链交互

    • Javascript control geth控制台

    • Json-rpc 无状态远程调用协议

    • Web3.js 以太坊提供的javascript库

    七、在以太坊Ropsten浏览器上,查询交易记录

    以太坊主网地址:

    https://etherscan.io/

    image

    @吉祥:本次主题是,智能合约在建材链上的落地实践,建材可溯源,将建材实际的流转起来,通过购买建材送STO代币,代币可进行消费,形成这样一个生态体系。本次分享,以技术为主,有问题大家及时交流,相互学习

    互动阶段

    @杨镇:业务流程能否再细说下?建材如何与token

    @杨镇:对应

    @吉祥:通过一段时间的项目实战发现,像 truffle 、geth 等 api很全,直接进官网 或者 在命令行 -h 进行帮助,都能找到想要的内容。效率相对会高一些

    @杨镇:有物联网制支持了么?

    @吉祥:与物联网没有支持

    @杨镇:那建材如何跟token相对应?业务上怎么走通?

    @吉祥:购买建材,送 STO代币, 进行一定的比例锚定, 代币可购买建材,进行流通,

    @杨镇:这个锚定能否再解释一下下?

    @Kevin:有个问题,ETH客户端中EVM的gas和字节码和stateDB这几部分关系架构是什么呢?能否详细梳理讲一下?

    @吉祥:Gas 是 执行交易消耗的比特币,由 消耗的数量 * 单价 来决定

    @吉祥:字节码 是 合约编译后,在 build文件夹中生成的二进制码等文件,文件中可获取到 合约地址和 ABI 信息

    @ATU:你们的代币有什么用呢

    @Kevin:因为现在个人负责项目工作是改写以太坊EVM那块,在开发公链这样

    @Kevin:还有个问题,ETH客户端中EVM的gas和字节码和stateDB这几部分关系架构是什么呢?能否详细梳理讲一下?

    @杨镇:@Kevin 你的这个问题要看黄皮书和客户端源码。stateDB就是levelDB,用键值对形式保存每个区块定稿后的stateRoot和整个state Trie的对应关系,每个状态变动会在当前 state Trie中根据设定的算法修改相应的键值。EVM的处理是独立的,每个原始交易会触发一个EVM执行,EVM执行中又会触发子执行,这个过程中都可能修改 stateDB,在交易结束的时候会看这些执行中是否有错误,如果有,会把整个执行的状态修改撤销,如果没有,则commit到stateDB,继续执行下一个交易。不过这个问题,和今天的分享没关系……

    @ATU:今天的主题是怎么发一个智能合约,但是我其实比较关心,您的token怎么解决建材的痛点的

    @吉祥:在我最开始发的内容中有

    @ATU:我在你的那个主题里面看到,想解决的问题挺多,一个是溯源,一个是建材行业的数字资产,但是我个人认为一个token是完全解决不了溯源问题的。

    @吉祥:产品方案:

    • 建材尤其是大宗交易,订货,交割问题。

    • 智能合约,解决卖家信用

    “假一赔十”,基于智能合约,自动进行赔付。用户无法真正信任建材供应商的广告。 基于触发的赔付条件,解决主管判断赔付标准的问题。因为区块链智能合约不能修改的特性,赔付过程将通过锁定在智能合约上的STO代币执行,从而保障了承诺的赔付必定会得到履行。

    • 建材二次使用转移问题

    ○ 共享经济:剩余建材共享,线上商城二次销售。

    • 建材溯源

    建材商城

    @ATU:第二个,我对建材行业不了解这里面也会有积分问题吗

    @吉祥:没有积分

    @姜信宝老师 BoB :溯源这个问题,已经是一个伪命题了。

    @吉祥:个人认为还得分行业去看

    @姜信宝老师 BoB :这个不用讨论哈。 区块链解决最大的是信任问题。 所以你的方案里面,信任的层面,可以看看用什么方式解决。其实不是溯源的问题。

    @吉祥:嗯,对的

    @ATU:STO(Stone Token)的核心目标:

    建立一个 去中心化的建材行业可靠规范可信的生态体系,连接每一个建材从业者,消费者可以追溯每一个建材的来源渠道及授权证明、时间等信息 因为看到了这句,随口问一下

    @吉祥:嗯,对的,让每个建材从业者 都能获益,像矿工一样

    @Kevin:@风静縠纹平  好的,目前已经把gas消耗部分从EVM中去掉了,正在看改版后栈虚拟机和字节码那块有没有问题

    @颜颜:吉祥老师今晚的分享很精彩,但时间原因,今晚就结束了哈

    多谢吉祥老师今晚精彩的分享,今天先聊到这里,大家可以继续消化一下。讨论的内容会沉淀下来发布在公众号,还有想问的可以在文末留言哦~

    下周六晚9点,《众说区块链》不见不散~

    本文内容来源于:HiBlock区块链社区微信群讨论

    【众说区块链】是HiBlock区块链社区组织的微信群讨论活动,每周六晚9点准时开始,围绕一个主题进行讨论,有兴趣的小伙伴加小助手:baobaotalk_com入群吧~

    线上课程推荐 学习还能赚钱

    线上课程1:《揭开神秘的数字货币交易-2节课建立一个数字货币交易所》

    培训讲师:墨村程序猿 虎头锤

    课程原价:199元,现价 49元

    更多福利:

    • @所有人,识别下图二维码转发课程邀请好友报名,即可获得报名费50%返利(所有人均课参与)
    image

    线上课程2:《8小时区块链智能合约开发实践》

    培训讲师:《白话区块链》作者 蒋勇

    课程原价:999元,现价 399元

    更多福利:

    • @所有人,识别下图二维码转发课程邀请好友报名,即可获得报名费50%返利

    • @学员,报名学习课程并在规定时间内完成考试即可瓜分10000元奖金

    image

    相关文章

      网友评论

        本文标题:众说区块链:智能合约在建材链上的落地实践

        本文链接:https://www.haomeiwen.com/subject/oadpbftx.html