灰度eth估值方法
『壹』 求用vc++編程實現顯示灰度直方圖的詳細步驟,越詳細越好
步驟和程序:
打開VC程序——文件——新建——工程中的MFC AppWizard(exe),在工程下面的框中輸入工程名(假定工程名為111),點確定——選多重文檔,點下一個——後面都點下一個直到完成確定,基本框架就完成了,下面就加代碼。
這時VC界面上左邊框的下面有三個按鈕:ClassView、ResourceView和FileView,ClassView裡面是工程111的類:CAdoutDlg、CChildFrame、CMy111App、CMy111Doc、CMy111View和Globals;點ResourceView裡面是資源類:Accelerator、Dialog、Icon、Menu、String Table、Toolbar和Version;點開FileView裡面是文件類:Source File、Header Files、Resource Files和ReadMe.txt。
點界面的「工程」按鈕——添加工程——新建——選C++ Source File,在文件下面的框里輸入文件名(如DIBAPI),點「結束」,這樣在FileView中的Source Files裡面就多了一個DIBAPI.cpp文件,所有的代碼都加在該文件中。再點界面的「工程」按鈕——添加工程——新建——選C/C++ Header File,在文件下面的框里輸入文件名(和前面的文件名必須一致),點「結束」,這樣在FileView中的Header Files裡面就多了一個DIBAPI.h文件,該文件是DIBAPI.cpp的頭文件。
點開DIBAPI.h文件,裡面是空白的,把如下代碼考入文件中:
//DIBAPI.h
#ifndef _INC_DIBAPI
#define _INC_DIBAPI
DECLARE_HANDLE(HDIB);
#define PALVERSION 0x300
#define IS_WIN30_DIB(lpbi) ((*(LPDWORD)(lpbi))==sizeof(BITMAPINFOHEADER))
#define RECTWIDTH(lpRect) ((lpRect)->right-(lpRect)->left)
#define RECTHEIGHT(lpRect) ((lpRect)->bottom-(lpRect)->top)
#define WIDTHBYTES(bits) (((bits)+31)/32*4)
#define DIB_HEADER_MARKER ((WORD)('M'<<8)|'B')
BOOL WINAPI PaintDIB(HDC,LPRECT,HDIB,LPRECT,CPalette* pPal);
BOOL WINAPI CreateDIBPalette(HDIB hDIB,CPalette* cPal);
LPSTR WINAPI FindDIBBits(LPSTR lpbi);
DWORD WINAPI DIBWidth(LPSTR lpDIB);
DWORD WINAPI DIBHeight(LPSTR lpDIB);
WORD WINAPI PaletteSize(LPSTR lpbi);
WORD WINAPI DIBNumColors(LPSTR lpbi);
HGLOBAL WINAPI CopyHandle(HGLOBAL h);
BOOL WINAPI SaveDIB(HDIB hDib,CFile& file);
HDIB WINAPI ReadDIBFile(CFile& file);
//在此處輸入自己的函數聲明
#endif//!_INC_DIBAPI
上面這些函數是實現圖像的讀取、存儲等圖像處理的基本功能的,你將自己需要的函數也輸入到「//在此處輸入自己的函數聲明」的下面。
點開DIBAPI.cpp文件,裡面是空白的,將如下代碼加入其中:
//DIBAPI.cpp
#include "stdafx.h"
#include "DIBAPI.h"
WORD WINAPI DIBNumColors(LPSTR lpbi)
{
WORD wBitCount;
if(IS_WIN30_DIB(lpbi))
{
DWORD dwClrUsed;
dwClrUsed=((LPBITMAPINFOHEADER)lpbi)->biClrUsed;
if(dwClrUsed)
return (WORD)dwClrUsed;
}
if(IS_WIN30_DIB(lpbi))
wBitCount=((LPBITMAPINFOHEADER)lpbi)->biBitCount;
else
wBitCount=((LPBITMAPCOREHEADER)lpbi)->bcBitCount;
switch(wBitCount)
{
case 1:
return 2;
case 4:
return 16;
case 8:
return 256;
default:
return 0;
}
}
WORD WINAPI PaletteSize(LPSTR lpbi)
{
if(IS_WIN30_DIB(lpbi))
return (WORD)(DIBNumColors(lpbi)*sizeof(RGBQUAD));
else
return (WORD)(DIBNumColors(lpbi)*sizeof(RGBTRIPLE));
}
LPSTR WINAPI FindDIBBits(LPSTR lpbi)
{
return (lpbi+*(LPDWORD)lpbi+::PaletteSize(lpbi));
}
DWORD WINAPI DIBWidth(LPSTR lpDIB)
{
LPBITMAPINFOHEADER lpbmi;
LPBITMAPCOREHEADER lpbmc;
lpbmi=(LPBITMAPINFOHEADER)lpDIB;
lpbmc=(LPBITMAPCOREHEADER)lpDIB;
if(IS_WIN30_DIB(lpDIB))
return lpbmi->biWidth;
else
return (DWORD)lpbmc->bcWidth;
}
DWORD WINAPI DIBHeight(LPSTR lpDIB)
{
LPBITMAPINFOHEADER lpbmi;
LPBITMAPCOREHEADER lpbmc;
lpbmi=(LPBITMAPINFOHEADER)lpDIB;
lpbmc=(LPBITMAPCOREHEADER)lpDIB;
if(IS_WIN30_DIB(lpDIB))
return lpbmi->biHeight;
else
return (DWORD)lpbmc->bcHeight;
}
BOOL WINAPI PaintDIB(HDC hDC,LPRECT lpDCRect,HDIB hDIB,LPRECT lpDIBRect,CPalette* pPal)
{
LPSTR lpDIBHdr;
LPSTR lpDIBBits;
BOOL bSuccess=FALSE;
HPALETTE hPal=NULL;
HPALETTE hOldPal=NULL;
if(hDIB==NULL)
return FALSE;
lpDIBHdr=(LPSTR)::GlobalLock((HGLOBAL)hDIB);
lpDIBBits=FindDIBBits(lpDIBHdr);
if(pPal!=NULL)
{
hPal=(HPALETTE)pPal->m_hObject;
hOldPal=::SelectPalette(hDC,hPal,TRUE);
}
::SetStretchBltMode(hDC,COLORONCOLOR);
if((RECTWIDTH(lpDCRect)==RECTWIDTH(lpDIBRect))&&(RECTHEIGHT(lpDCRect)==RECTHEIGHT(lpDIBRect)))
{
bSuccess=::SetDIBitsToDevice(hDC,lpDCRect->left,lpDCRect->top,RECTWIDTH(lpDCRect),RECTHEIGHT(lpDCRect),lpDIBRect->left,\
(int)DIBHeight(lpDIBHdr)-lpDIBRect->top-RECTHEIGHT(lpDIBRect),0,(WORD)DIBHeight(lpDIBHdr),\
lpDIBBits,(LPBITMAPINFO)lpDIBHdr,DIB_RGB_COLORS);
}
else
{
bSuccess=::StretchDIBits(hDC,lpDCRect->left,lpDCRect->top,RECTWIDTH(lpDCRect),RECTHEIGHT(lpDCRect),lpDIBRect->left,\
lpDIBRect->top,RECTWIDTH(lpDIBRect),RECTHEIGHT(lpDIBRect),\
lpDIBBits,(LPBITMAPINFO)lpDIBHdr,DIB_RGB_COLORS,SRCCOPY);
}
::GlobalUnlock((HGLOBAL)hDIB);
if(hOldPal)
::SelectPalette(hDC,hOldPal,TRUE);
GlobalUnlock(hDIB);
return bSuccess;
}
BOOL WINAPI CreateDIBPalette(HDIB hDIB,CPalette* pPal)
{
LPLOGPALETTE lpPal;
HANDLE hLogPal;
HPALETTE hPal=NULL;
LPSTR lpbi;
LPBITMAPINFO lpbmi;
LPBITMAPCOREINFO lpbmc;
BOOL bWinStyleDIB;
int i;
WORD wNumColors;
BOOL bResult=FALSE;
if(hDIB==NULL)
return FALSE;
lpbi=(LPSTR)::GlobalLock((HGLOBAL)hDIB);
lpbmi=(LPBITMAPINFO)lpbi;
lpbmc=(LPBITMAPCOREINFO)lpbi;
wNumColors=DIBNumColors(lpbi);
bWinStyleDIB=IS_WIN30_DIB(lpbi);
if(wNumColors!=0)
{
hLogPal=::GlobalAlloc(GHND,sizeof(LOGPALETTE)+sizeof(PALETTEENTRY)*wNumColors);
if(hLogPal==0)
{
::GlobalUnlock((HGLOBAL)hDIB);
return FALSE;
}
lpPal=(LPLOGPALETTE)::GlobalLock(hLogPal);
lpPal->palVersion=PALVERSION;
lpPal->palNumEntries=(WORD)wNumColors;
bWinStyleDIB=IS_WIN30_DIB(lpbi);
for(i=0;i<(int)wNumColors;i++)
{
if(bWinStyleDIB)
{
lpPal->palPalEntry[i].peRed=lpbmi->bmiColors[i].rgbRed;
lpPal->palPalEntry[i].peGreen=lpbmi->bmiColors[i].rgbGreen;
lpPal->palPalEntry[i].peBlue=lpbmi->bmiColors[i].rgbBlue;
lpPal->palPalEntry[i].peFlags=0;
}
else
{
lpPal->palPalEntry[i].peRed=lpbmc->bmciColors[i].rgbtRed;
lpPal->palPalEntry[i].peGreen=lpbmc->bmciColors[i].rgbtGreen;
lpPal->palPalEntry[i].peBlue=lpbmc->bmciColors[i].rgbtBlue;
lpPal->palPalEntry[i].peFlags=0;
}
}
bResult=pPal->CreatePalette(lpPal);
::GlobalUnlock((HGLOBAL)hLogPal);
::GlobalFree((HGLOBAL)hLogPal);
}
::GlobalUnlock((HGLOBAL)hDIB);
return bResult;
}
HGLOBAL WINAPI CopyHandle(HGLOBAL h)
{
if(h==NULL)
return NULL;
DWORD dwLen=::GlobalSize((HGLOBAL)h);
HGLOBAL hCopy=::GlobalAlloc(GHND,dwLen);
if(hCopy!=NULL)
{
void* lpCopy=::GlobalLock((HGLOBAL)hCopy);
void* lp=::GlobalLock((HGLOBAL)h);
memcpy(lpCopy,lp,dwLen);
::GlobalUnlock(hCopy);
::GlobalUnlock(h);
}
return hCopy;
}
BOOL WINAPI SaveDIB(HDIB hDib,CFile& file)
{
BITMAPFILEHEADER bmfHdr;
LPBITMAPINFOHEADER lpBI;
DWORD dwDIBSize;
if(!hDib)
return FALSE;
lpBI=(LPBITMAPINFOHEADER)::GlobalLock((HGLOBAL)hDib);
if(lpBI==NULL)
return FALSE;
if(!IS_WIN30_DIB(lpBI))
{
::GlobalUnlock((HGLOBAL)hDib);
return FALSE;
}
bmfHdr.bfType=DIB_HEADER_MARKER;
dwDIBSize=*(LPDWORD)lpBI+::PaletteSize((LPSTR)lpBI);
if((lpBI->biCompression==BI_RLE8)||(lpBI->biCompression==BI_RLE4))
dwDIBSize+=lpBI->biSizeImage;
else
{
DWORD dwBmBitsSize;
dwBmBitsSize=WIDTHBYTES((lpBI->biWidth)*((DWORD)lpBI->biBitCount))*lpBI->biHeight;
dwDIBSize+=dwBmBitsSize;
lpBI->biSizeImage=dwBmBitsSize;
}
bmfHdr.bfSize=dwDIBSize+sizeof(BITMAPFILEHEADER);
bmfHdr.bfReserved1=0;
bmfHdr.bfReserved2=0;
bmfHdr.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+lpBI->biSize+::PaletteSize((LPSTR)lpBI);
TRY
{
file.Write((LPSTR)&bmfHdr,sizeof(BITMAPFILEHEADER));
file.WriteHuge(lpBI,dwDIBSize);
}
CATCH(CFileException,e)
{
::GlobalUnlock((HGLOBAL)hDib);
THROW_LAST();
}
END_CATCH
::GlobalUnlock((HGLOBAL)hDib);
return TRUE;
}
HDIB WINAPI ReadDIBFile(CFile& file)
{
BITMAPFILEHEADER bmfHeader;
DWORD dwBitsSize;
HDIB hDIB;
LPSTR pDIB;
dwBitsSize=file.GetLength();
if(file.Read((LPSTR)&bmfHeader,sizeof(bmfHeader))!=sizeof(bmfHeader))
return NULL;
if(bmfHeader.bfType!=DIB_HEADER_MARKER)
return NULL;
hDIB=(HDIB)::GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,dwBitsSize);
if(hDIB==0)
return NULL;
pDIB=(LPSTR)::GlobalLock((HGLOBAL)hDIB);
if(file.ReadHuge(pDIB,dwBitsSize-sizeof(BITMAPFILEHEADER))!=dwBitsSize-sizeof(BITMAPFILEHEADER))
{
::GlobalUnlock((HGLOBAL)hDIB);
::GlobalFree((HGLOBAL)hDIB);
return NULL;
}
::GlobalUnlock((HGLOBAL)hDIB);
return hDIB;
}
//在此處輸入自己的函數定義
上面是DIBAPI.h頭文件中聲明的函數的定義,你將自己的函數定義加到「//在此處輸入自己的函數定義」後面。
下面加相應的消息映射函數,點Ctrl+W鍵,會出現MFC ClassWizard對話框,點Message Maps,在Class name下面的框中選擇CMy111Doc,在Messages裡面選中OnOpenDocument,然後點擊Add Function按鈕就加入了相應的消息映射函數,同樣的方法以此加入OnSaveDocument、DeleteContents、CanCloseFrame相應的消息函數,點「確定」即可。
點開111Doc.cpp文件,裡面有相應的消息映射函數定義位置,在函數CMy111Doc::CMy111Doc()里輸入以下代碼:
m_refColorBKG=0x00808080;
m_hDIB=NULL;
m_palDIB=NULL;
m_sizeDoc=CSize(1,1);
在函數CMy111Doc::~CMy111Doc()里輸入以下代碼:
if(m_hDIB!=NULL)
::GlobalFree((HGLOBAL)m_hDIB);
if(m_palDIB!=NULL)
delete m_palDIB;
在函數BOOL CMy111Doc::OnOpenDocument(LPCTSTR lpszPathName)里/ TODO: Add your specialized creation code here下面添加如下代碼:
CFile file;
CFileException fe;
if(!file.Open(lpszPathName,CFile::modeRead|CFile::shareDenyWrite,&fe))
{
ReportSaveLoadException(lpszPathName,&fe,FALSE,AFX_IDP_FAILED_TO_OPEN_DOC);
return FALSE;
}
DeleteContents();
BeginWaitCursor();
TRY
{
m_hDIB=::ReadDIBFile(file);
}
CATCH(CFileException,eLoad)
{
file.Abort();
EndWaitCursor();
ReportSaveLoadException(lpszPathName,eLoad,FALSE,AFX_IDP_FAILED_TO_OPEN_DOC);
m_hDIB=NULL;
return FALSE;
}
END_CATCH
InitDIBData();
EndWaitCursor();
if(m_hDIB==NULL)
{
CString strMsg;
strMsg="讀取圖像時出錯!可能是不支持該類型的圖像文件!";
MessageBox(NULL,strMsg,NULL,MB_ICONINFORMATION|MB_OK);
return FALSE;
}
SetPathName(lpszPathName);
SetModifiedFlag(FALSE);
在函數BOOL CMy111Doc::OnSaveDocument(LPCTSTR lpszPathName)里// TODO: Add your specialized code here and/or call the base class後面添加如下代碼:
CFile file;
CFileException fe;
if(!file.Open(lpszPathName,CFile::modeCreate|CFile::modeReadWrite|CFile::shareExclusive,&fe))
{
ReportSaveLoadException(lpszPathName,&fe,TRUE,AFX_IDP_INVALID_FILENAME);
return FALSE;
}
BOOL bSuccess=FALSE;
TRY
{
BeginWaitCursor();
bSuccess=::SaveDIB(m_hDIB,file);
file.Close();
}
CATCH(CException,eSave)
{
file.Abort();
EndWaitCursor();
ReportSaveLoadException(lpszPathName,eSave,TRUE,AFX_IDP_FAILED_TO_SAVE_DOC);
return FALSE;
}
END_CATCH
EndWaitCursor();
SetModifiedFlag(FALSE);
if(!bSuccess)
{
CString strMsg;
strMsg="無法保存BMP圖像";
MessageBox(NULL,strMsg,NULL,MB_ICONINFORMATION|MB_OK);
}
點開ClassView,右鍵點擊CMy111Doc類,點Add Member Variable出現添加成員變數對話框,在Variable Type下的框中輸入變數類型名HDIB,在Variable Name中輸入變數名m_hDIB,在Access中選中Public就在CMy111Doc中加入了公共成員變數m_hDIB;同樣加入int類型的m_nColorIndex、COLORREF類型的m_refColorBKG公共成員變數,再添加保護成員變數(在Access中選中Protected)CSize類的m_sizeDoc、CPalette*類的m_palDIB變數。右鍵點擊CMy111Doc類,點Add Member Function出現添加成員函數對話框,在Function Type下的框中輸入函數類型名void,在Function Declaration中輸入函數名InitDIBData(),在Access中選中Public就在CMy111Doc中加入了公共成員函數InitDIBData();同樣方法加入void類型的公共成員函數ReplaceHDIB(HDIB hDIB)。在111Doc.cpp中加入函數的代碼,InitDIBData()里加如下代碼:
if(m_palDIB!=NULL)
{
delete m_palDIB;
m_palDIB=NULL;
}
if(m_hDIB==NULL)
return;
LPSTR lpDIB=(LPSTR)::GlobalLock((HGLOBAL)m_hDIB);
if(::DIBWidth(lpDIB)>INT_MAX||::DIBHeight(lpDIB)>INT_MAX)
{
::GlobalUnlock((HGLOBAL)m_hDIB);
::GlobalFree((HGLOBAL)m_hDIB);
m_hDIB=NULL;
CString strMsg;
strMsg="BMP圖像太大!";
MessageBox(NULL,strMsg,NULL,MB_ICONINFORMATION|MB_OK);
return;
}
m_sizeDoc=CSize((int)::DIBWidth(lpDIB),(int)::DIBHeight(lpDIB));
::GlobalUnlock((HGLOBAL)m_hDIB);
m_palDIB=new CPalette;
if(m_palDIB==NULL)
{
::GlobalFree((HGLOBAL)m_hDIB);
m_hDIB=NULL;
return;
}
if(::CreateDIBPalette(m_hDIB,m_palDIB)==NULL)
{
delete m_palDIB;
m_palDIB=NULL;
return;
}
在函數ReplaceHDIB(HDIB hDIB)中加入如下代碼:
if(m_hDIB!=NULL)
::GlobalFree((HGLOBAL)m_hDIB);
m_hDIB=hDIB;
在CMy111doc.h的
// Attributes
public:
下面加入如下代碼:
HDIB GetHDIB() const
{
return m_hDIB;
}
CPalette* GetDocPalette() const
{
return m_palDIB;
}
CSize GetDocSize() const
{
return m_sizeDoc;
}
注意要在111Doc.h前加上#include "DIBAPI.h"語句(在class CMy111Doc:public CDocument語句前)
下面為CMy111View中的函數 void CMy111View::OnDraw(CDC* pDC)中添加如下代碼:
BeginWaitCursor();
CMy111* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
HDIB hDIB=pDoc->GetHDIB();
if(hDIB!=NULL)
{
LPSTR lpDIB=(LPSTR)::GlobalLock((HGLOBAL)hDIB);
int cxDIB=(int)::DIBWidth(lpDIB);
int cyDIB=(int)::DIBHeight(lpDIB);
::GlobalUnlock((HGLOBAL)hDIB);
CRect rcDIB;
rcDIB.top=rcDIB.left=0;
rcDIB.right=cxDIB;
rcDIB.bottom=cyDIB;
CRect rcDest;
if(pDC->IsPrinting())
{
int cxPage=pDC->GetDeviceCaps(HORZRES);
int cyPage=pDC->GetDeviceCaps(VERTRES);
int cxInch=pDC->GetDeviceCaps(LOGPIXELSX);
int cyInch=pDC->GetDeviceCaps(LOGPIXELSY);
rcDest.top=rcDest.left=0;
rcDest.bottom=(int)(((double)cyDIB*cxPage*cyInch)/((double)cxDIB*cxInch));
rcDest.right=cxPage;
int temp=cyPage-(rcDest.bottom-rcDest.top);
rcDest.bottom+=temp/2;
rcDest.top+=temp/2;
}
else
{
rcDest=rcDIB;
}
::PaintDIB(pDC->m_hDC,&rcDest,pDoc->GetHDIB(),&rcDIB,pDoc->GetDocPalette());
}
EndWaitCursor();
以上是關於圖像打開、顯示、保存的有關步驟和代碼。
在111.cpp文件的InitInstance()函數的ParseCommandLine(cmdInfo);語句下輸入語句
cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;
則啟動時不自動打開一個空文檔。
顯示圖像直方圖步驟:
1、 點擊ResourceView,右鍵點擊Dialog,選Insert Dialog 在屬性對話框中將ID改為ID_HIST,對話框名稱改為「直方圖」
2、 在工具欄中點「插入」-「新建類」,輸入類名,並選Base Class為CDialog,Dialog ID為ID_HIST。這樣就將對話框和類聯系起來了,在該對話框中拖入一Edit控制項,將其ID設為IDC_HISTSHOW;
3、 快捷鍵「Ctrl+W」,出現MFC ClassWizard對話框,在Messages欄中分別選WM_INITDIALOG和WM_Paint,再點擊「Add Function」,即將對話框初始化和畫圖函數加入對話框類之中。
4、 在Hist.h文件「public:」下面輸入如下變數定義:
LONG m_lCount[256];
char* m_lpDIBBits;
LONG m_lWidth;
LONG m_lHeight;
int m_iIsDraging;
CDlgIntensity(CWnd* pParent = NULL);
5、 打開Hist.cpp程序,在CHist::OnInitDialog()函數中「// TODO: Add extra initialization here」前將如下代碼拷貝進去:
unsigned char* lpSrc;
LONG i;
LONG j;
6、 在「// TODO: Add extra initialization here」後將如下代碼拷貝進去:
CWnd* pWnd=GetDlgItem(IDC_HISTSHOW);
CRect rect;
GetClientRect(rect);
ClientToScreen(&rect);
for(i=0;i<256;i++)
{
m_lCount[i]=0;
}
LONG lLineBytes;
lLineBytes=WIDTHBYTES(m_lWidth*8);
for(i=0;i<m_lHeight;i++)
{
for(j=0;j<m_lWidth;j++)
{
lpSrc=(unsigned char*)m_lpDIBBits+lLineBytes*i+j;
m_lCount[*(lpSrc)]++;
}
}
m_iIsDraging=0;
7、在CHist::OnPaint()函數「CPaintDC dc(this);」前將如下代碼拷如其中:
CString str;
LONG i;
LONG lMaxCount=0;
LONG m_iLowGray=0;
LONG m_iUpGray=255;
在CHist::OnPaint()函數「// TODO: Add your message handler code here」後將如下代碼拷如其中:
CWnd* pWnd=GetDlgItem(IDC_ HISTSHOW);
CDC* pDC=pWnd->GetDC();
pWnd->Invalidate();
pWnd->UpdateWindow();
pDC->Rectangle(0,0,330,300);
CPen* pPenRed=new CPen;
pPenRed->CreatePen(PS_SOLID,1,RGB(255,0,0));
CPen* pPenBlue=new CPen;
pPenBlue->CreatePen(PS_SOLID,1,RGB(0,0,255));
CPen* pPenGreen=new CPen;
pPenGreen->CreatePen(PS_SOLID,1,RGB(0,255,0));
CGdiObject* pOldPen=pDC->SelectObject(pPenRed);
pDC->MoveTo(10,10);
pDC->LineTo(10,280);
pDC->LineTo(320,280);
str.Format("0");
pDC->TextOut(10,283,str);
str.Format("50");
pDC->TextOut(60,283,str);
str.Format("100");
pDC->TextOut(110,283,str);
str.Format("150");
pDC->TextOut(160,283,str);
str.Format("200");
pDC->TextOut(210,283,str);
str.Format("255");
pDC->TextOut(265,283,str);
for(i=0;i<256;i+=5)
{
if((i&1)==0)
{
pDC->MoveTo(i+10,280);
pDC->LineTo(i+10,284);
}
else
{
pDC->MoveTo(i+10,280);
pDC->LineTo(i+10,282);
}
}
pDC->MoveTo(315,275);
pDC->LineTo(320,280);
pDC->LineTo(315,285);
pDC->MoveTo(10,10);
pDC->LineTo(5,15);
pDC->MoveTo(10,10);
pDC->LineTo(15,15);
for(i=m_iLowGray;i<=m_iUpGray;i++)
{
if(m_lCount[i]>lMaxCount)
{
lMaxCount=m_lCount[i];
}
}
pDC->MoveTo(10,25);
pDC->LineTo(14,25);
str.Format("%d",lMaxCount);
pDC->TextOut(11,26,str);
pDC->SelectObject(pPenGreen);
pDC->MoveTo(m_iLowGray+10,25);
pDC->LineTo(m_iLowGray+10,280);
pDC->MoveTo(m_iUpGray+10,25);
pDC->LineTo(m_iUpGray+10,280);
pDC->SelectObject(pPenBlue);
if(lMaxCount>0)
{
for(i=m_iLowGray;i<=m_iUpGray;i++)
{
pDC->MoveTo(i+10,280);
pDC->LineTo(i+10,281-(int)(m_lCount[i]*256/lMaxCount));
}
}
pDC->SelectObject(pOldPen);
delete pPenRed;
delete pPenBlue;
delete pPenGreen;
8、點開ResourceView中的Menu,出現IDR_MAINFRAME和 IDR_MY111TYPE,雙擊IDR_MY111TYPE就出現了程序界面,有文件、編輯、查看、窗口、幫助按鈕。點「查看」下面的虛線框右鍵——點「屬性」,輸入標題(直方圖),和ID(大寫英文,如ID_VIEW_HIST),這樣就將按鈕和程序通過ID聯系起來了,點擊該按鈕,就會執行相應的程序。下面為該按鈕添加函數:點Ctrl+W ,出現MFC ClassWizard對話框,選Class name為CMy111View,在Object IDs對應的選項中選中設置的ID(如為ID_VIEW_HIST),在Messages選項中選中COMMAND,然後點擊「Add Function」按鈕,選默認設置,就為ID_VIEW_HIST添加了相應的函數OnViewHist()。該函數在111View.cpp文件中定義,在函數void CMy111View:: OnViewHist()添加如下代碼:
// TODO: Add your command handler code here
CMy111Doc* pDoc=GetDocument();
if(pDoc->m_hDIB==NULL)
{
MessageBox("請先打開一幅256色的BMP圖像!","系統提示",MB_ICONINFORMATION|MB_OK);
return;
}
LPSTR lpDIB;
LPSTR lpDIBBits;
lpDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc->GetHDIB());
lpDIBBits=::FindDIBBits(lpDIB);
if(::DIBNumColors(lpDIB)!=256)
{
MessageBox("目前只支持查看256色點陣圖灰度直方圖!","系統提示",MB_ICONINFORMATION|MB_OK);
::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());
return;
}
BeginWaitCursor();
CHist dlgPara;
dlgPara.m_lpDIBBits=lpDIBBits;
dlgPara.m_lWidth=::DIBWidth(lpDIB);
dlgPara.m_lHeight=::DIBHeight(lpDIB);
// dlgPara.m_iLowGray=0;
// dlgPara.m_iUpGray=255;
if(dlgPara.DoModal()!=IDOK)
{
return;
}
::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());
EndWaitCursor();
『貳』 加密貨幣資訊
如果你沒有做好承受痛苦的准備,那就離開吧,別指望會成為常勝將軍,要想成功,必須冷酷!
--[美]索羅斯
Polygon推出新部門Polygon Studios工作室,推進區塊鏈 游戲 和NFT工作
7月20日,以太坊擴展方案Polygon推出新工作室Polygon Studios,推進其區塊鏈 游戲 和NFT工作。Polygon Studios的核心目標包括:確立Polygon在去中心化 游戲 領域的領導者地位;創造一個能夠吸引開發者和投資者進入其NFT生態系統的品牌;幫助將Polygon定位為過渡到Web3.0的首選平台。
其中Polygon Gaming Studio旨在幫助開發者創造和運營去中心化 游戲 。而Polygon NFT Studio則用於幫助品牌和知識產權所有者推出定製的數字收藏品和市場。
Fantom研究人員提出智能合約鏈下執行和測試解決方案
據官方消息,智能合約平台Fantom的研究人員在Usenix2021年度技術會議中,展示了一種專注智能合約鏈下執行和測試的全新解決方案,其效率將高於現有的解決方案。目前,開發人員測試智能合約需要用三個方案:存檔節點、全節點或測試網,其中每一種都可能受到擴展性、速度和存儲的限制。為了解決這些問題,Fantom的研究人員提出了一個建立在交易「記錄和重放」機制的鏈下測試環境,開發者在此環境中就能重放交易,而不依賴於以前的交易和區塊鏈的整個世界狀態。在針對900萬個區塊樣本集的測試中,「記錄和重放」模型將所需的存儲量減少了50%。
Chainlink預言機上線Avalanche主網,推動高級DeFi App開發的快速發展
據官方公告,Chainlink Price Feeds已經上線Avalanche主網,Avalanche平台的開發人員將能無縫流暢獲取各資產類別最安全、最優質的價格數據。Chainlink的Price Feeds機制將賦能智能合約開發者在Avalanche的開源平台上自由搭建高級DeFi應用程序,應用場景如價格敏感的衍生品市場、低成本借貸應用、高通量交易策略等。
"Chainlink為各區塊鏈和Dapp建立了預言機和數據的標准,Avalanche平台上的DeFi一直非常活躍且快速發展,但Chainlink的數據將為整個社區帶來巨大的發展機遇,並且進一步擴大Avalanche作為技術最為領先的加密貨幣平台的領先優勢。" ——Ava Labs創始人及CEO Emin Gün Sirer教授
Solana基金會等合作啟動創作者基金,旨在將下一波音樂家、藝術家等引入加密貨幣領域
官方消息,Solana基金會與去中心協議Metaplex、基於區塊鏈技術的音樂共享平台Audius Music合作以啟動一個創作者基金(Creator Fund),旨在將下一波音樂家、藝術家等引入加密貨幣領域。
Defi鎖倉及主要板塊情況
MakerDAO將轉向完全去中心化,基金會將在未來幾個月內解散
Maker基金會宣布,將把業務完全移交給其去中心化自治組織(DAO)MakerDAO,正如其創始人Rune Christensen長期以來所承諾的那樣。Christensen在博客文章中透露,Maker基金會將在未來幾個月內正式解散,但沒有提供更具體的時間表。Christensen寫道,「我期待著再次成為一名獨立的社區成員和Maker論壇的參與者。」
Aave社區105名參與投票者全數同意在Aave V2添加DPI作為抵押品
去中心化借貸協議Aave社區發起的在Aave V2中添加DPI (DeFi Pulse Index)作為抵押品的提案,投票已結束,105名AAVE持有者參與投票,100%同意添加DPI作為抵押品。提案中表示,DPI是一個資本化加權指數,跟蹤整個市場的DeFi資產表現,用戶能夠通過單筆交易獲得一籃子DeFi協議,並且DPI包含14種代幣,其低波動性和多樣性是抵押品的重要屬性,提議在Aave V2添加DPI作為抵押品。若該提案最終實施,Aave將成為第一個將指數產品集成到其平台的借貸協議,添加DPI作為抵押品也會將其他用戶帶入Aave生態。
Circle披露USDC儲備透明度:USDC總流通量與以美元計價的儲備資產1比1錨定
美元穩定幣USDC發行機構Circle在發布的透明度報告中指出,致同會計師事務所(Grant Thornton)出具的儲備證明報告顯示,Circle的USDC的總流通量仍與以美元計價的儲備資產1 比1錨定,另外,自2021年初以來,USDC流通量已增長2600%以上。
致同會計師事務所發布的USDC儲備報告顯示,61%的USDC代幣由現金或現金等價物支持,另外還有一定比例的揚基存單(Yankee CDs)、美國國庫證券等。
Reddit與Arbitrum合作擴展其基於以太坊的社區積分系統
Reddit正在與以太坊Layer 2擴容解決方案Arbitrum合作擴展其基於以太坊的社區積分系統。Reddit周四表示,Arbitrum擊敗了其他21名競爭者,其他被考慮的項目包括Solana、StarkWare和Polygon等。據悉,Reddit的社區積分是ERC-20代幣,Reddit用戶可以通過發表高質量評論或其他貢獻來賺取這些積分,可用於購買專屬徽章、自定義表情符號和GIF等。據報道,升級會將Moons和Bricks代幣從測試網遷移到以太坊主網,但交易將通過擴容解決方案Arbitrum進行。
以太坊擴容方案SKALE推出SKALEIMA跨鏈橋,以實現以太坊和SKALE資產跨鏈
據官方消息,以太坊擴容方案SKALE推出SKALEIMA跨鏈橋,允許用戶在以太坊和SKALE網路之間轉移包括ERC20代幣、ERC721代幣、ERC1155代幣等數字資產以及通用消息數據。當用戶將資產從以太坊跨鏈至SKALE網路時,SKALEIMA跨鏈橋通過將以太坊上資產存入合約,並在約10個區塊確認後,在SKALE網路中通過代理調用SKALETokenManager來傳輸跨鏈信息實現資產跨鏈;反之,則將SKALE網路上的資產銷毀並在以太坊合約中釋放資產。SKALE表示,該跨鏈橋具有安全、快速、去中心化、低成本等優勢。
NFT平台Autograph與獅門影業、DraftKings達成戰略合作,將開發飢餓 游戲 、暮光之城等IP
據prnewswire 7月21日報道,由橄欖球運動員Tom Brady創辦的NFT平台Autograph宣布與獅門影業(Lionsgate)和數字 體育 娛樂 公司DraftKings達成戰略合作關系。Autograph將與多位 體育 明星建立多年的獨家NFT合作關系,包括老虎伍茲、韋恩·格雷茨基、德里克·基特、內奧米·大阪和托尼·霍克等,他們將加入Autograph的顧問委員會。而獅門影業將以幾個標志性的電影和電視版權啟動Autograph的 娛樂 業務,包括疾速追殺(John Wick)、飢餓 游戲 、暮光之城、廣告狂人等。
NFT市場平台OpenSea完成1億美元B輪融資,a16z領投。
NFT市場平台OpenSea完成由Andreessen Horowitz(a16z)領投的1億美元B輪融資,投後估值15億美元。據DuneAnalytics數據統計,OpenSea 6月成交額達1.49億美元,成交量達21萬件,均創 歷史 新高,此外,OpenSea總用戶數量突破14萬,環比增長19%。此前消息,今年三月,OpenSea完成2300萬美元的A輪融資,a16z領投,Cultural Leadership Fund參投,以及Ron Conway、Mark Cuban、Tim Ferriss、Belinda Johnson、Naval Ravikant、Ben Silberman等眾多天使投資人也參與了本輪投資。
NFT資產瀏覽器NFTSCAN宣布發布公測版
NFT資產瀏覽器NFTSCAN宣布對外發布公測版,在可控范圍內進行一次公開測試使用。
據悉,NFTSCAN是基於以太坊網路的NFT資產瀏覽器產品,測試階段已收錄40個熱門NFT項目,例如OpenSea、Rarible、CryptoPunks、Meebits、AxieInfinity等。截至7月22日,NFTSCAN已收錄147萬個NFT資產、223個NFT合約地址、1010萬條NFT相關的鏈上記錄,以及217萬個相關錢包地址。此外,今年4月底,NFTSCAN獲得55萬美元種子輪股權融資,由元宇宙資本領投。
PeckShield派盾:去中心化跨鏈交易協議THORChain遭攻擊
7月23日,PeckShield派盾預警顯示,去中心化跨鏈交易協議THORChain遭攻擊,請用戶注意風控。
事件發生後,項目方披露了更多攻擊細節,稱這次攻擊針對ETH路由,損失800萬美元,攻擊者「有意限制了攻擊造成的影響,似乎為白帽所為」。THORChain上的ETH路由目前已經暫停,由審計專家進行評估後再決定是否開放。THORChain稱,攻擊者要求10%的懸賞金,如果可以聯繫到攻擊者,團隊樂意提供相應的獎金。THORChain還表示:項目自有資金可以彌補該損失,受影響的ERC-20資金池的流動性提供者將會給予補償。
DeFi項目array finance官方:閃電貸造成超50萬美元損失,或為一名內部人員所為
官方消息,DeFi項目array finance證實遭到閃電貸攻擊,官方表示,攻擊者獲利約272.94 ETH,價值約51.5萬美元。array希望找到一家公司或組織,為失去的流動性提供擔保,並在啟動後償還。此外,array表示,將Gismar從團隊中除名,因為團隊認為他的疏忽和粗心導致流動性被偷,或者他自己偷了錢。目前正在積極嘗試聯系和聯絡Gismar,但他的所有社交媒體已經關閉和清空。array下一步將用剩餘的資金僱傭一個可靠的開發人員;解決手頭的問題,這樣就可以繼續目前的工作;試著找個人為70萬美元做抵押;採取法律行動。
灰度CEO:100%致力於將GBTC轉換為ETF
據cointelegraph 7月19日消息,灰度首席執行官Michael Sonnenshein表示,一旦條件合適,該公司「100%致力於」將其比特幣產品GBTC轉換為ETF。他認為:「在我們的席位上,從我們的世界來看,我們確實在尋找基礎市場的幾個不同的成熟點,這確實是我們認為監管機構批准這些類型產品所需的最後階段並為投資者提供他們正在尋找的保護」。
上周,灰度宣布與美國銀行業巨頭紐約梅隆銀行建立合作夥伴關系,後者將在GBTC經歷轉換後為其提供服務。
馬斯克:持有比特幣且不會賣,特斯拉很可能繼續接受比特幣支付
7月22日消息,特斯拉CEO馬斯克昨晚在參與B Word活動時透露說,可能會再次接受消費者用比特幣購買 汽車 。馬斯克表示:「看起來比特幣正在朝著可再生能源轉變,可再生能源的使用率,很可能達到或者超過50%,照趨勢看數字還會上升。如果真是這樣,特斯拉極可能會再次接受比特幣支付。」
V神:以太坊需要擴展到製造代幣之外
7月21日消息,以太坊聯合創始人V神(Vitalik Buterin)在以太坊社區活動EthCC上表示,以太坊 (ETH) 已超越DeFi,成為其第一大用例,該網路向前發展的時候到了。V神稱:「以太坊生態系統需要擴展,而不僅僅是製作有助於交易其他代幣的代幣。擴展已經在某種程度上發生了,但我們可以做得更多。」例如,以太坊可以幫助重塑社交媒體細分市場。去中心化治理 (DeGov) 是以太坊 (ETH) 網路擴展的另一個用途。最後,V神承認,他對數字收藏品或NFT領域的現狀感到失望。他希望NFT能夠造福更廣泛的 社會 ,而不僅僅是名人。
#比特幣[超話]# #數字貨幣# #歐易OKEx#
『叄』 穩健的十倍收益 - 淺談幣圈平台幣估值邏輯
幣圈熊了許久,早已沒了往日的喧囂,社群冷清、成交量萎靡、幣值縮水。熊市時多學習,牛市才能多收獲。
無論是傳統投資大佬巴菲特還是幣圈大佬李笑來,都強調只投資自己熟悉的領域。只有了解自己的投資選擇,才可能不被割韭菜。
五花肉認為幣圈最穩妥的投資有 2 種,一種是諸如 BTC、ETH、EOS 之類的主流幣,共識強,技術過硬,團隊踏實做事;另一種就是平台幣了,有清晰的盈利模式,可以使用傳統金融的估值方法來判斷其價值。
普通的加密貨幣可以從技術、團隊、社群等維度分析,平台幣則可以用傳統金融的估值分析方法來判斷其價值。
所以今天五花肉帶大家解析一下平台幣的估值邏輯。
平台幣是幣圈交易所發行的加密貨幣,通常具有抵扣交易手續費、享受分紅等權利,有些交易所還會定期回購自己發行的平台幣。目前市面上主要的平台幣有幣安發行的 BNB,火幣發行的 HT、OKex發行的 OKB、暢思發行的 CET 等。五花肉發現,論區塊鏈思維,中國人是貫徹最好的,發行平台幣的多是具有中國背景的交易所。反觀非中國的交易所,更偏向於傳統融資。比如美國的 Coinbase,估值 80 億美金。韓國 TOP2 交易所 Bithumb 2018 年 10 月剛以 3.5 億美元的價格將 50% 股權出售給新加坡財團,整體估值約為 7 億美金。
我們來對比下傳統金融交易所和幣圈交易所。
從盈利能力和交易額來說,幣圈交易所完全可以和傳統金融交易所媲美。但是估值卻遠不如傳統交易所,傳統交易所 PE在 20-30 區間,PV 在 0.07-0.1 區間,均為幣圈交易所的 10 倍左右。幣圈交易所的 PE 平均為 2-3,PV 平均為 0.005-0.007。所以按照傳統估值理論,幣圈平台的估值可以說是很低、很值得投資了。許多專家說 A 股處於估值的底部,它目前 PE 約為 12.94。而幣圈的優秀企業的 PE 僅為 2 至 3。
值得注意的是,Coinbase 的估值走在了眾兄弟的前面,Coinbase 作為最官方的幣圈交易所,與傳統金融聯系也最為密切,所以估值最符合傳統金融理論的定價。嗯,當中我選擇了暢思交易所作為反面典型,無論是 PE、PV 都是極度高估的。
*數據來源於網路。
**傳統證券交易所數據為2017年,市值為2018年10月13日寫稿實時價格。
***幣圈交易所交易額以近期每日交易額估算。幣安/火幣/OK/暢思年利潤以回購或分紅的金額估算。Coinbase 及Bithumb年利潤以0.0025的利潤交易額比(EV)推算。
幣圈交易所的低估值可能由於未來極大的不確定性。由於各國監管政策不明,非國家背書或許可的幣圈交易所能否長期存在,尚存疑問。如果這幾家幣圈交易所得到國家的支持,估值一定會與傳統交易所持平。另一方面,區塊鏈技術及投資市場的不確定,也極大影響著估值。如果今後加密貨幣投資能成為與股票一樣的投資選擇,那估值也會顯著提升。
如果你相信區塊鏈的未來,平台幣就是幣圈投資比較放心而且收益頗豐的投資選擇了,長遠來看,可能會有10倍的收益。
『肆』 關於以太坊ETH合並的錯誤觀點理清
隨著合並的臨近,越來越多的文章在向人們發出信號:它確實快要臨近了。這也帶來了和 PoS 相關的一系列問題的討論,人們在反復討論著同樣的話題和同樣的誤解。在上周 Kiln 測試網成功合並時,我已經在一定程度上看到了這一狀況,今後我們還會看到更多類似的東西,所以我將一些常見的問題、觀點歸納如下。
每當看到有人提出這些觀點時,我就可以把這篇文章分享給他,我希望大家也可以這樣做。如果本文存在一些紕漏,還望斧正或提出補充建議。
什麼是合並?
更多的信息可以在 ethmerge.com 上找到,所以本部分將簡單介紹。
在合並之後,Ethereum 將採取 PoS(股權證明)而不是 PoW(工作量證明)共識。合並並非「ETH 2.0」、也不存在「ETH 2.0」,這已經是一個過時的術語。
如果是 ETH 持有者,則不需要做任何事情。合並後你仍將持有相同數量的 ETH,沒有「ETH2 幣」,也不需要進行任何遷移。一切都完全相同,只有共識機制發生了變化。
之所以被稱為「合並」,是因為 ETH 將信標鏈(共識層)與現存的鏈(執行層)合並,並拋棄了執行層的 PoW 部分。
解釋一下,「共識」只是一個花哨的詞彙,其含義是指如何對交易進行排序並保證安全性。PoW 和 PoS 都是實現共識的不同手段。
PoW:"打亂區塊順序的成本太高了,因為按規則辦事更劃算。"
PoS:「擾亂區塊順序的成本太高了,因為如果我這樣做就會失去我抵押的所有錢。」
由於只是共識機制的改變,PoS 本身並不會大幅降低 Gas 費用。
為什麼合並?
降低安全成本,因為達成共識所需的能源更少。
對於 PoW 來說,收益需要為礦工使用的所有硬體和能源買單,否則將無人再去挖礦。這就需要大量發行並迅速賣出 Ethereum 以換取法幣來支付賬單。
而 PoS 則不然,PoS 只需要支付給投機者一些收益,讓人們願意存入資本,而不是直接投資到其他地方。除了一台普通的電腦和互聯網連接之外,並不需要支付大額賬單。所以收益率只需要反映所涉及的機會成本和風險。
更具可持續性。
一條鏈的安全性基本上與它的市值成正比。無論是 PoW(更高價值的 Token 獎勵 = 更有理由按規則行事 = 更多的礦工 = 更難以破壞共識)或 PoS(更高價值的抵押 Token = 更有理由按規則行事以避免失去抵押品)都是如此。
新發行的 Token 本質上是將價值從所有持幣人身上轉移走,並重新分配給特定的人。在其他條件相同的情況下,將這些 Token 賣出可以從網路中提取價值。
這為未來的許多擴容解決方案打開了大門:數據分片、無狀態、輕客戶端等等。
通過分離執行層和共識層,這將有助於降低未來的代碼復雜性。
安撫環境和 游戲 玩家當然是一個積極的副作用,但這並非是切換到 PoS 的主因。切換更多是由於外部因素導致的,Ethereum 作為一個協議並沒有對整個網路太多的控制權,例如能源生產、GPU 供應鏈等等。
何時合並?
目前官方尚未公布日期。綜合各方面的原因,開發者和社區對 6 月中旬合並持謹慎樂觀的態度
目前仍在測試之中,在開發人員完全確信不會出現錯誤之前,不會進行合並。
我個人不把希望寄託在 6 月,但我認為至少也會在夏季完成,除非在測試過程中出了極大的問題。例如,出現一個需要幾周時間來修復的關鍵錯誤,或者規範本身存在需要幾個月時間來修復的漏洞。
難度炸彈被設置在 6 月,所以無論屆時是否進行合並,都將進行一次硬分叉。
建議將 wenmerge. com 存入書簽,以便快速查看測試網合並的最新預估。
流傳已久的錯誤觀點
觀點:「你這個白痴!開發團隊會像過去一樣拖延,早在數年前他們就應允合並了,但至今仍未兌現。」
首先是一些說明:現在仍未宣布正式的合並日期,此前也從來宣布過。一個本就不存在的最後期限,何來的拖延之說呢?
類似於「將在 2018 年轉換為 PoS」的說法來自於極端樂觀的態度,並且低估了 PoS 設計的復雜性和從 PoW 到 PoS 的安全過渡的復雜性。此前開發者所做的工作相當於部分完成了 Casper FFG 規范(一個混合 PoW 和 PoS 的機制),但它最終被廢止了。現狀已經存在很多不同了:
經過多年的研究、對潛在的攻擊方向進行分析,現在擁有一個完整的協議規范。
客戶端已經實現,現在只差測試尚未進行。
合並時所有人都在工作,除了合並外沒有其他工作。合並所需的必要步驟都已完成。這甚至不是「他們已經完成了像 EIP1559 這樣復雜的內容,所以現在可以把更多的注意力集中在合並上」,而是:「他們把所有的注意力都集中在合並上」。不可能會出現這種狀況:因為開發者需從事其他內容的工作而導致合並再次被推遲。在合並完成之前,他們沒有其他事情可以做。
自 2020 年 12 月以來,PoS 實際上正在以信標鏈的形式運行。這意味著以太坊的 PoS 已經在生產環境中進行了一年多的測試(在一定程度上),目前有超過 1000 萬 ETH 在運行。它只是還沒有為執行層生產區塊而已。
觀點:「數以百萬計的質押 ETH 將在解鎖的那一刻崩盤。」
可以肯定的是,會有大量的鎖倉者想要最終獲利,尤其是那些在 32 個 ETH 僅價值 1 萬美元時就鎖定了 ETH 的人。但從一角度來看,還有很多需要考慮的問題。
合並並不會解鎖任何 ETH。解鎖將在合並後的第一次硬分叉中進行,可能是 6-8 個月後。這意味著數個月內都將沒有 PoW 方式增發的 ETH(約 13000 ETH/天)被拋售,也沒有 PoS 增發的 ETH 進入流通。
就像存 ETH 要排隊一樣,取 ETH 也要排隊。假設發生大規模拋售事件,每個人都將處於排隊之中,以每天 1125 名的速度依次解鎖。所以不存在 "開閘放水 "的時刻。每個人解凍都需要一年多的時間,一年的時間里,每天有約 38000 個 ETH 進入流通領域(大約是日均量的 1%)。
合並後,驗證者也將開始收到費用獎勵,有預估表明收益率或將翻倍。現在有成千上萬的人在排隊等待進入質押。他們既然可以接受 5% 的 ETH 收益率,我不認為他們會在收益率變成 10% 的時候放棄存入。
到目前為止,抵押所涉及的最大風險是合並本身。一些災難性的事情可能會導致合並出錯,盡管存在這種風險、盡管 ETH 被鎖定到一個未知的未來日期,但人們已經鎖定他們的 ETH 一年多了。有多少人或機構還願意袖手旁觀、等待這種風險消失後再進入呢?
抵押者退出就意味著更少的驗證者,這意味著對不退出的抵押者有更高的獎勵。這也意味著更能激勵其他之前未投資的人開始投資......
當然,這是加密世界,讓加密歸於加密。合並將帶來興奮和波動,可能會出現「sell the news」的跌幅,誰又知道呢?我不會假裝預知未來,但在我看來,更多的 ETH 可能會流入、而不是流出鎖倉。
觀點:「如果 PoS 這么好,Ethereum 為什麼不從一開始就這樣做呢?」
PoW 很容易概念化並實現,PoS 則不然。當我們回到 2014 年,PoS 尚是一個仍在研究的理論概念,只有一些區塊鏈實施了它的某種特定版本。
在考慮實施 PoS 之前,需要從研究角度解決一些基本問題。
沒有放之四海而皆準的 PoS。每個 PoS 區塊鏈都有自己的 PoS 規范,在各方面都有優缺點,所以這並非是「這個鏈做到了,為什麼 Ethereum 不能做同樣的事情」這樣簡單。
以一個 PoW 鏈作為開始,讓任何人都可以在無需許可的條件下開采 crypto,這讓 crypto 的分發機制比那些最初就是 PoS 的鏈要好得多。因為那些鏈從最初就是 PoS,這樣必須決定如何分配初始 crypto,而不是無需許可的分發 Crypto。
Ethereum 存在預挖、預售,但經過多年的換手,現在已經稀釋到一半左右,使其分布更接近 BTC 的分布。所以在 2022 年,當 ETH 作為流動性極強且易於獲得的資產時,這並不是什麼大問題。
觀點:「這實際上只是在多年努力後最後一次坑害礦工的伎倆。」
從第一天起,PoS 就是最終的目標,每個人在挖礦時都知道它早晚有一天會結束。這里並沒有什麼不公正的事情發生。
經濟因素勝過任何形式的礦工對鏈的忠誠度。你可以把一條鏈看作是一個企業,把礦工看作是雇員。
礦工/雇員已經為他們提供的服務(即安全共識)獲得了區塊獎勵。工資由僱主支出,它來自於稀釋現有持幣者的價值。
礦工流向提供獎勵最高的鏈,如果有另一個可由 GPU 開採的 crypto 可以提供更多的獎勵,大多數礦工會立即拋棄 Ethereum。
類似地,如果驗證者能夠以更低的價格完成它所需要的服務,那麼 Ethereum 將支付更少的費用。
這並不完全是排他性的。礦工也可以 ETH 的持有者,以及區塊鏈的使用者。沒有什麼能阻止他們成為抵押者並獲取抵押獎勵。
觀點:「如果挖礦沒有花費現實世界的能源,則這枚 crypto 就不再具有內在價值。」
我不太相信這種說法。反復計算哈希值直到找到一個符合任意要求的哈希值,這並沒有什麼神奇之處。我的意思是,PoW 的區塊鏈其工作是通過解密來完成的,但這並不意味著解密本身就能為世界帶來價值。提高一個 Crypto 的挖礦難度並不會神奇地讓每個人都變得更富有,它只會讓挖礦的利潤降低(當然,如果對這種 Crypto 的需求量也上升則不然)。
在我看來,一個幣的價值最終來自於供給和需求,而需求來自於區塊空間的價值。無論 ETH 是由礦工還是鎖倉者生產的,人們都需要 ETH 來購買區塊空間。當然,礦工越多,安全性/去中心化程度越高,這進一步增加了區塊空間的價值主張,這是一個正反饋循環,但反饋循環也存在於 PoS 的 Ethereum 中,它也同樣酷。
觀點:「PoS 是中心化的不二法門。」
PoS 與 PoW 基本相同,但又存在差異。「更好」或「更壞」只取決於你的看法。在我看來,PoW 實際上只是 PoS 的額外步驟。
Ethereum 作為一個社區高度重視去中心化,任何潛在的中心化趨勢都會被研究團隊注意到並提出緩解的方法,即使是以其他重要的東西為代價,就比如可擴展性(保持低 Gas 限制以便更多的節點可以參與其中,即使這會導致擁堵和高費用)。
盡管目前存在一些缺點,但去中心化是一個緩慢的過程,我們還沒有到那一步。目前有許多中心化的拐杖從長遠來看是需要消失的。我個人認為,想出一大堆東西來解決某個問題比「放棄並說因為某問題而不能做」要吸引人得多。
Ethereum 的 PoS 有一些有趣的設計經常被忽視。單個驗證器癱瘓、搗亂或直接攻擊網路都不會受到很嚴重的懲罰。而一千個驗證器同時這樣做則會受到更嚴重的懲罰。
這意味著,如果你是一個擁有數千個驗證者的大型企業,為了你自己的利益,應該把它們去中心化,避免使用雲主機、使用不同的客戶端等等。當然,資本仍然是集中的,但至少故障點是去中心化的,這對網路的整體 健康 是有利的。
與依靠中心化攤銷成本的大型礦業相比,通過能源更容易發現 PoW 挖礦並被當局關停。在全世界范圍內移動采礦設備是很難的,但鎖倉則不需要,不需要消費級設備以外的任何額外硬體。
觀點:「PoS 實際上就是『越有錢賺得越多』。」
是的。不幸的是,我們生活在一個財富高度不平等的世界。blockchain 並不能解決這個問題。
可這也是 PoW 的真實情況。誰有錢誰就可以買更多的礦機、賺更多的錢。在礦業,投資回報率也在隨著規模經濟的發展而變得更好。集中式的采礦作業可以獲得更好的硬體折扣、並搬到電力便宜的地方。獨立小礦工在現實中根本無法與之競爭。有了 PoS,每個人都能按比例獲得相同的收益,無論他們的股份是 10 美元還是 1000 萬美元。
它可能是中心化,但那些大的采礦業務沒有理由攻擊網路並削弱它,因為他們在基礎設施上投入了數百萬美元。所以……或許你對大型中心化主體的存在沒有意見,只是對他們在網路中存在巨大利益而不滿?
觀點:「存款被動產生利息,這是在無中生有地印錢?這簡直就是中央銀行和法幣的翻版!」
驗證者仍在進行著「工作」:創建區塊和驗證其他區塊。只是這些工作完全由 blockchain 達成共識所需的實際有用的工作組成,而不是一遍又一遍地計算哈希值。
這並不是真正的 "憑空印出的免費的錢",這些資金仍然有成本,它們只是比能源賬單更抽象、更不直觀而已。他主要存在於下面幾個成本:
機會成本:如果另一項投資能給你帶來更好的收益,為什麼還要賭?
流動性差:從你存款的那一刻起資金就被鎖定了。你需要排隊等待你的驗證器激活,而當你取款時,又要排隊才能取回。
固有風險:這仍然是一個相當新事物,可能會出現問題:一個關鍵錯誤、網路被攻擊、你的抵押物受損等等。
波動性:這仍然是一種不穩定的資產,如果你以本國法幣計價,那麼使用一種可能一夜之間下跌 30% 的資產來獲取 5% 的收益率並不是那麼好。
維護:驗證者需要維護驗證器、更新軟體等,以此來確保 100% 的正常運行時間。
這就是它有趣的地方:越多的鎖倉者、每人的獎勵就越低。這也意味著所有成本都將交由市場本身定價。如果質押收益率太低,那麼獎勵就不能證明成本的合理性,人們就會撤出並投資於其他地方,這一舉動會使收益率回升。同樣,如果收益率太高,也會吸引更多的資本使收益回落。
就通貨膨脹而言。假設市場認為 5% 是理想的收益率,其中 3% 來自增發。這樣算下來,每年大約有 3000 萬個 ETH 被抵押,將發行 90 萬個新 ETH。在總供應量為 1.2 億 ETH 的情況下,通貨膨脹率為 0.75%。只要 Gas 費用高於 23gwei,EIP1559 燃燒的 ETH 就將超過這一數量。我要強調的是,Ethereum 很快就會成為一種帶有收益的通縮資產。
「ETH 一直沒有供應上限,且他們一直在改變貨幣政策。」
多年來,Ethereum 的目標一直是「確保網路安全的最低可行發行量」,將網路安全置於控制供應上限之上。對貨幣政策的任何更新都沒有增加供應通貨膨脹。從第一天起低通脹率就一直是目標。
一旦 EIP1559 的燃燒率與發行率相匹配,就會有一個作為有效供應上限的平衡點——再次由市場力量決定對 Ethereum 區塊空間的估值。
並不存在一個 "Ethereum 中央銀行 "任意調整利率並向親信印鈔。市場本身決定了有多少通貨膨脹/通貨緊縮,並不存在一個可以像中央銀行控製法幣通貨膨脹率那樣的實體控制 Ethereum。
觀點:「巨鯨有足夠的錢來接管和改變 游戲 規則,並打擊誠實的鎖倉者。」
不,Ethereum 沒有任何形式的鏈上治理。
協議更新是社區的努力(Layer 0),你不需要鎖倉 ETH 來提出不良的提案、參與協議更新。
這一過程與 PoW 完全相同。即使你擁有 99% 的算力,你也不能在沒有私鑰的情況下進行無效的交易、竊取他人資產、改變協議規則,或者除了重組區塊之外真的做些什麼。1% 的誠實節點將拒絕任何不遵守規則的區塊,你將在一個無效的/無用的鏈上挖礦。現在把「哈希算力/挖礦」換成「質押金額/鎖倉」,PoS 也是如此。不過不同的是,被發現重組區塊的人將被銷毀他們的整個權益,而鏈不能完全摧毀采礦機。
簡單地說,這涉及到大量的 ETH。在合並之前高達 1000 萬計數的 ETH,約合 300 億美元。鎖倉的 ETH 數額和 ETH 的價值預計都會上升,所以攻擊變得越來越不可能,因為做一次攻擊所涉及的經濟成本太高了。而且如果攻擊來自外部行為者,他能夠獲得這么多 ETH 就是很荒謬的,你在哪裡能買到 1000 萬 ETH 來擁有 51% 的股份?
觀點:「32 個 ETH 太多了,普通人沒有這么多錢。」
我同意這是一個很大的問題。之所以有這么高的數字,是因為它必須落在一個技術的平衡點上:它必須低到有充足的驗證者來保證鏈的安全,但又要高到避免驗證者太多以使鏈的開銷膨脹。
從技術角度來看,有一大問題涉及到 32ETH,當時 32ETH 價值約 7000 美元。2017 年的早期曾有人甚至建議最低超過 1000ETH。
值得慶幸的是,就像礦池的存在一樣,也有鎖倉池,允許用戶以小金額參與鎖倉。這歸功於像 RocketPool、Secret Shared Validators 這些使用智能合約的無許可、去中心化的非託管協議。而且由於上面提到的二次懲罰,我相信從長遠來看,去中心化的鎖倉操作會比中心化的要好。像 Rocket Pool 這樣的協議最好被看作是基礎鎖倉的高級抽象,而不是 "只是一個鎖倉池"。
觀點:「PoS 還沒有被證明,而我們知道 PoW 是有效的。」
這實際上是完全公正,顯然我們無法真正的反駁這一點,只有時間會證明。只是我認為在 Ethereum 正在轉向 PoS 的背景下,這是無關的。如果你不相信它,就不要參與/投資它。我個人相信一個長期可持續的 PoS Ethereum,但即使如此,我也樂於見到 bitcoin 繼續沿用它的 PoW。
這都是我們一生中偉大的 crypto 實驗的一部分。PoS Ethereum 要麼只是一陣風,失敗直至默默無聞,要麼將成功地創造出能夠超越人類的怪物般的強大網路。
我在 bitcoin 和 Ethereum 中看到,為了實現這一目標,優先考慮去中心化是關鍵。盡管兩者的理念大不相同,但我很高興能同時擁有這兩種東西,以真正看到長期的價值。
『伍』 以太坊基金會:ETH將在未來幾個月轉向PoS 能源消耗至少減少99.95%
長話短說:以太坊在合並完成後的能源消耗至少能減少99.95%。
以太坊將在接下里的幾個月完成向權益證明(PoS)共識機制的過渡,這帶來了無數種已被理論化的改進。但既然信標鏈( Beacon chain)已經運行了幾個月的時間,我們實際上就可以深入研究具體的數字了。我們很高興 探索 的一個領域涉及新的能源使用估算,因為我們將結束在共識上花費一個國家所耗能源價值的過程。
截至目前,還沒有任何關於能源消耗(甚至使用什麼硬體)的具體統計數據,因此下面是對以太坊未來能源消耗的粗略估算。
由於很多人都在運行多個驗證器,因此我決定使用可存款的獨立地址的數量,來作為今天有多少台伺服器的代理數。很多質押者可以使用多個 ETH 1.0地址,但這在很大程度上抵消了那些冗餘設置。
在撰寫本文時,有來自16405個獨立地址的140592個驗證器。顯然,這是由於交易所和staking質押服務造成的偏差,因此移除它們會導致有87,897個驗證器被假定是在家裡質押的。作為一個健全的檢查,這意味著平均每個家庭質押者運行了5.4個驗證器,這對我來說似乎是一個合理的估計值。
能源要求
運行一個信標節點(BN)、5.4個驗證器客戶端(VC)以及一個以太坊1.0全節點需要多少能量?以我的個人設置為基礎,大約是15瓦。Joe Clapis(Rocket Pool開發者)最近運行了10個驗證器客戶端(VC),1個Nimbus信標節點(BN)以及1個10Ah USB電池組的Geth全節點,然後運行了10個小時,這意味著這個設置平均為5瓦。而一般的投資人不太可能運行這樣的優化設置,所以我們取100 瓦作為參考數。
將其與之前的87000個驗證器相乘,就意味著家庭質押者的消耗電量約為1.64兆瓦。估計託管質押者所消耗的能源會更多一些,他們運行了成千上萬個具有冗餘和備份的驗證器客戶端。
為了簡化計算,我們還假設他們每5.5個驗證器使用100瓦。基於我所接觸過的基礎設施團隊,這是一個粗略的高估值。真正的答案要少50倍左右(如果你是一個質押託管團隊,並且每個驗證器消耗電量超過5瓦,我相信我可以為你提供幫助)。
因此,總的來說,採用權益證明(PoS)的以太坊網路會消耗大約2.62兆瓦的電量。這不是一個國家的用電規模,也不是省甚至城市的用電規模,而大約是一個小鎮(約2100個美國家庭)的用電規模。
作為參考,當前工作量證明(PoW)以太坊網路所消耗的能量相當於一個中等國家的能源,但這實際上是保持PoW鏈安全所必需的。顧名思義,PoW達成共識的基礎是哪個分叉在這方面做的「工作」最多。有兩種方法可以提高「工作」完成率,一是提高挖掘硬體的效率,二是同時使用更多的硬體。為了防止區塊鏈被成功攻擊,礦工必須比攻擊者更快的速度「工作」。由於攻擊者很可能擁有類似的硬體,礦工必須保持大量高效的硬體運行,以防攻擊者挖出它們,所有這些硬體都會消耗大量的能量。
在PoW共識機制下, ETH 價格與算力正相關。因此,隨著價格的上漲,在均衡狀態下,網路消耗的電力也會隨之增加。而在PoS共識機制下,當 ETH 價格上漲時,網路的安全性也會提高( ETH 的價值更高),但對能源的需求保持不變。
一些比較
據數字經濟學者估計 ,以太坊礦工目前每年要消耗44.49太瓦時的電量,這意味著,根據上述保守估計,PoS的能效提高了約2000倍,這反映了總能源使用量至少減少了99.95%。
如果每筆交易的能耗高於你的速度,則約為35Wh/tx(平均約60K gas/tx)或TV約20分鍾的耗電量。相比之下,以太坊PoW每筆交易使用相當於一棟房子2.8天的能量,比特幣的每筆交易則消耗相當於一棟房子38天的能量。
展望未來
盡管以太坊目前仍在使用PoW共識機制,但這種情況不會持續太久。在過去的幾周里,我們看到了第一批用於合並的測試網的出現(註:The Merge合並是以太坊從PoW切換到PoS時的名稱)。幾個工程師團隊正在加班加點地工作,以確保合並盡快到來,同時又不影響安全性。
擴容解決方案(例如rollup和分片)將通過利用規模化經濟來幫助進一步減少每次交易消耗的能量。
以太坊網路超級耗電的日子屈指可數了,我希望這個行業的其他部分也是如此。
『陸』 5月6日灰度持倉報告是多少
截至5月6日灰度持倉數據為:
btc——總計持有:653346btc,24H持倉變化: -35.3109btc,灰度持倉佔比: 3.11%
ltc——總計持有:1502940ltc,24H持倉變化: +63.3060ltc,灰度持倉佔比: 1.79%
eth——總計持有:3166155eth,24H持倉變化: -216.8008eth,灰度持倉佔比: 2.74%
bch——總計持有:293523bch,24H持倉變化: +5.7435bch,灰度持倉佔比: 1.40%
etc——總計持有:12398072etc,24H持倉變化: -1019.0985etc,灰度持倉佔比: 5.88%
鏈喬教育在線旗下學碩創新區塊鏈技術工作站是中國教育部學校規劃建設發展中心開展的「智慧學習工場2020-學碩創新工作站 」唯一獲準的「區塊鏈技術專業」試點工作站。專業站立足為學生提供多樣化成長路徑,推進專業學位研究生產學研結合培養模式改革,構建應用型、復合型人才培養體系。
『柒』 weth是什麼幣
WETH是一種符合ERC-20標准以太坊代幣。
拓展資料:
1、 含義
與以太坊網路的原生代幣以太幣(ETH)可以進行互換,可以將1ETH兌換為1WETH,同時也可以將1WETH兌換回1ETH,兌換是基於智能合約完成的。 Golff支持使用WETH挖GOF,所以用戶需要提前准備好WETH。
2、 為什麼要發行WBTC ?
(1)我們知道,比特幣無法直接在以太坊網路使用,而比特幣市值長期佔比超過50%,如果這部分資金長期閑置,實際上是一種資源浪費,資金的機會成本也不低。即使按照比特幣市值的5%計算,可利用的資金高達100億美元,將這部分資金轉移到以太坊網路進行借貸,按照保守6%的年化計算,凈利潤便是6億美元。以太坊擁有最好的生態,比特幣占據了大量的資金,二者如果能結合起來,可以產生巨大的效益。隨著今年以太坊Defi挖礦的走紅,WBTC 逐漸浮出水面。
(2)WBTC 全稱 Wrapped BTC,字面意思為「有包裝的比特幣」,是基於以太坊、與比特幣掛鉤的 ERC-20 代幣。由 BitGo、Kyber Network 與 Ren 等區塊鏈項目聯合推出,於2019年1月正式上線。該代幣在以太坊上發行,實現與比特幣 1:1 錨定,是ERC-20版本的比特幣,也是BTC的第一個ERC-20版本,目的在於使BTC流動性進入以太坊生態系統。
(3)WBTC採用的是一種託管式解決方案,其中託管者聯盟將真正的BTC鎖定並發行相應的WBTC代幣。只能由具備完整KYC/AML資格的注冊商戶發起WBTC。其治理通過DAO進行,BTC託管是通過多簽合約來保證。
3、為什麼說比特幣的上漲與WBTC密切相關呢?
(1)流動性挖礦效應刺激WBTC需求增加,WBTC進一步導致比特幣需求上漲,從而推動二級市場比特幣購買效應增強,導致比特幣價格上漲。
(2)因此,本輪比特幣價格可以從3800美元反彈至目前15600美元附近,不僅與灰度基金、微策略等國外機構大舉購買有關,WBTC也功不可沒。
(3)目前,WBTC不僅可以在幣安這類中心化交易所購買,也可以在Uniswap、Balancer這類去中心化交易所購買。
『捌』 以太坊設備壽命
以太坊2.0其實包含的內容非常多,例如分片、擴容等,合並只是其中一項內容,自去年2.0信標鏈啟動開始,我們已經處在PoW和PoS雙鏈運行底下,合並是要徹底結束PoW顯卡挖礦,全部爆塊都用PoS共識來打包,合並後並不代表以太坊2.0就完成,至少還有2-3年時間增加其他功能。
合並這項內容牽涉面廣,利益巨大,時間點非常非常非常關鍵,尤其對礦工而言,那是生死攸關,天天看著這個合並時間點來考慮是否加卡。坦白講,礦工根本不關心什麼分片、擴容,Layer2,Rollup等功能,他們只關心什麼時候正式合並,什麼時候結束挖礦。
已參與ETH2.0信標鏈質押的希望合並越快越好,因為他們需要在合並後的第一次硬分叉才能解除質押,而礦工們持有顯卡,希望合並越晚越好(最好別合並),把顯卡能耐發揮到極致。
兩個月前的消息是,合並提前了,並且在合並前,不再有新的EIP功能修訂升級,ETH團隊所有人員集中全力優先處理合並事宜,合並提案EIP-3675也在8月中由研究員Mikhail正式立案,這標志著合並真的真的真的要進入倒計時了,可惜仍然沒有具體日期,只有概率。啥玩意
總結:
隨著以太坊總市值以及生態膨脹到今天這個體量,船大難掉頭,任何一個小錯誤,都會引起巨大震盪:礦工手上有顯卡,機構手上有幣,DeFi生態里有TVL,有多少礦池靠ETH吃飯,有多少炒賣顯卡為生的代理商......
如果在這個過程中,平衡不好各方的利益,那麼整個網路可能會被凍結,甚至崩潰。我認為以太坊團隊在公布合並時間點這件事上太兒戲了,不把礦工的礦機當回事,幾個月前開發員Trend說保守估計年底前合並,現在看來又要跳票,官方還有什麼可信度?要防止跳票很難嗎:至少提前一年,對外公告「准確的合並日期」,以及合並步驟和詳情。如果沒在測試網通過就不要亂發布各種合並消息,尤其是開發人員。我現在啥都不想看,就等12月的炸彈 pushback 究竟要延到明年幾月。到時再來寫一篇《如何處理手上的礦機》吧,拭目以待。
『玖』 灰度是什麼公司
2014年,SecondMarket公司創始人BarrySilbert將這只比特幣投資基金從原公司中脫離出來,成立了灰度投資公司(GrayscaleInvestments)。
2015年,灰度投資公司被歸並到新成立的數字貨幣集團(DigitalCurrencyGroup,簡稱DCG)旗下。DCG不僅僅專注於數字貨幣和區塊鏈的投資,同時也是一個初創企業的孵化器。DCG旗下除了灰度投資公司外,還有加密貨幣場外交易經紀商Genesis、區塊鏈新聞資訊網站CoinDesk兩家子公司,以及投資的150多個其他區塊鏈公司/項目。
經過多年的發展,灰度投資公司已經成為全球最大的加密貨幣資產管理公司,旗下的加密貨幣信託規模已經達到25.8億美元。
(9)灰度eth估值方法擴展閱讀:
2013年,創始人BarrySilbert說服了SecondMarket公司的董事會,拿出一部分資金成立了名為BitcoinInvestmentTrust的比特幣投資基金,這只基金就是灰度投資公司比特幣信託(GrayscaleBitcoinTrust)的前身。直到2017年9月,灰度投資公司的比特幣信託基金才開始出現爆發式增長。
它已經成為全球最大的比特幣投資信託基金,擁有的比特幣數量超過40.85萬枚,將近比特幣總量的2%。除了比特幣信託基金,灰度投資公司還推出了BCH、ETH、ETC、Horizen、LTC、XLM、XRP、ZEC的信託基金,以及包含主流幣種的復合型加密貨幣信託基金(GrayscaleDigitalLargeCapFund)。灰度投資公司的加密貨幣信託產品,為機構用戶購買加密貨幣提供了便利。