新聞中心
fabric-sdk-go的簡單使用
使用fabric提供的cryptogen工具生成文件模板
創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供巴宜網(wǎng)站建設、巴宜做網(wǎng)站、巴宜網(wǎng)站設計、巴宜網(wǎng)站制作等企業(yè)網(wǎng)站建設、網(wǎng)頁設計與制作、巴宜企業(yè)網(wǎng)站模板建站服務,10余年巴宜做網(wǎng)站經驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡服務。
$ cryptogen showtemplate crypto-config.yaml
進行修改,添加一個組織,一個orderer節(jié)點.
根據(jù)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文件進行修改.
修改之前,創(chuàng)建一個文件夾,來保存即將創(chuàng)建的創(chuàng)世區(qū)塊文件
將創(chuàng)建區(qū)塊文件和通道的命令寫到一個腳本中! generate.sh
腳本文件和配置文件的目錄結構:
執(zhí)行generate.sh文件生成創(chuàng)世區(qū)塊文件和通道,其實只有一個組織,也沒必要生成錨節(jié)點更新文件..
$ ./generate.sh
配置docker-compose文件:
啟動容器, 啟動后查看容器運行情況
$ docker-compose up -d
$ docker-compose ps
在這里,創(chuàng)建兩個腳本文件,用于docker容器的管理
clear_docker.sh 文件:
restart.sh 文件:
創(chuàng)建配置文件的時候,有兩個文件可以進行參考...
修改后的sdk配置文件:
創(chuàng)建出一個模型對象,給其賦值,并開始初始化sdk
使用 pkg/fabsdk/fabsdk.go中的New()方法進行實例化
創(chuàng)建請求之前,需要使用 gopackager.NewCCPackage 方法生成一個resource.CCPackage 對象,傳遞兩個參數(shù),一個是鏈碼的路徑(相對于工程的路徑), 一個是GOPATH的路徑.
安裝鏈碼,使用pkg/client/resmgmt/resmgmt.go文件中的方法
創(chuàng)建請求之前,需要生成一個*cb.SignaturePolicyEnvelope類型的對象,使用 third_party/github.com/hyperledger/fabric/common/cauthdsl/cauthdsl_builder.go 文件中的方法即可,提供了好幾個方法, 使用任意一個即可.這里使用 SignedByAnyMember 方法: 需要傳入所屬組織ID
實例化鏈碼
使用 pkg/client/channel/chclient.go 中的 Execute() 方法,來進行數(shù)據(jù)寫入的操作:
rsp, err := model.Channelclient.Execute(req)
寫入之前,要創(chuàng)建請求:
tempArgs是要傳給鏈碼的參數(shù),可以做下封裝,就不受參數(shù)個數(shù)的限制了
使用 pkg/client/channel/chclient.go 中的 Query() 方法,來進行數(shù)據(jù)查詢的操作: 查詢之前,同樣需要創(chuàng)建請求.
鏈碼在工程中的路徑應該是 工程名/chaincode文件夾
比如:
driverFabricDemo/chaincode
而不應該省略掉工程名這樣寫: chaincode
錯誤原因:cert.URIs 和 tpl.URIs 這兩個字段沒有被定義.
進入tpl對象中, /usr/local/go/src/crypto/x509/x509.go 是個結構體,并沒有發(fā)現(xiàn) URIs 字段
對go版本進行升級,從1.9.3升級到1.11.3, 再次進入 /usr/local/go/src/crypto/x509/x509.go 文件中,查看結構體內容:
在執(zhí)行sdk的Excute()方法時報錯.
方法不存在,一般是由于鏈碼的Invoke方法中的方法名和Excute()方法傳入的方法名不一樣.
但是可以肯定的是,鏈碼的Invoke方法中的方法名和,項目中執(zhí)行Excute()方法時傳入的方法名是完全一樣的! 但是很奇怪了,為什么會出現(xiàn)這個錯誤呢? 使用 docker rmi 刪除掉 dev-peerx.travle.xq.com 的鏡像,再重新運行即可.
在創(chuàng)建實例化鏈碼請求的時候
總是提示
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 就好了!!
出現(xiàn)這個錯誤,一般都是配置文件哪個地方寫錯了,需要細心檢查
golang的iris框架的模版如何相互引用?
1.用{{}}包圍的是變量,如 {{testName}} ,這表示把給定變量的值插入, {%%}這是塊元素 在faygo里叫tag,常見的有 for , if 等
2.如何在模板中定義變量, 平常我們在使用的模板的時候的常會有這樣的需要,在模板中要定義一個變量以方便前端邏輯的實現(xiàn),在faygo模板中定義變量需要用到標簽{%set%}
使用方法
{#定義變量 newName #}
{% set newName = "hello faygo" %}
{#獲取變量newName的值#}
{{newName}}
定義用 tag set 取值就是上文所提到的{{}}取值
3.在模板中調用方法
這也是一個非常常見和有用的方法,在faygo中調用方法有兩種方式 , 一是在渲染模板時在faygo.Map在加入你要調用的方法 , 二是注冊一個全局的方法 (在faygo里叫filter過濾器),我們分別來看一下每個方法的實現(xiàn)
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方法里接收參數(shù)和返回參數(shù)的類型是pongo2.Value和pongo2.Error
在注冊過濾器里方法的接收參數(shù)和返回參數(shù)是固定的這兩個不能改變
官網(wǎng)的話:
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.
那么我們返回數(shù)據(jù)時怎么返回? 在上面例子在我們看到了 AsValue 這個方法可以將我們數(shù)據(jù)返回,我們可以返回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數(shù)據(jù) #}
{% set uinfo = "" | testFilter %}
{#取用戶名字#}
{{ uinfo.Username }}
注意,如是 uinfo 只是一個struct 不是struct數(shù)組([]uinfo)時 在模板中不能使用{% for %} 使用也不會得到任何數(shù)據(jù)
如果uinfo是struct數(shù)組 在模板中for循環(huán)時不要使用 key,val in uinfo
如果uinfo是struct數(shù)組 uinfo = []userInfo{}
{#錯誤示例#}
{% for key,val in uinfo %}
{{val.Username}}
{% endfor %}
struct數(shù)據(jù)不能使用key,否則循環(huán)會執(zhí)行,但取不到任何數(shù)據(jù)
{# 正確示例 #}
{% for val in uinfo %}
{{val.Username}}
{% endfor %}
說一下返回map時 用for循環(huán)的情況,無論是否是map數(shù)組都可以用for key,val in uinfo 來遍歷數(shù)據(jù)
4. 在模板中字符串的連接和宏標簽的使用
在模板中有時我們會碰到這樣的需要:在模板中有幾個變量 ,我們想把這幾個變量連接在一起賦值給另一個變量以做其它操作
例: 在模板中有三個變量 host是域名,route是路由地址,param是參數(shù) ,要把這三個變量連接起來賦值給另一個新的變量做urlencode操作。這應該怎么辦
因為在模板中使用 + 號連接變量時,程序會認為是數(shù)學運算,兩個字符串的連接值為0, 如果用內置的filter: join來連接需要傳入一個slice,但這三個只是字符串變量。
這個時候我們可能就要用到宏標簽了% macro %% endmacro %.
思路是這樣的,在宏標簽中定義一個宏(可以理解為一個方法),這個宏接收三個參數(shù)(參數(shù)個數(shù)看需求而定),在宏內返回連接的字符串
代碼:
{#定義三個變量#}
{% set host="" %}
{% set route="/aaa/bbb" %}
{% set param= "?id=123" %}
{#定義一個宏標簽接收三個參數(shù),并返回。注意在宏標簽內如果換行,輸出的結果中也會有換行,在urlencode的時候也會把換行符進行轉義#}
{% macro joinUrl(paramA,paramB,paramC) %}{{paramA}}{{paramB}}{{paramC}}{% endmacro %}
hr
{#定義一個新變量調用宏方法,并將三個參數(shù)傳入#}
{% 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語言編程》pdf下載在線閱讀全文,求百度網(wǎng)盤云資源
《Go語言編程》(許式偉)電子書網(wǎng)盤下載免費在線閱讀
資源鏈接:
鏈接:
提取碼: ig76 ?
書名:Go語言編程
作者:許式偉
豆瓣評分:7.1
出版社:人民郵電出版社
出版年份:2012-8
頁數(shù):300
內容簡介:
這本書從整體的寫作風格來說,會以介紹 Go 語言特性為主,示例則盡量采用作者平常的實踐,而不是一個沒有太大實際意義的語法示范樣例。
本書作者背景極強,許式偉為原金山WPS首席架構師、曾是盛大創(chuàng)新院研究員,目前是國內Go語言實踐圈子公認的Go語言專家。參與本書寫作的幾位作者都是實際用Go語言開發(fā)的項目的開發(fā)人員,有較強的實戰(zhàn)經驗。
本書以介紹Go語言特性為主,示例則盡量采用作者開發(fā)團隊平常的實踐,內容涉及內存管理(堆和棧)、錯誤處理、OOP、并發(fā)編程等關鍵話題。 這本書面向的讀者是所有打算用Go語言的開發(fā)者,主要包括目前使用C、C++、Java、C#的開發(fā)人員,甚至一些Python、PHP開發(fā)人員也可能轉為 Go 程序員。
作者簡介:
許式偉
七牛云存儲CEO,曾任盛大創(chuàng)新院資深研究員、金山軟件技術總監(jiān)、WPS Office 2005首席架構師。開源愛好者,發(fā)布過包括WINX、TPL等十余個C++開源項目,擁有超過15年的C/C++開發(fā)經驗。在接觸Go語言后即可被其大道至簡、少即是多的設計哲學所傾倒。七牛云存儲是國內第一個吃螃蟹的團隊,核心服務完全采用Go語言實現(xiàn)。
呂桂華
七牛云存儲聯(lián)合創(chuàng)始人,曾在金山軟件、盛大游戲等公司擔任架構師和部門經理等職務,在企業(yè)級系統(tǒng)和大型網(wǎng)游平臺領域有較多涉獵。擁有十余年的C/C++大型項目開發(fā)經驗,也曾在Java和.NET平臺上探索多年。同樣被Go語言的魅力所吸引而不可自拔,希望能為推廣這門優(yōu)秀的語言盡自己的綿薄之力。
Go語言做Web應用開發(fā)的框架,哪一個更適合入門
Revel Web開源框架
個高效的Go語言Web開發(fā)框架,?其思路完全來自 Java 的?Play Framework。
特點
熱編譯,簡單可選,同步(每個請求都創(chuàng)建自己的goroutine來處理。
Go語言Web框架:beego
一個用Go開發(fā)的應用框架,思路來自于tornado,路由設計來源于sinatra。
支持特性
MVC;
REST;
智能路由;
日志調試;
配置管理;
模板自動渲染;
layout設計;
中間件插入邏輯;
方便的JSON/XML服務;
《Go語言編程》pdf下載在線閱讀,求百度網(wǎng)盤云資源
《Go語言編程》(許式偉)電子書網(wǎng)盤下載免費在線閱讀
鏈接:
提取碼:j0if
書名:Go語言編程
作者:許式偉
豆瓣評分:7.1
出版社:人民郵電出版社
出版年份:2012-8
頁數(shù):300
內容簡介:
這本書從整體的寫作風格來說,會以介紹 Go 語言特性為主,示例則盡量采用作者平常的實踐,而不是一個沒有太大實際意義的語法示范樣例。
本書作者背景極強,許式偉為原金山WPS首席架構師、曾是盛大創(chuàng)新院研究員,目前是國內Go語言實踐圈子公認的Go語言專家。參與本書寫作的幾位作者都是實際用Go語言開發(fā)的項目的開發(fā)人員,有較強的實戰(zhàn)經驗。
本書以介紹Go語言特性為主,示例則盡量采用作者開發(fā)團隊平常的實踐,內容涉及內存管理(堆和棧)、錯誤處理、OOP、并發(fā)編程等關鍵話題。 這本書面向的讀者是所有打算用Go語言的開發(fā)者,主要包括目前使用C、C++、Java、C#的開發(fā)人員,甚至一些Python、PHP開發(fā)人員也可能轉為 Go 程序員。
作者簡介:
許式偉
七牛云存儲CEO,曾任盛大創(chuàng)新院資深研究員、金山軟件技術總監(jiān)、WPS Office 2005首席架構師。開源愛好者,發(fā)布過包括WINX、TPL等十余個C++開源項目,擁有超過15年的C/C++開發(fā)經驗。在接觸Go語言后即可被其大道至簡、少即是多的設計哲學所傾倒。七牛云存儲是國內第一個吃螃蟹的團隊,核心服務完全采用Go語言實現(xiàn)。
呂桂華
七牛云存儲聯(lián)合創(chuàng)始人,曾在金山軟件、盛大游戲等公司擔任架構師和部門經理等職務,在企業(yè)級系統(tǒng)和大型網(wǎng)游平臺領域有較多涉獵。擁有十余年的C/C++大型項目開發(fā)經驗,也曾在Java和.NET平臺上探索多年。同樣被Go語言的魅力所吸引而不可自拔,希望能為推廣這門優(yōu)秀的語言盡自己的綿薄之力。
新聞名稱:關于go語言tpl渲染的信息
轉載來于:http://www.ef60e0e.cn/article/dscehgo.html