github.com/reapchain/go-reapchain@v0.2.15-0.20210609012950-9735c110c705/qmanager/quantum/qrnd.go (about)

     1  package quantum
     2  
     3  import (
     4  	"github.com/ethereum/go-ethereum/log"
     5  	"github.com/ethereum/go-ethereum/qmanager/global"
     6  	"os"
     7  	"syscall"
     8  	"time"
     9  )
    10  
    11  
    12  const bufferSize = 16384 *3
    13  
    14  func GenerateQRNGData() ([]byte, error)  {
    15  	var ioldIndex byte
    16  	var Qrngdata []byte
    17  	for {
    18  		buffer, err := readUpFile()   //buffer data type is slice []byte
    19  		if err == nil{
    20  
    21  			if len(buffer) == 0 {
    22  				writeErr := writeDnFile(0)
    23  				if writeErr == nil {
    24  					time.Sleep(1 * time.Second)
    25  				}else{
    26  					return nil, writeErr
    27  				}
    28  			} else if buffer[0] == ioldIndex {
    29  				writeErr := writeDnFile(buffer[0])
    30  				if writeErr == nil {
    31  					time.Sleep(1 * time.Second)
    32  				}else{
    33  					return nil, writeErr
    34  				}
    35  			} else {
    36  				ioldIndex = buffer[0]
    37  				if len(buffer) > 0 {
    38  					writeErr := writeDnFile(buffer[0])
    39  					if writeErr == nil {
    40  						Qrngdata = buffer
    41  					}else{
    42  						return nil, writeErr
    43  					}
    44  				} else {
    45  					time.Sleep(1 * time.Second)
    46  				}
    47  				break
    48  			}
    49  		} else{
    50  			return nil, err
    51  		}
    52  
    53  	}
    54  	return Qrngdata, nil
    55  }
    56  
    57  func readUpFile() ([]byte, error)  {
    58  	buffer := make([]byte, bufferSize)
    59  
    60  	flags := os.O_RDONLY | os.O_EXCL  | syscall.O_DIRECT
    61  	upFile, err := os.OpenFile(global.QRNGFilePrefix+"up.ini", flags, 0644)
    62  	if err != nil {
    63  		log.Error("QRNG Device", "Open Error", err.Error())
    64  		return nil, err
    65  	}
    66  	_, err = upFile.ReadAt(buffer, 0)
    67  	if err != nil {
    68  		log.Error("QRNG Device", "Read Error", err.Error())
    69  		return nil, err
    70  	}
    71  	upFile.Close()
    72  
    73  	return buffer, nil
    74  }
    75  
    76  func writeDnFile(data byte) error {
    77   	os.Remove(global.QRNGFilePrefix + "dn.ini")
    78  	dnFile, err := os.OpenFile(global.QRNGFilePrefix+"dn.ini", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644)
    79  	if err != nil {
    80  		log.Error("QRNG Device", "Create Error", err.Error())
    81  		return err
    82  	}
    83  	writtenSize, err := dnFile.WriteAt([]byte{data}, 0)
    84  	if err != nil || writtenSize == 0 {
    85  		log.Error("QRNG Device", "Write Error", err.Error())
    86  		return err
    87  	}
    88  	dnFile.Close()
    89  	return nil
    90  }
    91