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

时间:2024-05-31 19:22:42

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

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

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

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

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

主持人:佩瑶

特约嘉宾:吉祥

讨论实录

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

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

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

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

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

知识干货

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

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

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

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

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

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

如何进行合约初始化

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

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

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

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

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

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

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

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

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

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

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

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

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

常见的编码套路有:

• 对于支付,优先采用“取款”,而不是“转账”(即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 ,是开发智能合约运行,最简便的方式,不需要考虑区块链环境。从本地就直接运行了一个私有链环境,这个链只能你本机能访问到,其它机子无法访问。

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

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

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

单元测试:

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

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

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

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

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

测试链的选择:

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

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

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

在 Ropsten测试链环境下:

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

○ Personal.newAccount()

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

同步区块的方式:

Full Node 全节点

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

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

查找帮助 Geth -h

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

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

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

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 文件夹下面找对应的合约名称的文件

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

@吉祥:我们前面说到过,测试链 执行合约,是需要消耗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/

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

@吉祥:本次主题是,智能合约在建材链上的落地实践,建材可溯源,将建材实际的流转起来,通过购买建材送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入群吧~

以下是我们的社区介绍,欢迎各种合作、交流、学习:)

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