1、Chaos智能合约测试案例计算机区块链ICO 合约案例说明1、 功能说明通过区块链智能合约项目 ico,用户可通过向智能合约里面发送区块链代币,合约会根据参与者的地址与参与金额,合约会自动把参与者发送的金额转到指定的地址,并给其参与者分配相应的权益份额,用于后续权益兑换。2、 合约开发部署流程A、 启动一个区块链节点/钱包B、编写智能合约代码代码如下:mylib = require mylibfunction Unpack(t, i) i = i or 1if ti thenreturn ti, Unpack(t, i + 1)endendfunction GetValueFromContra
2、ct(tbl, start, length) assert(start 0, GetValueFromContract start err) assert(length 0, GetValueFromContract length err) local newTab = local ifor i = 0, length - 1 do newTab1 + i = tblstart + iendreturn newTabendOPER_TYPE = ENUM_ADD_FREE = 1, ENUM_MINUS_FREE = 2APP_OPERATOR_TYPE = ENUM_ADD_FREE_OP
3、= 1, ENUM_SUB_FREE_OP = 2, ENUM_ADD_FREEZED_OP = 3, ENUM_SUB_FREEZED_OP = 4ADDR_TYPE = ENUM_REGID = 1, ENUM_BASE58 = 2local funs = - 众筹funs1 = function()local moneyTbl = mylib.GetCurTxPayAmount() local money = mylib.ByteToInteger(Unpack(moneyTbl) assert(money 0, invalid money num) print(金额:, money)l
4、ocal appRecharge = operatorType = APP_OPERATOR_TYPE.ENUM_ADD_FREE_OP, outHeight = 0, moneyTbl = moneyTbl, userIdLen = 34, userIdTbl = mylib.GetBase58Addr(mylib.GetCurTxAccount() , fundTagLen = 0, fundTagTbl = assert(mylib.WriteOutAppOperate(appRecharge), failed to zc)local appRecharge = operatorType
5、 = APP_OPERATOR_TYPE.ENUM_ADD_FREE_OP, outHeight = 0, moneyTbl = moneyTbl, userIdLen = 6, userIdTbl = mylib.GetScriptID() , fundTagLen = 0, fundTagTbl = assert(mylib.WriteOutAppOperate(appRecharge), failed to add app)local dataTbl = addrType = ADDR_TYPE.ENUM_REGID,operatorType = OPER_TYPE.ENUM_MINUS
6、_FREE, accountIdTbl = mylib.GetScriptID(),moneyTbl = moneyTbl, outHeight = 0assert(mylib.WriteOutput(dataTbl), failed to minus)local dataTbl2 = addrType = ADDR_TYPE.ENUM_BASE58, operatorType = OPER_TYPE.ENUM_ADD_FREE,accountIdTbl = 0x54, 0x46, 0x67, 0x47, 0x4d, 0x64, 0x65, 0x74, 0x37, 0x75, 0x43, 0x
7、70, 0x54, 0x36, 0x5a, 0x46, 0x4a, 0x67, 0x50, 0x6d, 0x43, 0x4b, 0x6e, 0x73, 0x6d, 0x39, 0x70, 0x41, 0x48, 0x33, 0x34, 0x5a, 0x4b, 0x6b,moneyTbl = moneyTbl, outHeight = 0assert(mylib.WriteOutput(dataTbl2), failed to add)end- 返回结果print(合约执行完成)return funscontract2 and funscontract2() or trueC、在智能合约界面部署
8、合约注意:这一步会消耗一定量的币,返回一个交易 ID,等到下一个区块产生后,可通过这个交易 ID 查询合约 ID,所有跟合约相关的操作都会用到这个合约 ID。部署:获取合约 ID:参与众筹:指定调用的智能合约,也就是之前得到的合约 ID,参与人的地址,参与金额,合约内容:ff01 表示参与众筹,点击创建,即会创建一笔合约交易,如果参与者有足够的金额,这笔交易会在下一个区块被确认。查询份额:通过合约 ID、地址,可查询参与 ico 所得份额,返回的 json 字符串,FreeValues为用户所持份额。流程图如下:证券发行合约案例说明1、功能说明:证券发行,资产冻结,分期解冻。3、 合约开发部署
9、流程:A、 启动一个区块链节点/钱包B、编写智能合约代码代码如下:mylib = require mylibLOG_TYPE =ENUM_STRING = 0, ENUM_NUMBER = 1, ;OPER_TYPE =ENUM_ADD_FREE = 1, ENUM_MINUS_FREE = 2 APP_OPERATOR_TYPE =ENUM_ADD_FREE_OP = 1, ENUM_SUB_FREE_OP = 2,ENUM_ADD_FREEZED_OP = 3, ENUM_SUB_FREEZED_OP = 4 ADDR_TYPE =ENUM_REGID = 1, ENUM_BASE58 =
10、 2, TX_TYPE =TX_WITHDRAW = 1, TX_RECHARGE = 2, FREEZE_MONTH_NUM = 20 FREEZE_PERIOD = 5MAX_MONEY = 100000000000000000 FREE_MONEY = 10000000000000000 gCheckAccount = truegSendAccountTbl = 0x00, 0x00, 0x00, 0x00, 0x01, 0x00function TableIsEmpty(t) return _G.next(t) = nilendfunction TableIsNotEmpty(t) r
11、eturn false = TableIsEmpty(t)endfunction LogPrint(aKey, bLength, cValue) assert(bLength = 1, LogPrint bLength invlaid) if (aKey = LOG_TYPE.ENUM_STRING) thenassert(type(cValue) = string, LogPrint cValue invlaid0) elseif (aKey = LOG_TYPE.ENUM_NUMBER) thenassert(TableIsNotEmpty(cValue), LogPrint cValue
12、 invlaid1)elseerror(LogPrint aKey invlaid)endlocal logTable = key = LOG_TYPE.ENUM_STRING, length = 0,value = nillogTable.key = aKey logTable.length = bLength logTable.value = cValue mylib.LogPrint(logTable)endfunction Unpack(t, i) i = i or 1if ti thenreturn ti, Unpack(t, i + 1)endendfunction MemCmp(
13、tDest, tSrc, start1)assert(TableIsNotEmpty(tDest), tDest is empty) assert(TableIsNotEmpty(tSrc), tSrc is empty) local ifor i = #tDest, 1, -1 doif tDesti tSrci + start1 - 1 then return 1elseif tDesti 0, GetValueFromContract start err) assert(length 0, GetValueFromContract length err) local newTab = l
14、ocal ifor i = 0, length - 1 do newTab1 + i = tblstart + iendreturn newTabendfunction Recharge()local toAddrTbl = toAddrTbl = GetValueFromContract(contract, 3, 34) local moneyTbl = moneyTbl = GetValueFromContract(contract, 37, 8) local money = mylib.ByteToInteger(Unpack(moneyTbl) assert(money 0, mone
15、y 0, freeMoney 0, freeMonthMoney 0, payMoney = 0)assert(money = payMoney, 充值金额不正确 1) if money 1or money freeMoneyor money = MAX_MONEYor freeMoney = FREE_MONEYor freeMonthMoney = FREE_MONEY then LogPrint(LOG_TYPE.ENUM_STRING, string.len(充值金额不正确 3), 充值金额不正确 3);error(充值金额不正确 3)endlocal freezeNum = FREE
16、ZE_MONTH_NUM - 1 assert(freezeNum 0, 月冻结总数不正确)local freezeMoney = freeMonthMoney * freezeNum if freezeMoney freezeNumor freezeMoney freeMoney or money 0, Account balance is 0.)local appOperateTbl = operatorType = 0, outHeight = 0, moneyTbl = ,userIdLen = 0, userIdTbl = , fundTagLen = 0,fundTagTbl =
17、appOperateTbl.operatorType = APP_OPERATOR_TYPE.ENUM_SUB_FREE_OP appOperateTbl.userIdLen = idTbl.idLenappOperateTbl.userIdTbl = idTbl.idValueTbl appOperateTbl.moneyTbl = freeMoneyTblassert(mylib.WriteOutAppOperate(appOperateTbl), WriteOutAppOperate err1) assert(WriteWithdrawal(accountTbl, freeMoneyTb
18、l), WriteWithdrawal err)return trueendfunction Main()assert(#contract = 2, contract length err.) assert(contract1 = 0xff, Contract identification error.)if contract2 = TX_TYPE.TX_RECHARGE then assert(#contract = 60, recharge contract length err.) Recharge()elseif contract2 = TX_TYPE.TX_WITHDRAW then assert(#contract = 11, withdraw contract length err.) Withdraw(contract3)elseerror(RUN_SCRIPT_DATA_ERR
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1