Quantstamp是一款智慧合約安全審計系統,具有可擴充套件且經濟高效的方式。 我將Quantstamp合約表達為Javascript以便更好地理解。
Quantstamp概述
智慧合約安全對於防止像DAO這樣的安全事件至關重要。 不幸的是,當前的智慧合約驗證流程需要人工專家,因此它很昂貴且容易出錯。 Quantstamp透過在以太坊網路上構建審計系統解決了這個問題。
開發人員透過與QST令牌簽訂的quantstamp合同提交程式碼,驗證人員將其作為獎勵。驗證節點(由QuantStamp限定)接收提交的請求並執行安全檢查。此檢查是鏈外活動,由安全審計引擎完成。
該安全審計引擎是由安全庫等幾個元件組成。 同時安全庫會不斷完善功能以應對新的漏洞出現。 驗證節點會將報告新增到下一個以太坊區塊中。 此報告可以選擇是公開的或私人的。 每個人都閱讀公開的審計報告,而私人報告會被加密。
QST狀態轉換
審計過程中,很少有像上圖那樣的狀態。這次我們這次的重點是紅線的狀態。此轉換是一個成功審計的過程。我們分成三個步驟:
開發人員請求稽覈
驗證節點獲取稽覈請求
驗證節點提交報告
開發人員請求稽覈
開發人員透過呼叫QuantstampAudit.sol的'requestAudit'函式提交'Samp'合同,並支付10個QST進行驗證。 該合同包含審計過程的所有邏輯。
檢視requestaudit函式的“requestid”。這是唯一的ID。
順便說一下,請求儲存在另一個名為“quantsampAudit.sol”的合同中。這是一份倉儲合同。
developer.run(function() {
// Create a contract to be audit
Samp = new Sample();
// Cost of verification
const cost = 10;
...
// Request audit
requestId = QSTAudit.requestAudit(Samp.address, cost);
});
/********** QuantstampAudit.sol **********/
requestAudit(contractUri, price) {
...
const requestId = this.auditData.addAuditRequest(
from, contractUri, price);
// Add request to queue
this.queueAuditRequest(requestId);
return requestId;
}
請求的結構如下。
classAudit{
...
{
this.requestor = requestor;
this.contractUri = contractUri;
this.price = price;
this.requestBlockNumber = requestBlockNumber;
this.state = state;
this.auditor = auditor;
this.assignBlockNumber = assignBlockNumber;
this.reportHash = reportHash;
this.reportBlockNumber = reportBlockNumber;
this.registrar = registrar;
}
}
驗證節點獲得稽覈請求
驗證節點呼叫'getNextAuditRequest'函式。 然後,從佇列中獲取稽覈。
請注意,獲取的稽覈價格必須高於最低價格(每個驗證節點都是唯一的)。
validator.run(function() {
// Get audit request
QSTAudit.getNextAuditRequest();
});
/********** QuantstampAudit.sol **********/
getNextAuditRequest() {
...
// there are no audits in the queue with a price high enough
// for the audit node
const minPrice = this.auditData.getMinAuditPrice(msg.sender);
const requestId = this.dequeueAuditRequest(minPrice);
if (requestId === 0) return;
// Update storage contract
this.auditData.setAuditState(requestId, AuditState.Assigned);
this.auditData.setAuditAuditor(requestId, from);
this.auditData.setAuditAssignBlockNumber(requestId, block.number);
...
// push to the tail
this.assignedAudits.push(requestId);
}
驗證節點提交報告
驗證節點提交一個附加雜湊的合同報告。 請注意,驗證節點必須在稽覈超時前提交報告。
最後,驗證器獲得QST令牌作為獎勵,並且驗證開發者建立的合同是安全的。
validator.run(function() {
// Report hash -> Following creation is not real
const reportHash = CryptoJS.RIPEMD160(
CryptoJS.SHA256(JSON.stringify(Samp))).toString();
// Submit report
QSTAudit.submitReport(
requestId, AuditState.Completed, reportHash);
});
/********** QuantstampAudit.sol **********/
submitReport(requestId, auditResult, reportHash) {
...
const allowanceBlockNumber =
this.auditData.getAuditAssignBlockNumber(requestId) +
this.auditData.auditTimeoutInBlocks;
// auditor should not send a report after its allowed period
if (allowanceBlockNumber < block.number) {
// update assigned to expired state
this.auditData.setAuditState(requestId, Expired);
return;
}
// update the audit information held in this contract
this.auditData.setAuditState(requestId, auditResult);
this.auditData.setAuditReportHash(requestId, reportHash);
this.auditData.setAuditReportBlockNumber(requestId, block.number);
...
// Validator get QST token as reward
this.auditData.token.transfer(from, auditPrice);
}