blockchain - InternalCompilerError:堆栈太深,尝试使用更少的变量
问题描述
pragma solidity ^0.5.0;
contract Etender{
//--------------------------- admin ----------------------------------------------------------------------
address payable private owner;
constructor()public{
owner = msg.sender;
}
//------------------------------Tender------------------------------------------------------
struct tender {
uint tenderId;
string tenderName;
string tenderSector;
string tenderLocation;
string open;
string close;
string tenderCategory;
string prequalification;
uint tenderValue;
bool status;
}
uint tid ;
mapping(uint =>tender) private tenders;
//-------------------------------Bidder--------------------------------------------------
struct bidder {
uint organisationId;
string organisationName;
address add;
string pan;
string bidderType;
string city;
string state;
uint postalCode;
string companyCategory;
string natureOfBusiness;
}
uint bid;
mapping(uint =>bidder) private bidders;
mapping(address =>bool) private isRegistered;
mapping(address => mapping(uint =>bool) )private isBidded;
mapping(address =>bool) private isVerified;
mapping(address =>uint) private bidderId;
// ------------------------------winner ---------------------------------------------------
struct win {
address winner;
uint bidAmount;
uint tenderId;
}
mapping(uint =>win) private winner;
//------------------------All bidding details ---------------------------------------------------
struct allBidding {
address bidder;
uint bidAmount;
uint tenderId;
}
uint biddingCount;
mapping(uint =>allBidding) private allBiddings;
// ----------------------------- create tender function ------------------------------------
function createTender(string memory _name , string memory _sector ,string memory _location ,
string memory _open , string memory _close ,string memory _catagory ,string memory _prequalification,
uint _value ) public {
tenders[tid].tenderId = tid;
tenders[tid].tenderName = _name;
tenders[tid].tenderSector = _sector;
tenders[tid].tenderLocation = _location;
tenders[tid].open = _open;
tenders[tid].close = _close;
tenders[tid].tenderCategory = _catagory;
tenders[tid].prequalification = _prequalification ;
tenders[tid].tenderValue = _value ;
tenders[tid].status = true ;
tid++;
}
//---------------------------------- create bidders ------------------------------------
function createBidder(string memory _name ,string memory _pan , string memory _type ,
string memory _city, string memory _state , uint _postalcode , string memory _companyCatagory ,
string memory _nature) public {
bidders[bid].organisationId = bid ;
bidders[bid].organisationName = _name;
bidders[bid].add = msg.sender;
bidders[bid].pan = _pan;
bidders[bid].bidderType = _type;
bidders[bid].city = _city ;
bidders[bid].state = _state ;
bidders[bid].postalCode = _postalcode;
bidders[bid].companyCategory = _companyCatagory;
bidders[bid].natureOfBusiness = _nature;
bid++;
bidderId[msg.sender] = bid ;
isRegistered[msg.sender] = true;
}
//-------------------------- Add a bid ------------------------------------
function addBid (uint _tid , uint _bidAmount ) public {
if (winner[_tid].bidAmount == 0){
winner[_tid].winner = msg.sender ;
winner[_tid].bidAmount = _bidAmount;
winner[_tid].tenderId = _tid;
}
else{
if(winner[_tid].bidAmount > _bidAmount){
winner[_tid].winner = msg.sender ;
winner[_tid].bidAmount = _bidAmount;
winner[_tid].tenderId = _tid;
}
}
allBiddings[biddingCount].bidder = msg.sender;
allBiddings[biddingCount].bidAmount = _bidAmount;
allBiddings[biddingCount].tenderId = _tid;
biddingCount++;
isBidded[msg.sender][_tid] = true ;
}
//--------------------------- Close a Tender ------------------------------------
function closeTender(uint _tid) public {
tenders[_tid].status = false ;
}
// ------------------------------verify bidder ---------------------------------
function verifyBidder(address _bidder) public {
isVerified[_bidder] = true ;
}
// ---------------------- isRegistered address ----------------------------------
function isRegisteredBidder() view public returns(bool){
return isRegistered[msg.sender];
}
// ----------------------isVerified address ---------------------------------
function isVerifiedBidder() view public returns(bool){
return isVerified[msg.sender];
}
//---------------------------- All Tender Details -----------------------------
function allTenderDetails (uint _tid) view public returns (uint,string memory,string memory,string memory,string memory,string memory,string memory,string memory,uint , bool){
return(
tenders[_tid].tenderId,
tenders[_tid].tenderName,
tenders[_tid].tenderSector,
tenders[_tid].tenderLocation,
tenders[_tid].open,
tenders[_tid].close,
tenders[_tid].tenderCategory,
tenders[_tid].prequalification,
tenders[_tid].tenderValue,
tenders[_tid].status);
}
function totalTenderLength() view public returns(uint){
return tid;
}
//------------------------------ All bidder Details ----------------------------------
function allBidderDetails(uint _bid) view public returns (uint,string memory,address ,string memory,string memory,string memory,
string memory,uint,string memory,string memory,bool){
return(
bidders[_bid].organisationId,
bidders[_bid].organisationName,
bidders[_bid].add,
bidders[_bid].pan,
bidders[_bid].bidderType,
bidders[_bid].city,
bidders[_bid].state,
bidders[_bid].postalCode,
bidders[_bid].companyCategory,
bidders[_bid].natureOfBusiness,
isVerified[bidders[_bid].add] );
}
function totalBidderLength() view public returns(uint){
return bid;
}
//-------------------------bidding detals ----------------------------------
function allBiddingDetails(uint _i) view public returns (address , uint ,uint){
return (allBiddings[_i].bidder,allBiddings[_i].bidAmount,allBiddings[_i].tenderId);
}
function totalBiddingLength() view public returns(uint){
return biddingCount;
}
// --------------------------- Check is already bidded for this tender -----------
function checkbiddedStatus(uint _tid) view public returns(bool){
return isBidded[msg.sender][_tid];
}
// -------------------------Tender status ---------------------------------------
function tenderStatus(uint _tid) view public returns(bool){
return tenders[_tid].status;
}
//---------------------------address to BidderId ----------------------------
function addToBid() view public returns(uint){
return bidderId[msg.sender];
}
} // ----------------------------------Contract End ---------------------------
它显示错误为InternalCompilerError: Stack too deep, try using fewer variables
任何人,请帮我解决这个智能合约错误。
这是一个创建智能合约的招标。
它包含
- 招标创建
- 投标人登记
- 投标
- 其他逻辑
另外,我不知道如何设置功能在特定日期后不工作?
解决方案
两者都allBidderDetails
超过allTenderDetails
了一个函数在solidity中可以拥有的局部变量的数量。
您可以将一些变量封装在数组中或公开您的映射:
mapping(uint =>tender) public tenders;
mapping(uint =>tender) public bidders;
然后你可以像使用函数一样神奇地阅读它们
yourContractInstance.methods.tenders(0);
有关更多详细信息,请查看此答案。 https://ethereum.stackexchange.com/questions/7325/stack-too-deep-try-removing-local-variables
推荐阅读
- reactjs - Antd - validateFields 仅检查当前表单步骤
- python - 获取错误无法读取文件数据:在 django rest 框架中进行迁移时是一个目录
- python - 使用 Python 从 json 响应中迭代特定值
- flutter - 添加额外的字体样式,无效值单斜体
- javascript - UnhandledPromiseRejectionWarning 未处理的承诺拒绝
- hive - “ExpiredTokenRemover 在 Python 连接到 Dataproc 中的 Hive 期间收到 java.lang.InterruptedException:睡眠中断”
- android - 不删除存在多模式的 AVD 的问题
- lstm - ValueError:无法将输入数组从形状(126,5)广播到形状(126,1)
- python - 如何在 python 中获取 Google 之类的 url 摘录
- python - scipy.integrate.ode 放弃集成