我正在使用fabric-sample中的./byfn.sh脚本来启动我的区块链。 我想从区块链中调用和查询来自PHP网站的数据。
我知道我只能使用CLI容器中的API调用或使用JavaSDK / NodeSDK,RESTapi。
如何以最简单的方式查询区块链中的数据? 我正在看NodeSDK和RestApi,但我没有看到很多指南来帮助我,因此这个问题。 对不起新手问题。
谢谢!
答案 0 :(得分:4)
调用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。