栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

springboot中通过CommandLineRunner和全局变量配置智能合约信息

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

springboot中通过CommandLineRunner和全局变量配置智能合约信息

项目背景

项目是基于微众的webasefront和webasesign开发的,后端使用springboot
在项目的开发过程中,遇到一些问题,我们的项目是要打包到服务器里面执行的,智能合约的abi和地址存到配置文件里面,而且本项目需要的智能合约多达十几个,那么如果我们要去其他服务器上配置环境的话,需要一个个编译部署并将其复制过来,十分浪费时间精力且容易错误。
另一个就是一旦需要对智能合约进行修改或者重新部署,那么需要修改配置文件并重新打包。。。繁琐不堪

解决方法

然后经过教训之后在想,是不是通过预启动程序和全局变量把所有合约的abi和地址存起来,而不是在配置文件里写死,那么我们重新部署合约的时候只需要重新启动一下jar包就行了

开机自启动程序CommandLineRunner或者ApplicationRunner

这两兄弟其实用起来差不多唯一不同的就是参数不同,ApplicationRunner对参数进行了包装,我这里用的是CommandLineRunner。
CommandLineRunner和ApplicationRunner要做的就是在我们的容器加载完成之后自动运行的程序,所以说可以看作开机自启动程序。

@Component
public class MyCommandLineRunner implements CommandLineRunner

@Override
    public void run(String... args) {
    }

将我们要实现的类继承CommandLineRunner即可,然后在继承的run方法中发送一个post请求获得我们想要存下来的合约地址和abi
webasefront中有一个接口可以返回我们部署在webasefront上的所有合约的信息

具体可看官方的文档在此
返回信息如下

全局变量

在得到所有的合约信息后,我选择用全局变量保存下这些合约的信息,类型为map
首先在配置文件中创建一个参数

contract:
  map: {"default": 30, "[aaa:bbb:ccc_ddd]": 20}

然后新建一个类

@Component
@ConfigurationProperties(prefix = "contract")
public class ContractDeployAddress {

    private Map map = new HashMap<>();

    public Map getMap() {
        return map;
    }

    public void setMap(Map map) {
        this.map = map;
    }

   //KV存储,通过合约名获取合约地址
    public String getContractAddress(String contractName){
        return map.get(contractName);
    }
}

这样就不必在每次合约变动的时候重新修改配置文件了

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/866667.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号