长安链搭建区块链实战

这篇具有很好参考价值的文章主要介绍了长安链搭建区块链实战。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        本教程以本人真实开发经历结合官方文档所写,如需详细教程可以参考官方文档文档导航 — chainmaker-docs v2.3.3 documentation

 一、版本检查

        首先确认服务器的环境,这里我们需要docker版本为20.10.7或以上 docker-compose 版本为1.29.2或以上

        可以通过如下链接下载

        https://docs.docker.com/engine/install/

        ​​​​​​​Overview of installing Docker Compose | Docker Docs

        下载后确认版本,使用docker -v和docker-compose -v检查版本。

长安链搭建区块链实战,区块链

图1.1 版本查看

二、部署管理台

            使用

git clone -b v3.0.0 --depth=1 chainmaker / management-backend · ChainMaker

            下载管理台代码,下载后端代码后,进入management-backend目录,执行以下命令

cd management-backend
docker-compose up

            如有端口占用可以修改docker-compose.yml文件中的端口

长安链搭建区块链实战,区块链

图2.1 docker-compose文件

三、通过管理台部署长安链

        进入管理平台,网址为(ip:刚刚docker-compose的写的端口),初始用户名为admin,密码为a123456

长安链搭建区块链实战,区块链

图3.1 长安链管理平台界面

        登录后进入链账户管理,在组织证书,节点证书,用户证书中分别申请4个证书,

        首先是组织证书:

长安链搭建区块链实战,区块链

图3.2 申请组织证书

        共计生成4个

长安链搭建区块链实战,区块链

图3.3 组织证书账户

        然后是节点证书

长安链搭建区块链实战,区块链

图3.4 申请节点证书

        共计生成4个

长安链搭建区块链实战,区块链

图3.5 节点证书账户

        最后是用户证书

长安链搭建区块链实战,区块链

图3.6 用户证书

        共计生成4个

长安链搭建区块链实战,区块链

图3.7 用户证书账户

        生成后的证书都生成了签名证书和私钥,都可进行下载

长安链搭建区块链实战,区块链

图3.8 组织签名证书

        然后进入区块链管理,在上面点击新建区块链

长安链搭建区块链实战,区块链

图3.9 区块链管理

        在新建区块链中,依次输入区块链ID,区块链名称

长安链搭建区块链实战,区块链

图3.10 链参数配置1

长安链搭建区块链实战,区块链

图3.11 链参数配置2

        ip输入自己服务器的IP地址即可,端口填写如下

长安链搭建区块链实战,区块链

图3.12 链参数配置3

        下一步之后下载链配置文件,解压进入到release文件夹,

        使用./start.sh启动区块链

长安链搭建区块链实战,区块链

图3.13 部署长安链

                并在下一步确认订阅

长安链搭建区块链实战,区块链

图3.14 订阅长安链

至此,区块链搭建完成

长安链搭建区块链实战,区块链

图3.15 区块链概览

四、合约编写

        打开长安链IDE,右键Workspace创建合约工程,合约工程名自定,以我项目实战中的CarbonCoin为例

长安链搭建区块链实战,区块链

图4.1 创建合约工程

        具体合约代码如下

package main



import (

    "chainmaker.org/chainmaker/contract-sdk-go/v2/pb/protogo"

    "chainmaker.org/chainmaker/contract-sdk-go/v2/sandbox"

    "chainmaker.org/chainmaker/contract-sdk-go/v2/sdk"

    "encoding/json"

    "strconv"

)



// CarbonCoinContract 碳币合约实现

type CarbonCoinContract struct{}



// CreditInfo 用于存储和转移的碳币和碳额度信息

type CreditInfo struct {

    CarbonCoin   int `json:"carbonCoin"`

    CarbonCredit int `json:"carbonCredit"`

}



// InitContract 初始化合约

func (c *CarbonCoinContract) InitContract() protogo.Response {

    return sdk.Success(nil)

}



// UpgradeContract 升级合约

func (c *CarbonCoinContract) UpgradeContract() protogo.Response {

    return sdk.Success(nil)

}



// InvokeContract 调用合约方法

func (c *CarbonCoinContract) InvokeContract(method string) (result protogo.Response) {



    switch method {

    case "IssueCredit":

       return c.IssueCredit()

    case "QueryCredit":

       return c.QueryCredit()

    case "TransferCredit":

       return c.TransferCredit()

    default:

       return sdk.Error("invalid method")

    }

}



// IssueCredit 分配碳币和碳额度

func (c *CarbonCoinContract) IssueCredit() protogo.Response {

    params := sdk.Instance.GetArgs()

    companyID := string(params["companyID"])

    carbonCoin, err := strconv.Atoi(string(params["carbonCoin"]))

    if err != nil {

       return sdk.Error(err.Error())

    }

    carbonCredit, err := strconv.Atoi(string(params["carbonCredit"]))

    if err != nil {

       return sdk.Error(err.Error())

    }



    creditInfo := CreditInfo{CarbonCoin: carbonCoin, CarbonCredit: carbonCredit}

    creditInfoBytes, err := json.Marshal(creditInfo)

    if err != nil {

       return sdk.Error(err.Error())

    }



    err = sdk.Instance.PutStateByte(companyID, "creditInfo", creditInfoBytes)

    if err != nil {

       return sdk.Error(err.Error())

    }



    return sdk.Success(nil)

}



// QueryCredit 查询公司的碳币和碳额度

func (c *CarbonCoinContract) QueryCredit() protogo.Response {

    params := sdk.Instance.GetArgs()

    companyID := string(params["companyID"])



    creditInfoBytes, err := sdk.Instance.GetStateByte(companyID, "creditInfo")

    if err != nil {

       return sdk.Error(err.Error())

    }

    if creditInfoBytes == nil {

       return sdk.Error("credit info not found")

    }



    return sdk.Success(creditInfoBytes)

}



// TransferCredit 两公司之间转移碳币和碳额度

func (c *CarbonCoinContract) TransferCredit() protogo.Response {

    params := sdk.Instance.GetArgs()

    companyAID := string(params["companyAID"])

    companyBID := string(params["companyBID"])

    carbonCoinToTransfer, err := strconv.Atoi(string(params["carbonCoin"]))

    if err != nil {

       return sdk.Error("invalid carbonCoin: " + err.Error())

    }

    carbonCreditToTransfer, err := strconv.Atoi(string(params["carbonCredit"]))

    if err != nil {

       return sdk.Error("invalid carbonCredit: " + err.Error())

    }



    // 查询公司A的碳币和碳额度信息

    creditInfoABytes, err := sdk.Instance.GetStateByte(companyAID, "creditInfo")

    if err != nil {

       return sdk.Error("failed to get credit info for company A: " + err.Error())

    }

    if creditInfoABytes == nil {

       return sdk.Error("credit info for company A not found")

    }

    var creditInfoA CreditInfo

    err = json.Unmarshal(creditInfoABytes, &creditInfoA)

    if err != nil {

       return sdk.Error("failed to unmarshal credit info for company A: " + err.Error())

    }



    // 查询公司B的碳币和碳额度信息

    creditInfoBBytes, err := sdk.Instance.GetStateByte(companyBID, "creditInfo")

    if err != nil {

       return sdk.Error("failed to get credit info for company B: " + err.Error())

    }

    if creditInfoBBytes == nil {

       return sdk.Error("credit info for company B not found")

    }

    var creditInfoB CreditInfo

    err = json.Unmarshal(creditInfoBBytes, &creditInfoB)

    if err != nil {

       return sdk.Error("failed to unmarshal credit info for company B: " + err.Error())

    }



    // 执行转移逻辑

    if creditInfoA.CarbonCoin < carbonCoinToTransfer || creditInfoA.CarbonCredit < carbonCreditToTransfer {

       return sdk.Error("company A does not have enough carbonCoin or carbonCredit to transfer")

    }

    creditInfoA.CarbonCoin -= carbonCoinToTransfer

    creditInfoA.CarbonCredit -= carbonCreditToTransfer

    creditInfoB.CarbonCoin += carbonCoinToTransfer

    creditInfoB.CarbonCredit += carbonCreditToTransfer



    // 更新公司A的碳币和碳额度信息

    creditInfoABytes, err = json.Marshal(creditInfoA)

    if err != nil {

       return sdk.Error("failed to marshal updated credit info for company A: " + err.Error())

    }

    err = sdk.Instance.PutStateByte(companyAID, "creditInfo", creditInfoABytes)

    if err != nil {

       return sdk.Error("failed to update credit info for company A: " + err.Error())

    }



    // 更新公司B的碳币和碳额度信息

    creditInfoBBytes, err = json.Marshal(creditInfoB)

    if err != nil {

       return sdk.Error("failed to marshal updated credit info for company B: " + err.Error())

    }

    err = sdk.Instance.PutStateByte(companyBID, "creditInfo", creditInfoBBytes)

    if err != nil {

       return sdk.Error("failed to update credit info for company B: " + err.Error())

    }



    return sdk.Success(nil)

}



func main() {

    err := sandbox.Start(new(CarbonCoinContract))

    if err != nil {

       sdk.Instance.Errorf(err.Error())

    }

}

        接着点击右边保存

长安链搭建区块链实战,区块链

图4.2 点击保存

        然后分析这里面的代码,

        看如下代码得知,我们有IssueCredit,QueryCredit,TransferCredit方法:

// InvokeContract 调用合约方法

func (c *CarbonCoinContract) InvokeContract(method string) (result protogo.Response) {



    switch method {

    case "IssueCredit":

       return c.IssueCredit()

    case "QueryCredit":

       return c.QueryCredit()

    case "TransferCredit":

       return c.TransferCredit()

    default:

       return sdk.Error("invalid method")

    }

}

以IssueCredit方法举例,这里看到具体的方法:

func (c *CarbonCoinContract) IssueCredit() protogo.Response {

    params := sdk.Instance.GetArgs()

    companyID := string(params["companyID"])

    carbonCoin, err := strconv.Atoi(string(params["carbonCoin"]))

    if err != nil {

       return sdk.Error(err.Error())

    }

    carbonCredit, err := strconv.Atoi(string(params["carbonCredit"]))

    if err != nil {

       return sdk.Error(err.Error())

    }



    creditInfo := CreditInfo{CarbonCoin: carbonCoin, CarbonCredit: carbonCredit}

    creditInfoBytes, err := json.Marshal(creditInfo)

    if err != nil {

       return sdk.Error(err.Error())

    }



    err = sdk.Instance.PutStateByte(companyID, "creditInfo", creditInfoBytes)

    if err != nil {

       return sdk.Error(err.Error())

    }



    return sdk.Success(nil)

}

        这里可以看到companyID, carbonCoin,carbonCredit,这个是我们在调试中所用到的key,value就是具体传的值

长安链搭建区块链实战,区块链

图4.3 部署长安链

        这里选择合约,然后选择合约方法,输入对应信息,然后构建合约,执行合约,在模拟区块链上进行调试。

        合约没问题之后点击第三个按钮合约编译,编译完会有一个.7z的下载包下载下来。

长安链搭建区块链实战,区块链

图4.4 合约编译

五、合约部署

        进入区块链管理平台,进来之后找到区块链管理,合约管理,这里部署合约,

长安链搭建区块链实战,区块链

图5.1 合约管理界面

        具体部署合约如下,合约名称和一开始在IDE里新建的合约名称一致,合约版本自定义,虚拟机类型DOCKER_GO,合约文件则将刚刚下载的.7z后缀文件上传。

        这里尤其注意合约调用方法,这里需要把合约里的方法都写上去,这里我以IssueCredit举例,写了这么一个方法,然后它的key是companyID,carbonCoin,carbonCredit,需把这些都要写进去,将下面的图一一对应起来。

长安链搭建区块链实战,区块链

图5.2 部署合约界面

        部署后点击确定,然后如果要升级合约,具体操作和原来大致相同,部署完成后找到上链管理,发起上链。

长安链搭建区块链实战,区块链

图5.3 上链管理界面        

        选择合约,交互类型,调用方法,对应添加每个参数,运行一下可以检查每个功能能否正确部署

长安链搭建区块链实战,区块链

图5.4 发起上链界面

        能正确上链的基本都是交易成功,如果不成功可能是value输入有误。

长安链搭建区块链实战,区块链

图5.5 上链列表

        然后点击合约可以查看具体信息

长安链搭建区块链实战,区块链

图5.6 上链信息

        至此示例合约部署完成。文章来源地址https://www.toymoban.com/news/detail-855479.html

到了这里,关于长安链搭建区块链实战的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 区块链-蚂蚁链(阿里系产品),至信链(腾讯系),长安链(国家队)

    目录 区块链-蚂蚁链(阿里系产品),至信链(腾讯系),长安链(国家队) ①蚂蚁链ÿ

    2024年02月05日
    浏览(38)
  • 腾讯云区块链服务平台(TBaaS)长安链体验网络公测试用感受

    前阵InfoQ社区看到腾讯云腾讯云区块链服务平台(TBaaS)长安链体验活动,一顿操作猛如虎报了个名,体验完用一个字概括:强。 非要再加几个字的话,总体感受下来装配模式灵活高效,配套工具完整辩解。话不多说开始主题本文目录结构分为 区块链分类 和 TBaaS平台介绍 、

    2023年04月09日
    浏览(39)
  • 区块链学习6-长安链部署:如何创建特定共识节点数和同步节点数的链

    正常prepare的时候只支持4 7 13 16个节点个数,想要创建10个节点,其中5个是共识节点,如何实现? 1. 注释掉prepare.sh的这几行: 2. 修改 crytogen的模板文件: 如果是cert模式:chainmaker-cryptogen/config/crypto_config_template.yml 如果是pk模式:chainmaker-cryptogen/config/pk_config_template.yml 例如在配

    2024年02月13日
    浏览(44)
  • 基于lighthouse+长安链的轻量级云服务器产品,实现部署合约、区块链服务一系列操作文档

    长安链已上架一款lighthouse+长安链的轻量级云服务器产品 体验入口:轻量应用服务器Lighthouse_香港轻量服务器_海外轻量服务器-腾讯云 区块链概览 获取区块链ID(DApp需要配置) 合约管理 智能合约git地址:https://git.chainmaker.org.cn/fish/fish1208-chainmaker-lighthouse/-/tree/master/contract EV

    2023年04月08日
    浏览(28)
  • 区块链学习笔记(6)-搭建fabric开发网络_搭建区块链fibric(1)

    卷映射上。在 Docker 中,当使用 - ./some/path:/another/path 这样的语法时,是在指定一个卷(volume)映射。这意味着 Docker 会将宿主机上的 ./some/path 目录或文件的内容复制到容器内的 /another/path 目录。注意这里的复制,严格意义来说,它并不是复制,而是替换。 例如./crypto-config/

    2024年04月12日
    浏览(30)
  • 基于区块链与IPFS的数据共享系统设计与搭建(附区块链部分源码与搭建视频)

    购买专栏前请认真阅读:《基于区块链与IPFS的数据共享系统》专栏简介 视频演示: https://www.bilibili.com/video/BV1y24y1v7RX 系统简介: 本系统使用RSA算法生成密钥对, RSA私钥用于用户身份认证;用户发送的数据将存储于IPFS, IPFS返回的CID(IPFS Hash)使用用户的RSA公钥加密后存储于

    2023年04月19日
    浏览(31)
  • 【区块链实战】什么是DAPP,区块链开发如何进行技术选型

    目录 一、简介 二、知识点 DAPP 公链 联盟链 区块链开发涉及的角色 Solidity 三、技术选型 1、DApp 架构分析 2、公链与联盟链 区块链技术现在已经进入一个高速发展时期,作为企业来说一般有两个选择:做底层链技术,或者做区块链应用。 对绝大多数企业或个人来说,无论是技

    2024年02月12日
    浏览(31)
  • 2 区块链落地实战

    作者:禅与计算机程序设计艺术 随着人工智能的兴起,越来越多的人开始关注其在各个行业的应用。在这个时代,区块链作为一种新型的分布式数据库系统正在崛起。 区块链是一组技术协议,用于创建分布式数据库。它可以存储、验证和共享数据,并可靠地记录所有数据的

    2024年02月08日
    浏览(15)
  • [区块链安全-CTF Protocol]区块链智能合约安全实战(已完结)

    这次是尝试CTF-PROTOCOL的题目,望与诸君共勉。后面应该会参考DeFiHackLabs推出对一些列攻击的POC手写和解析,同时还要参加Hackathon。大家一起努力! 题目分析: HiddenKittyCat 合约中,核心部分为: 可以知道kitty存储的位置是由 keccak256(abi.encodePacked(block.timestamp, blockhash(block.number

    2024年02月15日
    浏览(32)
  • 区块链部署和运维---实战训练

    一.宠物商店领养项目实施部署练习  1.预操作: 第一步先检查是否有包含“FISCO”的进程存在 如果没有相关进程正在启动 首先启动FISCO BCOS 启动WeBASE-Front 监控WeBASE-Front启动情况 通过网页验证: 2.配置与启动软件应用 第一步: 1. 打开虚拟机,用mobaxterm等软件连接虚拟机,

    2024年02月03日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包