怎么进行区块链中的fabric chaincode分析
发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,本篇文章为大家展示了怎么进行区块链中的fabric chaincode分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。chaincode是所有区块链项目的核
千家信息网最后更新 2025年02月02日怎么进行区块链中的fabric chaincode分析
本篇文章为大家展示了怎么进行区块链中的fabric chaincode分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
chaincode是所有区块链项目的核心,无论是公链还是私链。
fabric 如何形成chaincode, 下图是fabric chaincode 的核心模块组成
GenerateDockerfile 是生成chaincode dockerfile的函数
func (carPlatform Platform) GenerateDockerfile(cds pb.ChaincodeDeploymentSpec) (string, error) {
var buf []string
//let the executable's name be chaincode ID's name
buf = append(buf, "FROM "+cutil.GetDockerfileFromConfig("chaincode.car.runtime"))
buf = append(buf, "ADD binpackage.tar /usr/local/bin")
dockerFileContents := strings.Join(buf, "\n")
return dockerFileContents, nil
}
构建镜像函数
func (carPlatform *Platform) GenerateDockerBuild(cds *pb.ChaincodeDeploymentSpec, tw *tar.Writer) error {
// Bundle the .car file into a tar stream so it may be transferred to the builder container
codepackage, output := io.Pipe()
go func() {
tw := tar.NewWriter(output)
err := cutil.WriteBytesToPackage("codepackage.car", cds.CodePackage, tw)
tw.Close()
output.CloseWithError(err)
}()
binpackage := bytes.NewBuffer(nil)
err := util.DockerBuild(util.DockerBuildOptions{
Cmd: "java -jar /usr/local/bin/chaintool buildcar /chaincode/input/codepackage.car -o /chaincode/output/chaincode",
InputStream: codepackage,
OutputStream: binpackage,
})
if err != nil {
return fmt.Errorf("Error building CAR: %s", err)
}
return cutil.WriteBytesToPackage("binpackage.tar", binpackage.Bytes(), tw)
}
创建容器并上传
func DockerBuild(opts DockerBuildOptions) error {
client, err := cutil.NewDockerClient()
if err != nil {
return fmt.Errorf("Error creating docker client: %s", err)
}
if opts.Image == "" {
opts.Image = cutil.GetDockerfileFromConfig("chaincode.builder")
if opts.Image == "" {
return fmt.Errorf("No image provided and \"chaincode.builder\" default does not exist")
}
}
logger.Debugf("Attempting build with image %s", opts.Image)
//-----------------------------------------------------------------------------------
// Ensure the image exists locally, or pull it from a registry if it doesn't
//-----------------------------------------------------------------------------------
_, err = client.InspectImage(opts.Image)
if err != nil {
logger.Debugf("Image %s does not exist locally, attempt pull", opts.Image)
err = client.PullImage(docker.PullImageOptions{Repository: opts.Image}, docker.AuthConfiguration{})
if err != nil {
return fmt.Errorf("Failed to pull %s: %s", opts.Image, err)
}
}
//-----------------------------------------------------------------------------------
// Create an ephemeral container, armed with our Env/Cmd
//-----------------------------------------------------------------------------------
container, err := client.CreateContainer(docker.CreateContainerOptions{
Config: &docker.Config{
Image: opts.Image,
Env: opts.Env,
Cmd: []string{"/bin/sh", "-c", opts.Cmd},
AttachStdout: true,
AttachStderr: true,
},
})
if err != nil {
return fmt.Errorf("Error creating container: %s", err)
}
defer client.RemoveContainer(docker.RemoveContainerOptions{ID: container.ID})
//-----------------------------------------------------------------------------------
// Upload our input stream
//-----------------------------------------------------------------------------------
err = client.UploadToContainer(container.ID, docker.UploadToContainerOptions{
Path: "/chaincode/input",
InputStream: opts.InputStream,
})
if err != nil {
return fmt.Errorf("Error uploading input to container: %s", err)
}
//-----------------------------------------------------------------------------------
// Attach stdout buffer to capture possible compilation errors
//-----------------------------------------------------------------------------------
stdout := bytes.NewBuffer(nil)
_, err = client.AttachToContainerNonBlocking(docker.AttachToContainerOptions{
Container: container.ID,
OutputStream: stdout,
ErrorStream: stdout,
Logs: true,
Stdout: true,
Stderr: true,
Stream: true,
})
if err != nil {
return fmt.Errorf("Error attaching to container: %s", err)
}
//-----------------------------------------------------------------------------------
// Launch the actual build, realizing the Env/Cmd specified at container creation
//-----------------------------------------------------------------------------------
err = client.StartContainer(container.ID, nil)
if err != nil {
return fmt.Errorf("Error executing build: %s \"%s\"", err, stdout.String())
}
//-----------------------------------------------------------------------------------
// Wait for the build to complete and gather the return value
//-----------------------------------------------------------------------------------
retval, err := client.WaitContainer(container.ID)
if err != nil {
return fmt.Errorf("Error waiting for container to complete: %s", err)
}
if retval > 0 {
return fmt.Errorf("Error returned from build: %d \"%s\"", retval, stdout.String())
}
//-----------------------------------------------------------------------------------
// Finally, download the result
//-----------------------------------------------------------------------------------
err = client.DownloadFromContainer(container.ID, docker.DownloadFromContainerOptions{
Path: "/chaincode/output/.",
OutputStream: opts.OutputStream,
})
if err != nil {
return fmt.Errorf("Error downloading output: %s", err)
}
return nil
}
上述内容就是怎么进行区块链中的fabric chaincode分析,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。
区块
分析
内容
函数
技能
核心
知识
简明
简明扼要
下图
容器
就是
文章
更多
模块
篇文章
行业
资讯
资讯频道
还是
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
数据库概论及实例相关子查询
触屏服务器
网络技术学平面设计吗
ios和安卓通用服务器
欧柏泰克互联网科技产业园
江苏创科网络技术有限公司
河北上门软件开发条件
网络安全三天的实训报告
3ds联网服务器维护
建立数据库录入查询系统
计算机网络技术要用什么软件
衢州网络安全网
大学生网络安全教育论文结尾
泰拉瑞亚联机注册服务器
数据库表怎么看约束
中国做服务器最大的公司
网络安全监察部门作用
电子科技互联网小说
公安服务器管理规定
河北超频服务器供应
数据库联级
天融信 安全日志服务器搭建
电脑停电网络安全
12dora的服务器
3ds联网服务器维护
软件开发周旭
电脑如何关闭网络安全设置
网上招聘软件开发是真的吗
洱海遥感数据库项目
提高幼儿网络安全教育方案