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