十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
使用fabric提供的cryptogen工具生成文件模板
创新互联专业为企业提供巴宜网站建设、巴宜做网站、巴宜网站设计、巴宜网站制作等企业网站建设、网页设计与制作、巴宜企业网站模板建站服务,10余年巴宜做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
$ cryptogen showtemplate crypto-config.yaml
进行修改,添加一个组织,一个orderer节点.
根据crypto-config.yaml文件生成证书文件:
$ cryptogen generate --config=crypto-config.yaml
查看生成的证书文件夹结构:
需要从fabric的源码案例中拷贝configtx.yaml文件
$ cp $GOPATH/src/github.com/hyperledger/fabric-samples/first-network/configtx.yaml ./
对configtx.yaml文件进行修改.
修改之前,创建一个文件夹,来保存即将创建的创世区块文件
将创建区块文件和通道的命令写到一个脚本中! generate.sh
脚本文件和配置文件的目录结构:
执行generate.sh文件生成创世区块文件和通道,其实只有一个组织,也没必要生成锚节点更新文件..
$ ./generate.sh
配置docker-compose文件:
启动容器, 启动后查看容器运行情况
$ docker-compose up -d
$ docker-compose ps
在这里,创建两个脚本文件,用于docker容器的管理
clear_docker.sh 文件:
restart.sh 文件:
创建配置文件的时候,有两个文件可以进行参考...
修改后的sdk配置文件:
创建出一个模型对象,给其赋值,并开始初始化sdk
使用 pkg/fabsdk/fabsdk.go中的New()方法进行实例化
创建请求之前,需要使用 gopackager.NewCCPackage 方法生成一个resource.CCPackage 对象,传递两个参数,一个是链码的路径(相对于工程的路径), 一个是GOPATH的路径.
安装链码,使用pkg/client/resmgmt/resmgmt.go文件中的方法
创建请求之前,需要生成一个*cb.SignaturePolicyEnvelope类型的对象,使用 third_party/github.com/hyperledger/fabric/common/cauthdsl/cauthdsl_builder.go 文件中的方法即可,提供了好几个方法, 使用任意一个即可.这里使用 SignedByAnyMember 方法: 需要传入所属组织ID
实例化链码
使用 pkg/client/channel/chclient.go 中的 Execute() 方法,来进行数据写入的操作:
rsp, err := model.Channelclient.Execute(req)
写入之前,要创建请求:
tempArgs是要传给链码的参数,可以做下封装,就不受参数个数的限制了
使用 pkg/client/channel/chclient.go 中的 Query() 方法,来进行数据查询的操作: 查询之前,同样需要创建请求.
链码在工程中的路径应该是 工程名/chaincode文件夹
比如:
driverFabricDemo/chaincode
而不应该省略掉工程名这样写: chaincode
错误原因:cert.URIs 和 tpl.URIs 这两个字段没有被定义.
进入tpl对象中, /usr/local/go/src/crypto/x509/x509.go 是个结构体,并没有发现 URIs 字段
对go版本进行升级,从1.9.3升级到1.11.3, 再次进入 /usr/local/go/src/crypto/x509/x509.go 文件中,查看结构体内容:
在执行sdk的Excute()方法时报错.
方法不存在,一般是由于链码的Invoke方法中的方法名和Excute()方法传入的方法名不一样.
但是可以肯定的是,链码的Invoke方法中的方法名和,项目中执行Excute()方法时传入的方法名是完全一样的! 但是很奇怪了,为什么会出现这个错误呢? 使用 docker rmi 删除掉 dev-peerx.travle.xq.com 的镜像,再重新运行即可.
在创建实例化链码请求的时候
总是提示
Cannot use str (type *cb.SignaturePolicyEnvelope) as type *common.SignaturePolicyEnvelope less... (⌘F1) Inspection info: Reports composite literals with incompatible types and values
明明是相同的类型,却总是报错,应该是IDE的问题.把vendor文件夹删除后,就不会有提示了. 再使用vendor对工程进行init 和 add +external 就好了!!
出现这个错误,一般都是配置文件哪个地方写错了,需要细心检查
1.用{{}}包围的是变量,如 {{testName}} ,这表示把给定变量的值插入, {%%}这是块元素 在faygo里叫tag,常见的有 for , if 等
2.如何在模板中定义变量, 平常我们在使用的模板的时候的常会有这样的需要,在模板中要定义一个变量以方便前端逻辑的实现,在faygo模板中定义变量需要用到标签{%set%}
使用方法
{#定义变量 newName #}
{% set newName = "hello faygo" %}
{#获取变量newName的值#}
{{newName}}
定义用 tag set 取值就是上文所提到的{{}}取值
3.在模板中调用方法
这也是一个非常常见和有用的方法,在faygo中调用方法有两种方式 , 一是在渲染模板时在faygo.Map在加入你要调用的方法 , 二是注册一个全局的方法 (在faygo里叫filter过滤器),我们分别来看一下每个方法的实现
1) 在渲染模板时加入方法(render)
//在后端render时加入方法 testFunc
rErr := ctx.Render(200, switchDir+"index.html", faygo.Map{
"TITLE": title,
"testMap": map[string]string{"aaa": "111111"},
"testFunc": func(s string) string {
return s + " this is test func"
},
})
{#前端模板中调用#}
{{ testFunc("hello") }}
结果如下
hello this is test func
这种方法适合只用于此模板一个特殊方法 , 在其它功能中不通用 ,那么如果想定义一个方法全局都可以使用怎么办,这里就需要注册全局方法了(见下文)
2)注册全局方法(过滤器)
如果想定义一个方法全局都可以使用怎么办 ,这里就需要注册一个方法
// pongo2 注册一个全局过滤器,一般在程序启动时init中注册
//这里注册了一个名叫testFilter的过滤器,指向TestFilterFunc方法
pongo2.RegisterFilter("testFilter", TestFilterFunc)
func TestFilterFunc(in, param *pongo2.Value) (*pongo2.Value, *pongo2.Error) {
a := in.String() + " this is global filter"
return pongo2.AsValue(a), nil
}
在这里我们看到TestFilterFunc方法里接收参数和返回参数的类型是pongo2.Value和pongo2.Error
在注册过滤器里方法的接收参数和返回参数是固定的这两个不能改变
官网的话:
All functions’ parameters types must be of either your own type or of type *pongo2.Value(no matter how many) and functions must return one value of either type *Value or your own one.
那么我们返回数据时怎么返回? 在上面例子在我们看到了 AsValue 这个方法可以将我们数据返回,我们可以返回struct,map,array,string 等
在前端调用
{{ "hello" | testFilter }}
结果:
hello this is global filter
返回结构体:
type LoginUserInfo struct {
Username string `json:"username"`
Telephone string `json:"telephone"`
Email string `json:"email"`
Level int `json:"level"`
}
func TestFilterFunc(in, param *pongo2.Value) (*pongo2.Value, *pongo2.Error) {
userInfo := LoginUserInfo{
Username: "userA",
Telephone: "123456",
Email: "123456@test.com",
Level: 1,
}
return pongo2.AsValue(userInfo), nil
}
前端使用:
{#定义一个变量接收struct数据 #}
{% set uinfo = "" | testFilter %}
{#取用户名字#}
{{ uinfo.Username }}
注意,如是 uinfo 只是一个struct 不是struct数组([]uinfo)时 在模板中不能使用{% for %} 使用也不会得到任何数据
如果uinfo是struct数组 在模板中for循环时不要使用 key,val in uinfo
如果uinfo是struct数组 uinfo = []userInfo{}
{#错误示例#}
{% for key,val in uinfo %}
{{val.Username}}
{% endfor %}
struct数据不能使用key,否则循环会执行,但取不到任何数据
{# 正确示例 #}
{% for val in uinfo %}
{{val.Username}}
{% endfor %}
说一下返回map时 用for循环的情况,无论是否是map数组都可以用for key,val in uinfo 来遍历数据
4. 在模板中字符串的连接和宏标签的使用
在模板中有时我们会碰到这样的需要:在模板中有几个变量 ,我们想把这几个变量连接在一起赋值给另一个变量以做其它操作
例: 在模板中有三个变量 host是域名,route是路由地址,param是参数 ,要把这三个变量连接起来赋值给另一个新的变量做urlencode操作。这应该怎么办
因为在模板中使用 + 号连接变量时,程序会认为是数学运算,两个字符串的连接值为0, 如果用内置的filter: join来连接需要传入一个slice,但这三个只是字符串变量。
这个时候我们可能就要用到宏标签了% macro %% endmacro %.
思路是这样的,在宏标签中定义一个宏(可以理解为一个方法),这个宏接收三个参数(参数个数看需求而定),在宏内返回连接的字符串
代码:
{#定义三个变量#}
{% set host="" %}
{% set route="/aaa/bbb" %}
{% set param= "?id=123" %}
{#定义一个宏标签接收三个参数,并返回。注意在宏标签内如果换行,输出的结果中也会有换行,在urlencode的时候也会把换行符进行转义#}
{% macro joinUrl(paramA,paramB,paramC) %}{{paramA}}{{paramB}}{{paramC}}{% endmacro %}
hr
{#定义一个新变量调用宏方法,并将三个参数传入#}
{% set newurl = joinUrl(host,route,param) %}
{#输出newurl的值#}
{{newurl}}br
{#输入出urlencode后的字符串#}
{{newurl|urlencode}}br
结果:
http%3A%2F%2F
在宏标签在也可加入自定义的一些字符串如在上面的宏标签返回结果中要加一个固定字符可以这样写:
{% macro joinUrl(paramA,paramB,paramC) %}{{paramA}}{{paramB}}{{paramC}}from=macro{% endmacro %}
《Go语言编程》(许式伟)电子书网盘下载免费在线阅读
资源链接:
链接:
提取码: ig76
书名:Go语言编程
作者:许式伟
豆瓣评分:7.1
出版社:人民邮电出版社
出版年份:2012-8
页数:300
内容简介:
这本书从整体的写作风格来说,会以介绍 Go 语言特性为主,示例则尽量采用作者平常的实践,而不是一个没有太大实际意义的语法示范样例。
本书作者背景极强,许式伟为原金山WPS首席架构师、曾是盛大创新院研究员,目前是国内Go语言实践圈子公认的Go语言专家。参与本书写作的几位作者都是实际用Go语言开发的项目的开发人员,有较强的实战经验。
本书以介绍Go语言特性为主,示例则尽量采用作者开发团队平常的实践,内容涉及内存管理(堆和栈)、错误处理、OOP、并发编程等关键话题。 这本书面向的读者是所有打算用Go语言的开发者,主要包括目前使用C、C++、Java、C#的开发人员,甚至一些Python、PHP开发人员也可能转为 Go 程序员。
作者简介:
许式伟
七牛云存储CEO,曾任盛大创新院资深研究员、金山软件技术总监、WPS Office 2005首席架构师。开源爱好者,发布过包括WINX、TPL等十余个C++开源项目,拥有超过15年的C/C++开发经验。在接触Go语言后即可被其大道至简、少即是多的设计哲学所倾倒。七牛云存储是国内第一个吃螃蟹的团队,核心服务完全采用Go语言实现。
吕桂华
七牛云存储联合创始人,曾在金山软件、盛大游戏等公司担任架构师和部门经理等职务,在企业级系统和大型网游平台领域有较多涉猎。拥有十余年的C/C++大型项目开发经验,也曾在Java和.NET平台上探索多年。同样被Go语言的魅力所吸引而不可自拔,希望能为推广这门优秀的语言尽自己的绵薄之力。
Revel Web开源框架
个高效的Go语言Web开发框架, 其思路完全来自 Java 的 Play Framework。
特点
热编译,简单可选,同步(每个请求都创建自己的goroutine来处理。
Go语言Web框架:beego
一个用Go开发的应用框架,思路来自于tornado,路由设计来源于sinatra。
支持特性
MVC;
REST;
智能路由;
日志调试;
配置管理;
模板自动渲染;
layout设计;
中间件插入逻辑;
方便的JSON/XML服务;
《Go语言编程》(许式伟)电子书网盘下载免费在线阅读
链接:
提取码:j0if
书名:Go语言编程
作者:许式伟
豆瓣评分:7.1
出版社:人民邮电出版社
出版年份:2012-8
页数:300
内容简介:
这本书从整体的写作风格来说,会以介绍 Go 语言特性为主,示例则尽量采用作者平常的实践,而不是一个没有太大实际意义的语法示范样例。
本书作者背景极强,许式伟为原金山WPS首席架构师、曾是盛大创新院研究员,目前是国内Go语言实践圈子公认的Go语言专家。参与本书写作的几位作者都是实际用Go语言开发的项目的开发人员,有较强的实战经验。
本书以介绍Go语言特性为主,示例则尽量采用作者开发团队平常的实践,内容涉及内存管理(堆和栈)、错误处理、OOP、并发编程等关键话题。 这本书面向的读者是所有打算用Go语言的开发者,主要包括目前使用C、C++、Java、C#的开发人员,甚至一些Python、PHP开发人员也可能转为 Go 程序员。
作者简介:
许式伟
七牛云存储CEO,曾任盛大创新院资深研究员、金山软件技术总监、WPS Office 2005首席架构师。开源爱好者,发布过包括WINX、TPL等十余个C++开源项目,拥有超过15年的C/C++开发经验。在接触Go语言后即可被其大道至简、少即是多的设计哲学所倾倒。七牛云存储是国内第一个吃螃蟹的团队,核心服务完全采用Go语言实现。
吕桂华
七牛云存储联合创始人,曾在金山软件、盛大游戏等公司担任架构师和部门经理等职务,在企业级系统和大型网游平台领域有较多涉猎。拥有十余年的C/C++大型项目开发经验,也曾在Java和.NET平台上探索多年。同样被Go语言的魅力所吸引而不可自拔,希望能为推广这门优秀的语言尽自己的绵薄之力。