| 
<?phpdeclare(strict_types=1);
 namespace ParagonIE\Blakechain;
 
 use ParagonIE_Sodium_Compat as SodiumCompat;
 use ParagonIE\ConstantTime\Base64UrlSafe;
 
 /**
 * Class Node
 * @package ParagonIE\Blakechain
 */
 class Node
 {
 /**
 * @var string
 */
 protected $prevHash = '';
 
 /**
 * @var string
 */
 protected $data = '';
 
 /**
 * @var string
 */
 protected $hash = '';
 
 /**
 * Node constructor.
 *
 * @param string $data
 * @param string $prevHash
 */
 public function __construct(string $data, string $prevHash = '')
 {
 $this->data = $data;
 $this->prevHash = $prevHash;
 }
 
 /**
 * @param bool $rawBinary
 * @return string
 */
 public function getPrevHash(bool $rawBinary = false): string
 {
 if ($rawBinary) {
 return $this->prevHash;
 }
 return Base64UrlSafe::encode($this->prevHash);
 }
 
 /**
 * @param bool $rawBinary
 * @return string
 *
 * @throws \SodiumException
 */
 public function getHash(bool $rawBinary = false): string
 {
 if (empty($this->hash)) {
 $this->hash = SodiumCompat::crypto_generichash(
 $this->data,
 $this->prevHash,
 Blakechain::HASH_SIZE
 );
 }
 if ($rawBinary) {
 return $this->hash;
 }
 return Base64UrlSafe::encode($this->hash);
 }
 
 /**
 * @return string
 */
 public function getData(): string
 {
 return $this->data;
 }
 
 /**
 * @param string $prevHash
 * @return self
 */
 public function setPrevHash(string $prevHash): self
 {
 $this->prevHash = $prevHash;
 $this->hash = '';
 return $this;
 }
 }
 
 |