【公开源码】Tokenstring 海豚 BaaS 智能合约开发公链代码全开源
suiw9 2025-03-29 21:57 7 浏览 0 评论
Tokenstring 基于 Hite BaaS 智能合约开发公链代码全开源,让公链技术轻易融入我们的生活中。
pandaCoin
一款基于海豚BaaS平台快速开发的区块链系统。
项目简介
panda是一款基于海豚BaaS平台快速开发的区块链系统。基于平台更简单的区块链数据服务。以更少的代价和更低的学习成本,快速实现真正的区块链应用。这里以熊猫币为例子实现数字货币系统的大部分功能。
本文档的受众群体为 有一定的数字货币基础的开发人员。其功能主要实现:
- ECDSA钱包
- 交易客户端类
- 创建主币种panda币
- 创建子币种
- 主币种转账(panda币转账消耗panda币作为gas)
- 子币种转账(子币种转账消耗panda币作为gas)
- 转账接口
- 企业区块更新
- 地址余额查询
文档目录
- 如何对接HiteBaaS平台
- 项目说明(如何开发自己的数字货币系统)
- 接口文档
#对接HiteBaaS平台
官网: https://www.hitebaas.com
申请入驻平台:
https://www.hitebaas.com/hitebaas/index/apply.html
企业申请指南:该页面简述了如何对接平台,最简单的话可直接联系页面最下方的邮箱地址 hitebaas@synctech.net.cn,会有专人客服和你对接。正如平台所说“以更少的代价更低的学习成本”便可创建自己的区块链应用。在平台下方“API工具下载” ,下载工具
hitebaas-api-0.0.1-SNAPSHOT.jar。
或者点击链接下载:
https://www.hitebaas.com/hitebaas/index/api.zip和平台人员对接后:
1、确认数据格式。
2、获得平台给的appId、appKey、secretKey(这很重要,后面将使用这三个字符串和平台数据交互)。
3、登录入驻企业后台,下载区块更新节点(后续会讲到如何从该节点上获取本项目相关的交易)。pandaCoin 入驻HiteBaaS的约定数据字段如下(仅供参考)
数据英文名称数据中文名称tradehash交易哈希fromAddress转出地址toAddress转入地址amount交易币额coinType币种类型gas燃油费gasCoinType燃油费币种type交易种类sign签名publickey公钥
对应项目内java类名TradeEntity。
引入工具类
hitebaas-api-0.0.1-SNAPSHOT.jar。
将包安装到本地仓库:
mvn install:install-file -DgroupId=com.hitebaas -DartifactId=hitebaas-api -Dversion=0.0.1-SNAPSHOT -Dpackaging=jar -Dfile=hitebaas-api-0.0.1-SNAPSHOT.jar
maven项目引入:
com.hitebaashitebaas-api0.0.1-SNAPSHOT
使用方式:
DataHelperdataHelper = new DataHelper();
boolean b = dataHelper.send(tradeEntity, appId, appKey, secretKey, null);
panda-server(项目后台)将使用该工具包和HiteBaaS平台交互。
与平台的人员联调下TradeEntity的数据格式没问题,能打包上链就OK了,到这里和平台相关的对接工作就节本完成了。
#项目说明 涉及到的一些技术: maven、spring boot、mongoDB
项目结构说明:
panda-all
---- panda-client
---- panda-common
---- panda-parent
---- panda-server
---- pom.xmlpanda-client : 模拟App钱包客户端,用于向系统后台(panda-server)发送交易。
panda-common : 一些公共的模型、工具类。
panda-parent : 版本管理。
panda-server :项目核心后台。
1、交易客户端类
项目里将使用它模拟APP移动客户端端。/**
* 模拟发送交易工具
* 若在spring项目里面可使用restTemplate 会更加优雅
* @param te
* @param blockHash
* @param workload
* @return
*/
public static boolean sendTrade(TradeEntity te) {
CloseableHttpResponse response = null;
HttpPost httpPost = null;
try {
String url = "
http://localhost:8080/panda-server/panda/trade";//项目后台接口
System.out.println(url);
String senMsg = new Gson().toJson(te);
httpPost = new HttpPost(url);
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(5000).setConnectionRequestTimeout(15000).setSocketTimeout(15000).build();
httpPost.setConfig(requestConfig);
CloseableHttpClient httpClient = HttpClients.createDefault();
StringEntity entity = new StringEntity(senMsg, Charset.forName("UTF-8"));
entity.setContentEncoding("UTF-8");
entity.setContentType("application/json");
httpPost.setEntity(entity);
response = httpClient.execute(httpPost);
if(200 == response.getStatusLine().getStatusCode()) {
String resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
System.out.println(resultString);
return true;
}else {
return false;
}
} catch (ClientProtocolException e) {
logger.error(e.getMessage(), e);
} catch (IOException e) {
logger.error(e.getMessage(), e);
}catch (Exception e) {
logger.error(e.getMessage(), e);
}finally {
try {
if(httpPost != null) {
httpPost.releaseConnection();
}
if(response!=null)
response.close();
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
}
return false;
}
2、创建钱包
panda-common项目的测试类Test.java@org.junit.Test
public void test() {
try {
System.out.println("-----------------------------------------------");
WalletAddress wa = ECDSAUtils.genWalletAddresst();
System.out.println("地址: " + wa.getAddress());
System.out.println("公钥: " + wa.getPublicKey());
System.out.println("私钥: " + wa.getPrivateKey());
System.out.println("-----------------------------------------------");
System.out.println("-----------------------------------------------");
String content = "aasd我是测试字符串+--2";
String sign = ECDSAUtils.sign(content.getBytes("UTF-8"), wa.getPrivateKey());
System.out.println("签名sign:" + sign);
System.out.println("-----------------------------------------------");
System.out.println("-----------------------------------------------");
boolean b = ECDSAUtils.verify(content.getBytes("UTF-8"), wa.getPublicKey(), sign);
System.out.println("签名验证:" + b);
System.out.println("-----------------------------------------------");
} catch (Exception e) {
e.printStackTrace();
}
}
该方法将生成地址、公钥、私钥。
如:app客户端上生成,则把它们保存在app移动端。由用户自己保管自己的秘钥。3、创建主币种panda币
(主币在项目启动之初就应该创建,项目保证了只能创建名为panda的主币种且只能创建一次,开发者可根据自己的需要去更改名称)
所有交易包括创建币种、交易。都将通过上诉和平台约定的字段来提现。
我们这里做个共识。 字段 type(交易种类)等于 1时,为创建币种交易。
满足条件fromAddress(转出地址)=toAddress(转入地址),amount(交易额)为币种初始量。
主币种:创建主币时coinType='panda',gasCoinType='panda'币。
panda-client项目的CreateCoin单元测试方法。/**
* 创建主币种panda币(熊猫币)
*/
@org.junit.Test
public void createPanda() {
try {
//私钥
String privateKey = "MEECAQAwEwYHKoZIzj0CAQYIKoZIzj0DAQcEJzAlAgEBBCBDeowxYhK+Qkrv9ScbY1qtRXMvZFxeFmUNxOzEgq6VuA==";
//公钥
String publicKey= "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/5xeVT8EEdauYQUs5KV21Ozv9xmWzyMDoGaFg9ywyAcAoawz+Aj0ius4jyvjy+wGnafelonUYJHoC/bOroQiFw==";
//地址
String address = "0x4173c715a814a30c9167d24aeb01aaef";
HTTPHelper httpHelper = new HTTPHelper();
TradeEntity te = new TradeEntity();
te.setAmount("10000000");//主币种初始额
te.setCoinType("panda");//主币种名称
te.setFromAddress(address);//转出地址(初始额接收地址)
te.setGas("0");//主币种这里为0.
te.setGasCoinType("panda");//gas币种也为0
te.setToAddress(address);//转入地址=转出地址
te.setType("1");//交易类型1
te.setTradehash(te.md5Tradehash());//生成交易哈希
te.setPublickey(publicKey);//公钥
String sign = ECDSAUtils.sign(te.getTradehash().getBytes("UTF-8"), privateKey);//签名
te.setSign(sign);
//发送创建主币交易至项目后台,后台转发至HiteBaas平台
boolean b = HTTPHelper.sendTrade(te);
if(b) {
System.out.println(b);
}
} catch (Exception e) {
e.printStackTrace();
}
}
4、子币种:
创建币种时coinType='panda',gasCoinType='子币种名称'币并且需消耗1000panda币作为燃油费。/**
* 创建子币种deer币种(小鹿币)
*/
@org.junit.Test
public void createDeer() {
try {
//私钥
String privateKey = "MEECAQAwEwYHKoZIzj0CAQYIKoZIzj0DAQcEJzAlAgEBBCBDeowxYhK+Qkrv9ScbY1qtRXMvZFxeFmUNxOzEgq6VuA==";
//公钥
String publicKey= "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/5xeVT8EEdauYQUs5KV21Ozv9xmWzyMDoGaFg9ywyAcAoawz+Aj0ius4jyvjy+wGnafelonUYJHoC/bOroQiFw==";
//地址
String address = "0x4173c715a814a30c9167d24aeb01aaef";
HTTPHelper httpHelper = new HTTPHelper();
TradeEntity te = new TradeEntity();
te.setAmount("1000000");//初始币额
te.setCoinType("Deer");//子币种名称
te.setFromAddress(address);//创建地址(初始额接收地址)
te.setGas("1000");//消耗1000的panda币作为gas
te.setGasCoinType("panda");//使用主币种作为燃油费
te.setToAddress(address);//转出地址=转入地址
te.setType("1");//交易类型为1
te.setTradehash(te.md5Tradehash());//生成交易哈希值
te.setPublickey(publicKey);//公钥
String sign = ECDSAUtils.sign(te.getTradehash().getBytes("UTF-8"), privateKey);//签名
te.setSign(sign);
//发送创建主币交易至项目后台,后台转发至HiteBaas平台
boolean b = HTTPHelper.sendTrade(te);
if(b) {
System.out.println(b);
}
} catch (Exception e) {
e.printStackTrace();
}
}
5、转账交易:与各种主流币类似。
主币/子币交易:/**
* 币种交易
*/
@org.junit.Test
public void trade() {
try {
String privateKey = "MEECAQAwEwYHKoZIzj0CAQYIKoZIzj0DAQcEJzAlAgEBBCBDeowxYhK+Qkrv9ScbY1qtRXMvZFxeFmUNxOzEgq6VuA==";
String publicKey= "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/5xeVT8EEdauYQUs5KV21Ozv9xmWzyMDoGaFg9ywyAcAoawz+Aj0ius4jyvjy+wGnafelonUYJHoC/bOroQiFw==";
String address = "0x4173c715a814a30c9167d24aeb01aaef";
String address0 = "0x694bc428d78c5149158c29a2a02a54b4";
String publicKey0= "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHnHSQn7sgHgfV1adaUhZ45O0v5EUkR1Oee1Vilg6SEW6kBmkl/jVN/uXjluZYGA7g0iGMeiM7sJei2iUd6pqzw==";
String privateKey0 = "MEECAQAwEwYHKoZIzj0CAQYIKoZIzj0DAQcEJzAlAgEBBCCek3iy79+kskR1HkKYaX7AzEKrasnUqOqKdss/RrdUyQ==";
HTTPHelper httpHelper = new HTTPHelper();
TradeEntity te = new TradeEntity();
te.setAmount("10.02");//转账币额
te.setCoinType("Deer");//币种名称,如果这里是主币转账的话则为 panda
te.setFromAddress(address);//转出地址
te.setGas("0.0052");//gas
//te.setGasCoinType("panda");
te.setGasCoinType("panda");//使用主币作为燃油费
te.setToAddress(address0);//转入地址
te.setType("0");//交易类型0
te.setTradehash(te.md5Tradehash());//生成交易哈希
te.setPublickey(publicKey);//转出公钥
String sign = ECDSAUtils.sign(te.getTradehash().getBytes("UTF-8"), privateKey);//使用转出私钥签名
te.setSign(sign);
//发送创建主币交易至项目后台,后台转发至HiteBaas平台
boolean b = HTTPHelper.sendTrade(te);
if(b) {
System.out.println(b);
}
} catch (Exception e) {
e.printStackTrace();
}
}
6、企业区块更新
在官网上 登录 企业自己的后台,下载自己企业的HiteBaaS更新节点 hitebaas-client.rar启动企业节点步骤:
1:打开enterprise.txt文件夹,将对应的appId,appKey,secretKey的xx换成对应项目的值,appId,appKey,secretKey可在个人中心对应项目点查询里得到
2:执行sh脚本
执行脚本后本地便开始更新自己企业的区块(如果自己数据量多的话请保证磁盘容量充足)。
该节点提供了一个接口。(这是重中之重),我们的一切交易都将由这个接口来确认是否成功上链。
后台项目panda-server会启动一个定时器BlockUpdateTimer.java 去轮询访问这个本地接口,获取交易队列。
并将交易的信息,保存/更新至 MongoDB(以供所有app用户查询查询)。7、通用数据查询接口
后台项目panda-server提供给App用户的查询接口。
请求方式:GET。
http://localhost:8080/panda-server/data/要查询的43位地址@币种名称如下查询地址
0x4173c715a814a30c9167d24aeb01aaef 有多少Deer 币:http://localhost:8080/panda-server/data/0x4173c715a814a30c9167d24aeb01aaef@Deer
如下查询地址
0x4173c715a814a30c9167d24aeb01aaef panda 币:http://localhost:8080/panda-server/data/0x4173c715a814a30c9167d24aeb01aaef@panda
正常返回余额数据如下:
{
"code": 0,
"msg": "Success",
"content": {
"amount": 999989.98,
"address": "0x4173c715a814a30c9167d24aeb01aaef"
}
}
后续将会推出如何将智能合约与HiteBaaS平台结合
相关推荐
- 看完这一篇数据仓库干货,终于搞懂什么是hive了
-
一、Hive定义Hive最早来源于FaceBook,因为FaceBook网站每天产生海量的结构化日志数据,为了对这些数据进行管理,并且因为机器学习的需求,产生了Hive这们技术,并继续发展成为一个成...
- 真正让你明白Hive参数调优系列1:控制map个数与性能调优参数
-
本系列几章系统地介绍了开发中Hive常见的用户配置属性(有时称为参数,变量或选项),并说明了哪些版本引入了哪些属性,常见有哪些属性的使用,哪些属性可以进行Hive调优,以及如何使用的问题。以及日常Hi...
- HIVE SQL基础语法(hive sql是什么)
-
引言与关系型数据库的SQL略有不同,但支持了绝大多数的语句如DDL、DML以及常见的聚合函数、连接查询、条件查询。HIVE不适合用于联机事务处理,也不提供实时查询功能。它最适合应用在基于大量不可变数据...
- [干货]Hive与Spark sql整合并测试效率
-
在目前的大数据架构中hive是用来做离线数据分析的,而在Spark1.4版本中spark加入了sparksql,我们知道spark的优势是速度快,那么到底sparksql会比hive...
- Hive 常用的函数(hive 数学函数)
-
一、Hive函数概述及分类标准概述Hive内建了不少函数,用于满足用户不同使用需求,提高SQL编写效率:...
- 数仓/数开面试题真题总结(二)(数仓面试时应该讲些什么)
-
二.Hive...
- Tomcat处理HTTP请求流程解析(tomcat 处理请求过程)
-
1、一个简单的HTTP服务器在Web应用中,浏览器请求一个URL,服务器就把生成的HTML网页发送给浏览器,而浏览器和服务器之间的传输协议是HTTP,那么接下来我们看下如何用Java来实现一个简单...
- Python 高级编程之网络编程 Socket(六)
-
一、概述Python网络编程是指使用Python语言编写的网络应用程序。这种编程涉及到网络通信、套接字编程、协议解析等多种方面的知识。...
- [904]ScalersTalk成长会Python小组第20周学习笔记
-
Scalers点评:在2015年,ScalersTalk成长会Python小组完成了《Python核心编程》第1轮的学习。到2016年,我们开始第二轮的学习,并且将重点放在章节的习题上。Python小...
- 「web开发」几款http请求测试工具
-
curl命令CURL(CommandLineUniformResourceLocator),是一个利用URL语法,在命令行终端下使用的网络请求工具,支持HTTP、HTTPS、FTP等协议...
- Mac 基于HTTP方式访问下载共享文件,配置共享服务器
-
方法一:使用Python的SimpleHTTPServer进行局域网文件共享Mac自带Python,所以不需要安装其他软件,一条命令即可...
- 使用curl进行http高并发访问(php curl 大量并发获得结果)
-
本文主要介绍curl异步接口的使用方式,以及获取高性能的一些思路和实践。同时假设读者已经熟悉并且使用过同步接口。1.curl接口基本介绍curl一共有三种接口:EasyInterface...
- Django 中的 HttpResponse理解和用法-基础篇1
-
思路是方向,代码是时间,知识需积累,经验需摸索。希望对大家有用,有错误还望指出。...
你 发表评论:
欢迎- 一周热门
-
-
Linux:Ubuntu22.04上安装python3.11,简单易上手
-
宝马阿布达比分公司推出独特M4升级套件,整套升级约在20万
-
MATLAB中图片保存的五种方法(一)(matlab中保存图片命令)
-
别再傻傻搞不清楚Workstation Player和Workstation Pro的区别了
-
如何提取、修改、强刷A卡bios a卡刷bios工具
-
Linux上使用tinyproxy快速搭建HTTP/HTTPS代理器
-
Element Plus 的 Dialog 组件实现点击遮罩层不关闭对话框
-
日本组合“岚”将于2020年12月31日停止团体活动
-
SpringCloud OpenFeign 使用 okhttp 发送 HTTP 请求与 HTTP/2 探索
-
MacOS + AList + 访达,让各种云盘挂载到本地(建议收藏)
-
- 最近发表
- 标签列表
-
- dialog.js (57)
- importnew (44)
- windows93网页版 (44)
- yii2框架的优缺点 (45)
- tinyeditor (45)
- qt5.5 (60)
- windowsserver2016镜像下载 (52)
- okhttputils (51)
- android-gif-drawable (53)
- 时间轴插件 (56)
- docker systemd (65)
- slider.js (47)
- android webview缓存 (46)
- pagination.js (59)
- loadjs (62)
- openssl1.0.2 (48)
- velocity模板引擎 (48)
- pcre library (47)
- zabbix微信报警脚本 (63)
- jnetpcap (49)
- pdfrenderer (43)
- fastutil (48)
- uinavigationcontroller (53)
- bitbucket.org (44)
- python websocket-client (47)