【发布时间】:2017-09-15 00:29:19
【问题描述】:
我正在使用 fabric-sample 中的 ./byfn.sh 脚本来启动我的区块链。 我想从区块链的 PHP 网站调用和查询数据。
我知道我只能使用来自 CLI 容器的 API 调用或使用 JavaSDK/NodeSDK、RESTapi。
如何以最简单的方式从区块链中查询数据? 我正在查看 NodeSDK 和 RestApi,但我没有看到太多可以帮助我的指南,因此提出了这个问题。 对不起新手问题。
谢谢!
【问题讨论】:
我正在使用 fabric-sample 中的 ./byfn.sh 脚本来启动我的区块链。 我想从区块链的 PHP 网站调用和查询数据。
我知道我只能使用来自 CLI 容器的 API 调用或使用 JavaSDK/NodeSDK、RESTapi。
如何以最简单的方式从区块链中查询数据? 我正在查看 NodeSDK 和 RestApi,但我没有看到太多可以帮助我的指南,因此提出了这个问题。 对不起新手问题。
谢谢!
【问题讨论】:
调用 Hyperledger Fabric 节点并与之交互的正确方法是通过 SDK,以下是可用 SDK 的列表:
正如@christo4ferris 所建议的,还有一个额外的项目:
(可能是你感兴趣的那个)
例如,您可以使用 golang SDK 并执行以下操作:
读取配置文件
var err error
conf, err := config.InitConfig("config.yaml")
if err != nil {
fmt.Println(err)
return
}
初始化结构客户端
cl := fabricclient.NewClient(conf)
bccspFactory.InitFactories(conf.CSPConfig())
cl.SetCryptoSuite(bccspFactory.GetDefault())
加载客户端证书和密钥
privKey := filepath.Join(conf.CryptoConfigPath(), "path to key")
pubKey := filepath.Join(conf.CryptoConfigPath(), "path to cert")
读取和设置 MSP ID
mspID, err := conf.MspID("org1")
if err != nil {
fmt.Println(err)
return
}
将客户端用户设置到上下文中
user, err := fabapi.NewPreEnrolledUser(conf, privKey, pubKey, "user1", mspID, cl.GetCryptoSuite())
if err != nil {
fmt.Println(err)
return
}
cl.SetUserContext(user)
设置排序节点
ordererConf, err := conf.OrdererConfig("orderer0")
if err != nil {
fmt.Println(err)
return
}
o, err := orderer.NewOrderer(fmt.Sprintf("%s:%d", ordererConf.Host, ordererConf.Port),
filepath.Join(conf.CryptoConfigPath(), "path to orderer cert"),
"orderer.example.com", conf)
if err != nil {
fmt.Println(err)
return
}
设置和初始化通道和背书节点
peers, err := conf.PeersConfig("org1")
if err != nil {
fmt.Println(err)
return
}
p, err := peer.NewPeer(fmt.Sprintf("%s:%d", peers[0].Host, peers[0].Port), conf)
if err != nil {
fmt.Println(err)
}
ch, err := cl.NewChannel("mychannel")
if err != nil {
fmt.Println(err)
return
}
ch.AddOrderer(o)
ch.AddPeer(p)
ch.SetPrimaryPeer(p)
cl.SaveUserToStateStore(user, true)
准备交易提案请求发送并提交订购
txRequest := apitxn.ChaincodeInvokeRequest{
Targets: []apitxn.ProposalProcessor{p},
Fcn: "myFCN",
Args: []string{"myargs"},
TransientMap: map[string][]byte{},
ChaincodeID: "helloworld",
}
proposalResponse, _, err := ch.SendTransactionProposal(txRequest)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("%v\n", proposalResponse[0].ProposalResponse)
tx, err := ch.CreateTransaction(proposalResponse)
if err != nil {
fmt.Println(err)
return
}
txResponse, err := ch.SendTransaction(tx)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(txResponse[0])
这在所有 SDK 中都适用。
【讨论】: