本文以住房租賃積分管理系統(tǒng)為例,給大家演示CLOUD左邊ID右邊E如何編譯調(diào)試solidity智能合約,并以此為例,給大家分享以太坊SOL左邊ID右邊ITY跟螞蟻區(qū)塊鏈SOL左邊ID右邊ITY語言的差異點(diǎn)。
基于區(qū)塊鏈智能合約的住房租賃積分管理系統(tǒng)旨在有效地服務(wù)于公眾群體、市民,真正讓那些為城市當(dāng)前發(fā)展做出努力的人有房住、租得起,讓那些為城市建設(shè)長遠(yuǎn)發(fā)展做出貢獻(xiàn)的人有房產(chǎn)、買得起。為此,建立住房租賃積分制度,從住房租賃市場主體屬性、政策激勵、租賃行為三方面,運(yùn)用區(qū)塊鏈、大數(shù)據(jù)等前沿技術(shù),建立科學(xué)、有效的住房租賃積分全生命周期管理機(jī)制,營造活力、健康、有序、可持續(xù)的住房租賃生態(tài)。
通過使用區(qū)塊鏈平臺作為底層數(shù)據(jù)支撐,確保隱私保護(hù)和數(shù)據(jù)不可篡改,達(dá)到公平、公正、透明的目的;利用積分決策引擎,結(jié)合住房租賃積分評價(jià)體系,產(chǎn)出應(yīng)用于住房租賃場景的綜合積分方案。該方案具備橫向擴(kuò)展性,在底層技術(shù)、數(shù)據(jù)不變的基礎(chǔ)上,未來能夠支撐經(jīng)濟(jì)信用積分、綠色生活積分等諸多積分體系的建設(shè),從而擴(kuò)展形成城市信用體系,應(yīng)用于如醫(yī)療教育、金融借貸、綠色生活等諸多場景。
在住房租賃積分管理系統(tǒng)中,主要分為4種角色,分別是管理者、操作者、觀察者以及市民。管理者、操作者、觀察者是智能合約的操作人員,每個角色可以對應(yīng)多名人員。市民是租賃積分智能合約服務(wù)的對象,是整個智能合約的核心用戶。
角色操作權(quán)限
管理者是合約的超級管理員,能夠?qū)芾碚摺⒉僮髡咭约坝^察者進(jìn)行添加、刪除、查詢操作。操作者可以查詢操作者信息。觀察者可以查詢觀察者信息。
積分操作權(quán)限
管理者:具有積分獎勵、積分查詢、積分轉(zhuǎn)移、積分違規(guī)扣除、積分權(quán)益兌換等積分操作權(quán)限。操作者:操作者是由管理者設(shè)置的積分操作角色,該角色可以是具體的人員也可以是系統(tǒng)服務(wù),具有積分獎勵、積分轉(zhuǎn)移、積分違規(guī)扣除、積分權(quán)益兌換等積分操作權(quán)限。觀察者:觀察者是由管理者設(shè)置的積分查詢角色,該角色可以是具體的人員也可以是系統(tǒng)服務(wù),具有積分查詢的操作權(quán)限。市民:市民是住房租賃積分系統(tǒng)的用戶,是住房租賃積分系統(tǒng)的實(shí)際權(quán)益對象。
市民可以通過組織機(jī)構(gòu)的租賃積分外部服務(wù)系統(tǒng)代理的觀察者權(quán)限查看自己的積分狀況。租賃積分外部服務(wù)系統(tǒng)會根據(jù)市民的合規(guī)表現(xiàn),通過操作者的權(quán)限進(jìn)行積分獎勵或積分違規(guī)扣除。市民可以通過租賃積分外部服務(wù)系統(tǒng)代理的操作者權(quán)限進(jìn)行積分權(quán)益兌換或積分轉(zhuǎn)移操作。
租賃積分智能合約提供的服務(wù)方法包括積分獎勵、積分查詢、積分權(quán)益兌換、積分違規(guī)扣除、積分轉(zhuǎn)移以及積分達(dá)到閾值后觸發(fā)積分事件。
積分獎勵(awardScore)
在市民租賃房屋的過程中,針對租賃的時間、租賃過程中產(chǎn)生的行為,為市民進(jìn)行積分累計(jì)。
積分查詢(queryScore)
市民可通過租賃積分外部服務(wù)系統(tǒng)代理的觀察者權(quán)限查看自己的積分狀況。
積分權(quán)益兌換(exchangeScore)
市民的積分達(dá)到指定閾值后可以享有相應(yīng)的權(quán)益,如租房優(yōu)惠、買房資格、落戶資格等。
積分違規(guī)扣除(deductScore)
在市民租賃房屋的過程中,針對租賃過程中產(chǎn)生的錯誤行為,對市民懲罰性的扣減積分。住房租賃積分作為正向激勵的積分體系,鼓勵民眾積極向上。對于積分主體的偽造資料行為,視情節(jié)嚴(yán)重程度扣減積分、取消積分資格以及收回積分對應(yīng)的權(quán)益。
積分事件(SCORE_EQUITY_NOTICE)
當(dāng)積分權(quán)益實(shí)時增加時,會觸發(fā)積分權(quán)益檢查。若積分達(dá)到了指定的閾值,則會產(chǎn)生相應(yīng)的積分權(quán)益通知事件。通過外部服務(wù)系統(tǒng)通知到具體的市民。
積分轉(zhuǎn)移(transferScore)
當(dāng)市民因工作關(guān)系、家庭因素需要到其他城市生活時,可以將該城市的積分轉(zhuǎn)移到目標(biāo)城市的積分系統(tǒng)。為滿足該合約的調(diào)用,目標(biāo)合約需要有對應(yīng)的積分獎勵方法,且需要為發(fā)起合約提供操作權(quán)限,即將發(fā)起合約的地址設(shè)置為操作者或管理員。
參考《螞蟻區(qū)塊鏈第8課如何創(chuàng)建新的賬戶,獲取私鑰和identity標(biāo)識?》文章獲得輝哥需要的賬號的解密私鑰和identity。
角色定義如下,其中的私鑰已被輝哥篡改過了,防止被誤用。
因?yàn)槟壳?2019.04.06)螞蟻BAAS系統(tǒng)存在一個BUG,導(dǎo)致ella等賬號不能被用于智能合約部署,輝哥目前可使用的賬號只有test002和duncanwang賬號,輝哥在測試用例設(shè)計(jì)上做了一個小調(diào)整。
參考《螞蟻區(qū)塊鏈第5課如何配置Cloud左邊ID右邊E證書并進(jìn)行Solidity智能合約調(diào)試?》完成智能合約的編譯和部署,采用默認(rèn)的test002賬號。
【告警】在螞蟻BAAS系統(tǒng)中,相同的合約名稱只能使用一次。
如果該合約已部署,可按“已部署合約”根據(jù)已部署的智能合約名稱來調(diào)用合約。
賬號:test002
賬號identity:0xd6b1f9e8a0da740faa41b78eba7be9214cf96e7fed20
創(chuàng)建LeasingScoreManager,其合約identity:0x64d555c5cd319fe7ddd2eb1741a5d3c4386fac168eded5044
(1)管理員test002做賬戶設(shè)置操作
<1>管理員test002部署合約(上海合約)后增加自己為管理員
functionaddAdmin(identityadmin)publiconlyAdmin
addAdmin(0xd6b1f9e8a0da740faa41b78eba7be9214cf96e7fed20)
結(jié)果:
txhash:0x842c8da9fa0c1f356fcb0317ce5aca2edd8cd1a80
log:
VAL左邊ID右邊(bool,uint8):true,0
USER_EXIST(bool,uint8):false,0
<2>管理員test002增加操作員duncanwang
functionaddCalculator(identitycalculator)publiconlyAdmin
addCalculator(0x4983bcbaf60b9c90dc9d9a0b38a8931aad9a444acaa2adcbc61c5e3e218c49e1)
結(jié)果:
txhash:0xe68c2fadba293e95f803e511ba46e9e111ef1e44e685a2df2e2269b
log:
VAL左邊ID右邊(bool,uint8):true,0
USER_EXIST(bool,uint8):false,1
<3>管理員test002增加觀察員duncanwang
functionaddObserver(identityobserver)publiconlyAdmin
addObserver(0x4983bcbaf60b9c90dc9d9a0b38a8931aad9a444acaa2adcbc61c5e3e218c49e1)
結(jié)果:未記錄。
賬號切換到duncanwang賬號:
(2)操作員duncanwang給市民dingheng增加100積分,理由:在馬路上勇敢扶起一位摔倒的80歲老奶奶。
functionawardScore(bytes32player,uintscore,stringdescribe)
awardScore(“dingheng”,100,“理由:dingheng在馬路上勇敢扶起一位摔倒的80歲老奶奶。”)
輸出信息:
txhash:0x591daac5d038de4d9a3f437dd8aeeabbe3d5af2903ef122
log
VAL左邊ID右邊(bool,uint8):true,1
SCORE_OPERATOR(uint8,string):0,理由:dingheng在馬路上勇敢扶起一位摔倒的80歲老奶奶。
SCORE_EQUITY_NOTICE(string,uint256,string):RentConcessions,100,Citizensenjoya90%discountonrentalhousing
(3)操作員duncanwang收到市民dingheng申請,理由:需要租房1年,花費(fèi)80積分。
functionexchangeScore(bytes32player,uintscore,stringdescribe)publiconlyCalculatorOrAdminreturns(bool)
exchangeScore(“dingheng”,80,“理由:需要租房1年,花費(fèi)80積分。”)
輸出信息:
txhash:0xd7ce3c91a3b6e3cc4d6e4ad1bc05e5ba8dda81dbdc0b68a
log
VAL左邊ID右邊(bool,uint8):true,1
SCORE_OPERATOR(uint8,string):1,理由:需要租房1年,花費(fèi)80積分。
(4)操作員duncanwang發(fā)現(xiàn)市民dingheng房租到期后,未及時退租???0個積分,電話催丁恒來退租。
functiondeductScore(bytes32player,uintscore,stringdescribe)publiconlyCalculatorOrAdmin
deductScore(“dingheng”,10,“理由:dingheng房租到期后,未及時退租???0個積分。”)
輸出信息:
txhash:0x970e9ad61dfd9e264cd1bd12ca0d8426d1bbe9a178b0ec88d82d6a30ec2c5c99
log:
VAL左邊ID右邊(bool,uint8):true,1
SCORE_OPERATOR(uint8,string):2,理由:dingheng房租到期后,未及時退租???0個積分。
螞蟻區(qū)塊鏈合約平臺基本支持Solidity所有的數(shù)據(jù)類型,但是對于一些用戶編寫的合約的輸入?yún)?shù)類型并沒有完全的支持,比如參數(shù)輸入中二維數(shù)組的輸入。同時,螞蟻區(qū)塊鏈合約平臺提供了identity類型來標(biāo)注每一個用戶的身份,不支持原生Solidity中的address類型,identity的長度為32字節(jié)。
螞蟻BAAS的identity就是賬號名稱的SHA256算法產(chǎn)生的32字節(jié)內(nèi)容。
例如,在站長工具網(wǎng)站中輸入賬號名字duncanwang,獲得其identity為0x4983bcbaf60b9c90dc9d9a0b38a8931aad9a444acaa2adcbc61c5e3e218c49e1
更多信息,可查看Solidity官網(wǎng)關(guān)于類型的文檔(英文)。
螞蟻區(qū)塊鏈合約平臺支持的Solidity語法基本與官方文檔一致,具體語法介紹可參看Solidity官方文檔(英文)。
本文主要介紹Solidity合約函數(shù)構(gòu)造的常用權(quán)限關(guān)鍵字和修飾關(guān)鍵字。
螞蟻區(qū)塊鏈合約平臺為合約開發(fā)者提供一些新的特性接口支持,包括對區(qū)塊數(shù)據(jù)獲取、交易數(shù)據(jù)獲取、加密方法的支持。
block.blockhash(uintblockNumber)returns(bytes32):傳入,返回塊的哈希值。block.gaslimit(uint):系統(tǒng)中的gas最大值。block.number(uint):當(dāng)前塊高度。block.timestamp(uint):當(dāng)前區(qū)塊創(chuàng)建的時間戳。now(uint):的別名。
msg.data(bytes):用戶的輸入數(shù)據(jù)。msg.gas(uint):用戶交易中的gas值。msg.sender(identity):用戶交易中的發(fā)送方。msg.sig(bytes4):用戶交易輸入數(shù)據(jù)的前四字節(jié)。msg.value(uint):用戶交易中的gas值。
螞蟻區(qū)塊鏈合約平臺還支持查詢交易哈希,示例如下:
可通過此方法獲取當(dāng)前交易的哈希值。
【告警】不支持TOKEN,不支持地址相關(guān)的轉(zhuǎn)賬函數(shù)了。
.balance(uint256):以Wei為單位的地址類型的余額。.transfer(uint256amount):向地址類型發(fā)送數(shù)量為amount的Wei,失敗時拋出異常,發(fā)送2300gas的礦工費(fèi),不可調(diào)節(jié)。.send(uint256amount)returns(bool):向地址類型發(fā)送數(shù)量為amount的Wei,失敗時返回false,發(fā)送2300gas的礦工費(fèi)用,不可調(diào)節(jié)。.call(...)returns(bool):發(fā)出低級函數(shù)CALL,失敗時返回false,發(fā)送所有可用gas,可調(diào)節(jié)。.callcode(...)returns(bool):發(fā)出低級函數(shù)CALLCODE,失敗時返回false,發(fā)送所有可用gas,可調(diào)節(jié)。.delegatecall(...)returns(bool):發(fā)出低級函數(shù)DELEGATECALL,失敗時返回false,發(fā)送所有可用gas,可調(diào)節(jié)。
螞蟻區(qū)塊鏈合約平臺主要支持兩種合約調(diào)用方式,分別為和。
類型的合約調(diào)用主要是通過調(diào)用其他合約代碼獲取某個方法的調(diào)用結(jié)果。同時,在執(zhí)行該合約時,被調(diào)用合約的變量會被修改(即修改的是被調(diào)用合約的內(nèi)存),調(diào)用執(zhí)行成功時返回true,失敗則返回false。如果被調(diào)用合約不存在,則返回執(zhí)行調(diào)用合約的函數(shù)。
函數(shù)原型
請求參數(shù)
參數(shù)必選類型說明id是identity被調(diào)用合約左邊ID右邊data是string被調(diào)用合約方法簽名args是var被調(diào)用合約方法傳入?yún)?shù)
返回值
參數(shù)必選類型說明result是bool方法返回值,成功為true,否則為false。
類型的合約調(diào)用也是調(diào)用其他合約的方法,與不同的是,修改的是合約調(diào)用方的內(nèi)存。此方法的主要目的在于讓合約能夠在不傳輸自身狀態(tài)(如、)的情況下使用其他合約的代碼。不支持傳輸value。
函數(shù)原型
請求參數(shù)
參數(shù)必選類型說明id是identity被調(diào)用合約左邊ID右邊data是string被調(diào)用合約方法簽名args是var被調(diào)用合約方法傳入?yún)?shù)
返回值
參數(shù)必選類型說明result是bool方法返回值,成功為true,否則為false。
(1)Solidity合約開發(fā)
(2)Solidity官方中文文檔