首页 \ 问答 \ 如何设计hyperledger链代码以适合您的业务?(how to design your chaincode of hyperledger to fit for your business?)

如何设计hyperledger链代码以适合您的业务?(how to design your chaincode of hyperledger to fit for your business?)

我正在关注链码开发指南: https//github.com/hyperledger/fabric/blob/07ea01124b2768ee04a6b30fe29a6395f6d3d819/docs/API/SandboxSetup.md

使用我的测试结果,在生产环境(不是开发环境,而不是--peer-chaincodedev)中,deploy方法的工作负载(如系统运行时和存储大小)远高于invoke方法。

如果测试结果是正确的,我认为部署方法的成本远高于调用方法。 超过1,000,000倍的成本。

在这样的成本情况下,我们应该做什么样的设计? 频率如何适合。

例如,我们应该如何避免调用deploy方法? 我们应该如何使用invoke方法替换deploy方法?


I am following chaincode development guide : https://github.com/hyperledger/fabric/blob/07ea01124b2768ee04a6b30fe29a6395f6d3d819/docs/API/SandboxSetup.md

With my test result, in production environment (not development environment, not --peer-chaincodedev ), the work load (such as system run time and storage size) of deploy method are much higher than invoke method.

If the test result is correct, I imagine the cost of deploy method are much higher than invoke method. more than 1,000,000 times of cost.

In such cost situation, what kinds of design should we do? how frequency is suitable.

for example, how should we avoid to call deploy method? how should we use invoke method to replace deploy method?


原文:https://stackoverflow.com/questions/37570667
更新时间:2019-12-13 07:40

最满意答案

  1. 部署一次,chaincode名称是更好的业务名称,而不是您的进程名称的情况。

func (t *Chaincode) Init(stub *shim.ChaincodeStub, function string, args []string) ([]byte, error) {
	var err error
	var Number string
	if len(args) != 1 {return nil, errors.New("sign Init Expecting 1 number of arguments.")}
	Number = args[0]
	err = stub.PutState(Number, []byte("01"))
	if err != nil {return nil, err}

	return nil, nil
}

  1. 使用invoke方法来避免新链代码的部署方法。

func (t *Chaincode) Invoke(stub *shim.ChaincodeStub, function string, args []string) ([]byte, error) {
	if function == "delete" {
		// Deletes an entity from its state
		return t.delete(stub, args)
	}
	
	if function == "newcontract" {
		// Deletes an entity from its state
		return t.delete(stub, args)
	}
	
	xxxxxxxxxxxxxxxxxxxx
	return nil, nil
}

func (t *SimpleChaincode) Query(stub *shim.ChaincodeStub, function string, args []string) ([]byte, error) {
	if function != "query" {
		return nil, errors.New("Invalid query function name. Expecting \"query\"")
	}
	
	xxxxxxxxxxxxxxxxxxxx
	return xxx, nil
}

// Deletes an entity from state

func (t *SimpleChaincode) delete(stub *shim.ChaincodeStub, args []string) ([]byte, error) {
	if len(args) != 1 {
		return nil, errors.New("Incorrect number of arguments. Expecting 1")
	}

	A := args[0]

	// Delete the key from the state in ledger
	err := stub.DelState(A)
	if err != nil {
		return nil, errors.New("Failed to delete state")
	}

	return nil, nil
}


  1. deploy once, chaincode name is better business name, not your case of process name.

func (t *Chaincode) Init(stub *shim.ChaincodeStub, function string, args []string) ([]byte, error) {
	var err error
	var Number string
	if len(args) != 1 {return nil, errors.New("sign Init Expecting 1 number of arguments.")}
	Number = args[0]
	err = stub.PutState(Number, []byte("01"))
	if err != nil {return nil, err}

	return nil, nil
}

  1. use invoke method to avoid deploy method of new chaincode.

func (t *Chaincode) Invoke(stub *shim.ChaincodeStub, function string, args []string) ([]byte, error) {
	if function == "delete" {
		// Deletes an entity from its state
		return t.delete(stub, args)
	}
	
	if function == "newcontract" {
		// Deletes an entity from its state
		return t.delete(stub, args)
	}
	
	xxxxxxxxxxxxxxxxxxxx
	return nil, nil
}

func (t *SimpleChaincode) Query(stub *shim.ChaincodeStub, function string, args []string) ([]byte, error) {
	if function != "query" {
		return nil, errors.New("Invalid query function name. Expecting \"query\"")
	}
	
	xxxxxxxxxxxxxxxxxxxx
	return xxx, nil
}

// Deletes an entity from state

func (t *SimpleChaincode) delete(stub *shim.ChaincodeStub, args []string) ([]byte, error) {
	if len(args) != 1 {
		return nil, errors.New("Incorrect number of arguments. Expecting 1")
	}

	A := args[0]

	// Delete the key from the state in ledger
	err := stub.DelState(A)
	if err != nil {
		return nil, errors.New("Failed to delete state")
	}

	return nil, nil
}

2016-08-03

相关文章

更多

最新问答

更多
  • 这个listArray是如何填充的?(How is this listArray populated?)
  • iOS 7上的CTSubscriber(以及如何使用它)是什么?(What's CTSubscriber (and how to use it) on iOS 7?)
  • 手动创建VisualStudio 2012项目文件(Manually creating VisualStudio 2012 project file)
  • 删除不适用于JSP中使用for循环的每个id(Deletion not working for every id using for loop in JSP)
  • 如何从std :: filesystem :: path中删除引号(How to remove quotation marks from std::filesystem::path)
  • 验证多个控制器方法的URL路径(Validate URL path for several controller methods)
  • 如何在datarow []中的列中找到最大值?(How to find max value in a column in a datarow[] ?)
  • 如何使用预定义文本替换来自数据库的部分结果(How do I replace part of result coming from Database with predefined text)
  • Selenium Java注入了新的Javascript函数(Selenium Java inject new Javascript function)
  • 使用.on的多个下拉菜单选择文本仅适用于第一个下拉列表(Multiple Dropdowns Menu Selection text using .on works only on first dropdown)
  • 快速将黄土曲线添加到大型数据集图中的方法(Quick way to add loess curve to large data set graph)
  • FilteringSelect in mvc(FilteringSelect in mvc)
  • 在Delphi XE2中开发Mac或iOS应用程序需要哪些硬件/软件?(What hardware/software is necessary to develop Mac or iOS apps in Delphi XE2?)
  • 在原型的构造函数中初始化属性时获取“未定义”(Getting 'undefined' when a property is initialized in the constructor of a prototype)
  • 通过越狱加载的应用程序的Documents文件夹位置(Location of Documents folder for an app loaded via jailbreak)
  • 在OpenGL中使用可编程和固定管道功能(Using both programmable and fixed pipeline functionality in OpenGL)
  • 将任何用户输入重定向到单独的底层程序(redirect any user input to a separate underlying program)
  • 编辑文本不能正常工作android(Edit texts not working properly android)
  • “user_denied”Facebook应用页面上的Facebook用户区域设置(Facebook user locale on “user_denied” facebook app page)
  • 在大图像中找到小的部分透明图像的坐标(find coordinates of small partially-transparent image within a large image)
  • 我如何在cakephp 3.1中获得完整的相对路径?(How i can get full relative path of image in cakephp 3.1?)
  • 如何保存拖动标记的新本地化?(How to save new localization of dragged marker?)
  • MySQL UPDATE vs INSERT和DELETE(MySQL UPDATE vs INSERT and DELETE)
  • 在执行查询之前,在SQLAlchemy模型中将datetime转换为unix时间戳?(Convert datetime to unix timestamp in SQLAlchemy model before executing query?)
  • OpenCL与OpenGL互操作的优势(Advantage of OpenCL interoperability with OpenGL)
  • 如何解析用点和等分隔的数据然后添加到listview(How to parsing data from delimited with dot and equal then add to listview)
  • 带调试输出的X3解析器段错误(BOOST_SPIRIT_X3_DEBUG)(X3 parser segfaults with debug output (BOOST_SPIRIT_X3_DEBUG))
  • 将文件夹名称添加到fgrep结果(Add folder name to fgrep result)
  • 在MySQL中加载一个表是非常慢的(Loading one table in MySQL is ridiculously slow)
  • 如何将JSON放入PHP变量?(How do I put JSON into a PHP Variable?)