區塊鏈研究實驗室 | 如何利用Quantstamp將智慧合約轉換為JavaScript進行安全審計

買賣虛擬貨幣

Quantstamp是一款智慧合約安全審計系統,具有可擴充套件且經濟高效的方式。 我將Quantstamp合約表達為Javascript以便更好地理解。

Quantstamp概述

智慧合約安全對於防止像DAO這樣的安全事件至關重要。 不幸的是,當前的智慧合約驗證流程需要人工專家,因此它很昂貴且容易出錯。 Quantstamp透過在以太坊網路上構建審計系統解決了這個問題。

開發人員透過與QST令牌簽訂的quantstamp合同提交程式碼,驗證人員將其作為獎勵。驗證節點(由QuantStamp限定)接收提交的請求並執行安全檢查。此檢查是鏈外活動,由安全審計引擎完成。

該安全審計引擎是由安全庫等幾個元件組成。 同時安全庫會不斷完善功能以應對新的漏洞出現。 驗證節點會將報告新增到下一個以太坊區塊中。 此報告可以選擇是公開的或私人的。 每個人都閱讀公開的審計報告,而私人報告會被加密。

QST狀態轉換

審計過程中,很少有像上圖那樣的狀態。這次我們這次的重點是紅線的狀態。此轉換是一個成功審計的過程。我們分成三個步驟:

  1. 開發人員請求稽覈

  2. 驗證節點獲取稽覈請求

  3. 驗證節點提交報告

開發人員請求稽覈

開發人員透過呼叫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 === 0return;
// 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);

}

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;