广州列举网 > 商务服务 > 网站/软件服务 > BSC链智能合约系统开发搭建
广州
[切换城市]

BSC链智能合约系统开发搭建

更新时间:2022-12-21 09:59:31 浏览次数:74次
区域: 广州 > 白云 > 同和
类别:网站推广
地址:天河区珠村
  智能合约【I8I佛萨奇2591开发源码3365】【飞机Lyr962464】是运行在区块链网络上的一种承诺协议,它有如下特性:一旦执行则无法撤销和修改;一切写入记录皆可查询,无法造假;合约双方仅以链上地址表达身份,具备匿名性。

  开发语言和开发环境

  智能合约采用solidity语言开发,其语法类似Typescript,因此较为适合前端开发人员上手,很多大学都有JavaScript基础课,所以也较为适合大学生入门。

  合约和Dapp示例。在Github上搜索DApp仓库和.sol文件可以看到进行中的有趣东西。这里有一个DApp大列表:dapps.ether***

  ***d/contracts上有一些Solidity和Serpent写的合约示例,但是不清楚这些例子有没有经过测试或者正确性验证。

  部署智能合约的流程

  流程如下:

  启动一个以太坊节点(例如geth或者testrpc)。

  使用solc编译智能合约。=>获得二进制代码。

  将编译好的合约部署到网络。(这一步会消耗以太币,还需要使用你的节点的默认地址或者指定地址来给合约签名。)=>获得合约的区块链地址和ABI(合约接口的JSON表示,包括变量,事件和可以调用的方法)。​​​​

  package main import("fmt""strconv""chainmaker/pb/protogo""chainmaker/shim")//AgeContract save and get age type AgeContract struct{}//InitContract合约初始化方法,会在合约部署到链上时执行func(ac*AgeContract)InitContract(stub shim.CMStubInterface)protogo.Response{return shim.Success([]byte("Init Success"))}//InvokeContract调用合约,在链上执行合约时,实际调用的是这个方法func(ac*AgeContract)InvokeContract(stub shim.CMStubInterface)protogo.Response{//获取要调用的合约方法method:=string(stub.GetArgs()["method"])//case"***"关联方法名"***"到ac.***switch method{case"saveAge":return ac.saveAge(stub)case"getAge":return ac.getAge(stub)case"crossCall":return ac.crossCall(stub)case"historyKvIterator":return ac.historyKvIterator(stub)default:return shim.Error("no contarct method")}}//saveAge保存用户年龄信息func(ac*AgeContract)saveAge(stub shim.CMStubInterface)protogo.Response{//获取所有的合约参数args:=stub.GetArgs()name:=string(args["name"])ageStr:=string(args["age"])if name==""||ageStr==""{message:="name or age is empty"//打印日志,调试合约时,日志会在控制台输出中展示stub.Log(message)//返回合约执行错误信息return shim.Error(message)}_,err:=strconv.Atoi(ageStr)if err!=nil{message:="convert age to int fail.err:"+err.Error()//打印日志,调试合约时,日志会在控制台输出中展示stub.Log(message)//返回合约执行错误信息return shim.Error(message)}//保存用户年龄信息到链上err=stub.PutStateFromKey(name,ageStr)if err!=nil{message:="put state from key fail.err:"+err.Error()//打印日志,调试合约时,日志会在控制台输出中展示stub.Log(message)//返回合约执行错误信息return shim.Error(message)}//返回合约执行成功信息return shim.Success([]byte("success"))}//getAge获取用户年龄信息func(ac*AgeContract)getAge(stub shim.CMStubInterface)protogo.Response{//获取所有的合约参数args:=stub.GetArgs()name:=string(args["name"])if name==""{message:="name is empty"//打印日志,调试合约时,日志会在控制台输出中展示stub.Log(message)//返回合约执行错误信息return shim.Error("-1")}ageStr,err:=stub.GetStateFromKey(name)if err!=nil{message:="get state from key fail.err:"+err.Error()//打印日志,调试合约时,日志会在控制台输出中展示stub.Log(message)//返回合约执行错误信息return shim.Error("-1")}if ageStr==""{message:="age not found"//打印日志,调试合约时,日志会在控制台输出中展示stub.Log(message)//返回合约执行错误信息return shim.Error("-1")}//返回用户年龄return shim.Success([]byte(ageStr))}//crossCall跨合约调用func(ac*AgeContract)crossCall(stub shim.CMStubInterface)protogo.Response{//要调用的合约的基本信息contractName:="age_contract"contractVersion:="1.0.0"calledMethod:="getAge"//跨合约调用的参数crossContractArgs:=make(map[string][]byte)crossContractArgs["method"]=[]byte(calledMethod)crossContractArgs["name"]=[]byte("Bob")//开合约调用响应信息response:=stub.CallContract(contractName,contractVersion,crossContractArgs)stub.EmitEvent("cross contract",[]string{"success"})return response}//historyKvIterator历史迭代器func(ac*AgeContract)historyKvIterator(stub shim.CMStubInterface)protogo.Response{key:="Bob"//创建历史迭代器result,err:=stub.NewHistoryKvIterForKey(key,"")if err!=nil{msg:="failed to call get_state"stub.Log(msg+""+err.Error())return shim.Error(msg)}//判断迭代器是否有数据,如果有迭代输出数据for result.HasNext(){v,err:=result.Next()if err!=nil{msg:="failed to call iterator"stub.Log(msg+""+err.Error())return shim.Error(msg)}stub.Log(fmt.Sprintf("NewHistoryKvIterForKey%vn",v))}return shim.Success([]byte("success"))}func main(){//运行合约err:=shim.Start(new(AgeContract))if err!=nil{panic(err)}}

  3.5.编写合约注意事项

  合约工程目录下必须有一个main.go,且main.go的包名需要是main,合约的入口需要在main.go中,且InvokeContract()方法代码需要在main.go中。即:

  package main import("chainmaker/pb/protogo""chainmaker/shim")............//调用合约方法func(f*AgeContract)InvokeContract(stub shim.CMStubInterface)protogo.Response{//获取要调用的合约方法method:=string(stub.GetArgs()["method"])//case"saveAge"关联方法名"saveAge"到f.saveAge()//case"getAge"关联方法名"getAge"到f.getAge()switch method{case"saveAge":return f.saveAge(stub)case"getAge":return f.getAge(stub)default:return shim.Error("no contarct method")}}//合约入口func main(){//运行合约err:=shim.Start(new(AgeContract))if err!=nil{panic(err)}}

  InvokeContract里面关联方法逻辑需要是如下模式(合约调试会根据下面的模式解析方法名)。注意不要在case后面使用定义的常量。

  switch method{case"字符串":......case"字符串":......default:return shim.Error("no contarct method")}

  不能使用全局变量。在编写合约时,不要使用全局变量来存储数据,数据的存储可以直接存到链上,用getState和putState等方法存储。

  不支持在合约工程内创建内嵌的go module。
广州网站/软件服务相关信息
1天前
2天前
3天前
3天前
4月23日
4月23日
注册时间:2020年05月15日
UID:693134
---------- 认证信息 ----------
手机已认证
查看用户主页